17 template <
class _MessageType>
27 template <
class _MessageType>
36 : _observerPriority(1)
47 cDebug(
"~Observer %s %x", this->
name() ? this->
name() :
"No Name",
this);
48 if (!_subjects.empty())
50 auto copy_subjects = _subjects;
51 cWarn(
"Observer %s %x is not detached!!!!", this->
name() ? this->
name() :
"No Name",
this);
52 for (
auto s : copy_subjects)
79 virtual const char*
name(
void) {
return "<no name>"; }
90 _subjects.erase( std::find( _subjects.begin(), _subjects.end(), t ));
95 long val = 0xBADEAFFE;
96 std::vector<Subject<_MessageType>*> _subjects;
97 int _observerPriority;
108 template <
class _MessageType>
142 cWarn(
"FATAL ERROR, ~Subject %X call while running notify!" );
148 cWarn(
"Not detached all observers yet" );
163 std::string
name = ToObserv->
name() ? ToObserv->
name() :
"No Name";
164 std::ostringstream oss;
165 oss <<
" " << ToObserv;
170 cDebug(
"Subject %x, attach Observer %s %X while running notify",
this, ToObserv->name() ? ToObserv->name() :
"No Name", ToObserv);
176 cDebug(
"Subject %x, attach Observer %s %X ",
this, ToObserv->name() ? ToObserv->name() :
"No Name", ToObserv);
181 cWarn(
"Subject %x, attach Observer %s %X already attached",
this, ToObserv->name() ? ToObserv->name() :
"No Name", ToObserv);
194 cDebug(
"DETACH 0x%X",ToObserv);
197 ObserverSetType::iterator it =
_ObserverSet.find(ObserverHolder(ToObserv));
200 cWarn(
"**** Subject %x, detach Observer %s %X while running notify",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
201 (*it).isAttached =
false;
207 cWarn(
"**** Subject %x, detach Observer %s %X while running notify",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
208 (*it2).isAttached =
false;
216 cDebug(
"Subject %x, detach Observer %s %X",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
222 cWarn(
"Subject %x, detach Observer %s %X not found",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
234 for (
auto observer : observerSetCopy)
237 observer.observerPtr->setDetached(
this);
241 for (
auto observer : observerSet_AddedLater_Copy)
244 observer.observerPtr->setDetached(
this);
262 cWarn(
"ERROR notify_internal, to deep recursion!");
279 (
observer.observerPtr)->onChange(
this, rcReason);
280 auto myt = t.elapsedMS();
288 cWarn(
" Observer (%s) need %f ms", observerName.c_str(), t.elapsedMS());
290 cDebug(
" Observer (%s) need %f ms", observerName.c_str(), t.elapsedMS());
294 (
observer.observerPtr)->onChange(
this, rcReason);
306 for (
auto observer : copy_ObserverSet_AddedLater)
309 observer.observerPtr->onChange(
this, rcReason);
313 if( (counter--) <= 0 )
315 cWarn(
"ERROR _ObserverSet_AddedLater, to many repeats!");
324 for(
auto &message : copy_messages_WhileRunningNotify )
353 OName =
observer.observerPtr->name();
354 if (OName && strcmp(OName, Name) == 0)
361 std::vector<Observer<_MessageType>*>
getAll()
363 std::vector<Observer<_MessageType>*> ret;
366 ret.push_back(
observer.observerPtr);
398 std::vector<ObserverHolder> ret( obs.begin(), obs.end() ) ;
400 std::sort(ret.begin(), ret.end(), [](
const ObserverHolder& a,
const ObserverHolder& b)
401 {
return a.observerPriority < b.observerPriority; });
417 #endif // __OBSERVER_H__ std::map< std::string, double > _observerTime
Definition: Observer.h:410
void detach(Observer< _MessageType > *ToObserv)
Definition: Observer.h:192
ObserverHolder(ObserverType *aobserverPtr)
Definition: Observer.h:119
CORE_EXPORT Core::LogClass cWarn()
void notify(_MessageType &rcReason)
Definition: Observer.h:331
virtual ~Subject()
Definition: Observer.h:137
Observer< _MessageType > ObserverType
Definition: Observer.h:112
CORE_EXPORT void cDebuggerBreak(char *message)
void notify_internal(_MessageType &rcReason, size_t deep)
Definition: Observer.h:258
CORE_EXPORT Core::LogClass cDebug()
Definition: Observer.h:28
Observer< _MessageType > * get(const char *Name)
Definition: Observer.h:347
void attach(Observer< _MessageType > *ToObserv)
Definition: Observer.h:158
Core::PropertyText name
Definition: CoreDocument.h:143
_MessageType MessageType
Definition: Observer.h:113
void setAttached(Subject< _MessageType > *t)
Definition: Observer.h:87
std::set< ObserverHolder, CompareObservers > ObserverSetType
Definition: Observer.h:394
Definition: Observer.h:18
int getObserverPriority() const
Definition: Observer.h:85
Definition: Observer.h:116
ObserverSetType _ObserverSet_AddedLater
Set of attached observers.
Definition: Observer.h:407
std::vector< Observer< _MessageType > * > getAll()
Definition: Observer.h:361
Observer()
Definition: Observer.h:35
ObserverType * observerPtr
Definition: Observer.h:120
int observerPriority
Definition: Observer.h:121
std::map< std::string, double > getObserverTime()
Definition: Observer.h:376
basic_observer< entity > observer
Alias declaration for the most common use case.
Definition: entt.hpp:3793
bool _running_notify
Set of attached observers at running notify.
Definition: Observer.h:408
Subject()
Definition: Observer.h:131
void setObserverPriority(int priority)
Definition: Observer.h:84
Subject< _MessageType > SubjectType
Definition: Observer.h:114
virtual ~Observer()
Definition: Observer.h:45
bool isAttached
Definition: Observer.h:122
Definition: Observer.h:385
Definition: AbstractXMLReader.h:8
std::list< _MessageType > _messages_WhileRunningNotify
Definition: Observer.h:409
virtual void onDestroy(Subject< _MessageType > &)
Definition: Observer.h:72
std::vector< ObserverHolder > getObserverSortedByPriority(const ObserverSetType &obs)
Definition: Observer.h:396
virtual void onChange(Subject< _MessageType > *rCaller, _MessageType rcReason)=0
void setDetached(Subject< _MessageType > *t)
Definition: Observer.h:88
CORE_EXPORT LOGLEVEL getLogLevel()
virtual const char * name(void)
Definition: Observer.h:79
ObserverSetType _ObserverSet
Definition: Observer.h:406
void resetObserverTime()
Definition: Observer.h:374
bool operator()(const ObserverHolder &o1, const ObserverHolder &o2) const
Definition: Observer.h:387
void detachAll()
Definition: Observer.h:231
virtual const char * subject_name(void)
Definition: Observer.h:372