WSF
WsfObserverSubjectList.hpp
Go to the documentation of this file.
1// ****************************************************************************
2// CUI
3//
4// The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
5//
6// Copyright 2003-2015 The Boeing Company. All rights reserved.
7//
8// The use, dissemination or disclosure of data in this file is subject to
9// limitation or restriction. See accompanying README and LICENSE for details.
10// ****************************************************************************
11
12#ifndef WSFOBSERVERSUBJECTLIST_HPP
13#define WSFOBSERVERSUBJECTLIST_HPP
14#include <algorithm>
15#include <cassert>
16#include <vector>
17
20template<typename OBSERVER, typename SUBJECT>
22{
23public:
24 typedef std::vector<SUBJECT*> SubjectList;
25
27 : mObserverPtr(0)
28 {
29 }
30
32
33 void Attach(OBSERVER* aObserver, SUBJECT* aSubject)
34 {
35 // only supports one observer per subject list
36 assert(mObserverPtr == 0 || mObserverPtr == aObserver);
37 mObserverPtr = aObserver;
38
39 aSubject->AttachObserver(aObserver);
40
41 typename SubjectList::iterator i = std::find(mObservedSubjects.begin(), mObservedSubjects.end(), aSubject);
42 if (i == mObservedSubjects.end())
43 {
44 mObservedSubjects.push_back(aSubject);
45 }
46 }
47
48 bool IsAttached(SUBJECT* aSubject) const
49 {
50 return std::find(mObservedSubjects.begin(), mObservedSubjects.end(), aSubject) != mObservedSubjects.end();
51 }
52
53 void Detatch(SUBJECT* aSubjectPtr)
54 {
55 // Expect call to Attach first
56 assert(mObserverPtr != 0);
57 if (Remove(aSubjectPtr))
58 {
59 aSubjectPtr->DetatchObserver(mObserverPtr);
60 }
61 }
62
63 // Remove a subject without detaching. To be used when the subject is being or has been deleted.
64 bool Remove(SUBJECT* aSubjectPtr)
65 {
66 typename SubjectList::iterator i = std::find(mObservedSubjects.begin(), mObservedSubjects.end(), aSubjectPtr);
67 if (i != mObservedSubjects.end())
68 {
69 mObservedSubjects.erase(i);
70 return true;
71 }
72 return false;
73 }
74
75 void RemoveAll()
76 {
77 for (size_t i = 0; i < mObservedSubjects.size(); ++i)
78 {
79 mObservedSubjects[i]->DetachObserver(mObserverPtr);
80 }
81 mObservedSubjects.clear();
82 }
83
84private:
85 OBSERVER* mObserverPtr;
86
87 SubjectList mObservedSubjects;
88};
89
90#endif
void Detatch(SUBJECT *aSubjectPtr)
Definition WsfObserverSubjectList.hpp:53
~WsfObserverSubjectList()
Definition WsfObserverSubjectList.hpp:31
std::vector< SUBJECT * > SubjectList
Definition WsfObserverSubjectList.hpp:24
void Attach(OBSERVER *aObserver, SUBJECT *aSubject)
Definition WsfObserverSubjectList.hpp:33
void RemoveAll()
Definition WsfObserverSubjectList.hpp:75
bool IsAttached(SUBJECT *aSubject) const
Definition WsfObserverSubjectList.hpp:48
bool Remove(SUBJECT *aSubjectPtr)
Definition WsfObserverSubjectList.hpp:64
WsfObserverSubjectList()
Definition WsfObserverSubjectList.hpp:26
Copyrights Multiple, All Rights Reserved