15 template <
class _MessageType>
25 template <
class _MessageType>
34 : _observerPriority(1)
45 cDebug(
"~Observer %s %x", this->
name() ? this->
name() :
"No Name",
this);
46 if (!_subjects.empty())
48 auto copy_subjects = _subjects;
49 cWarn(
"Observer %s %x is not detached!!!!", this->
name() ? this->
name() :
"No Name",
this);
50 for (
auto s : copy_subjects)
77 virtual const char*
name(
void) {
return "<no name>"; }
88 _subjects.erase( std::find( _subjects.begin(), _subjects.end(), t ));
95 std::vector<Subject<_MessageType>*> _subjects;
96 int _observerPriority;
107 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);
171 if( ToObserv->__deadVal == 0xDEADBEEF )
179 cDebug(
"Subject %x, attach Observer %s %X ",
this, ToObserv->name() ? ToObserv->name() :
"No Name", ToObserv);
184 cWarn(
"Subject %x, attach Observer %s %X already attached",
this, ToObserv->name() ? ToObserv->name() :
"No Name", ToObserv);
200 cDebug(
"DETACH 0x%X",ToObserv);
203 ObserverSetType::iterator it =
_ObserverSet.find(ObserverHolder(ToObserv));
206 cWarn(
"**** Subject %x, detach Observer %s %X while running notify",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
207 (*it).isAttached =
false;
213 cWarn(
"**** Subject %x, detach Observer %s %X while running notify",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
214 (*it2).isAttached =
false;
222 cDebug(
"Subject %x, detach Observer %s %X",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
228 cWarn(
"Subject %x, detach Observer %s %X not found",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
236 ObserverSetType::iterator it =
_ObserverSet.find(ObserverHolder(ToObserv));
239 cWarn(
"**** Subject %x, detach Observer %s %X while running notify",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
240 (*it).isDeleted =
true;
245 cWarn(
"**** Subject %x, detach Observer %s %X while running notify",
this, ToObserv->
name() ? ToObserv->
name() :
"No Name", ToObserv);
246 (*it2).isDeleted =
true;
257 for (
auto observer : observerSetCopy)
260 observer.observerPtr->setDetached(
this);
264 for (
auto observer : observerSet_AddedLater_Copy)
267 observer.observerPtr->setDetached(
this);
285 cWarn(
"ERROR notify_internal, to deep recursion!");
302 (
observer.observerPtr)->onChange(
this, rcReason);
303 auto myt = t.elapsedMS();
311 cWarn(
" Observer (%s) need %f ms", observerName.c_str(), t.elapsedMS());
313 cDebug(
" Observer (%s) need %f ms", observerName.c_str(), t.elapsedMS());
317 if(
observer.observerPtr->__deadVal == 0xBADEAFFE )
318 (
observer.observerPtr)->onChange(
this, rcReason);
320 cWarn(
"Urgg deleted observer");
332 for (
auto observer : copy_ObserverSet_AddedLater)
335 observer.observerPtr->onChange(
this, rcReason);
339 if( (counter--) <= 0 )
341 cWarn(
"ERROR _ObserverSet_AddedLater, to many repeats!");
350 for(
auto &message : copy_messages_WhileRunningNotify )
369 for (
auto observer : observerSetCopy)
376 for (
auto observer : observerSet_AddedLater_Copy)
394 OName =
observer.observerPtr->name();
395 if (OName && strcmp(OName, Name) == 0)
402 std::vector<Observer<_MessageType>*>
getAll()
404 std::vector<Observer<_MessageType>*> ret;
407 ret.push_back(
observer.observerPtr);
439 std::vector<ObserverHolder> ret( obs.begin(), obs.end() ) ;
441 std::sort(ret.begin(), ret.end(), [](
const ObserverHolder& a,
const ObserverHolder& b)
442 {
return a.observerPriority > b.observerPriority; });
459 #endif // __OBSERVER_H__ LX_BASE_EXPORT LOGLEVEL getLogLevel()
std::map< std::string, double > _observerTime
Definition: Observer.h:452
void detach(Observer< _MessageType > *ToObserv)
Definition: Observer.h:198
ObserverHolder(ObserverType *aobserverPtr)
Definition: Observer.h:118
void notify(_MessageType &rcReason)
Definition: Observer.h:357
virtual ~Subject()
Definition: Observer.h:137
Observer< _MessageType > ObserverType
Definition: Observer.h:111
LX_BASE_EXPORT Base::LogClass cDebug()
bool isDeleted
Definition: Observer.h:122
void notify_internal(_MessageType &rcReason, size_t deep)
Definition: Observer.h:281
Definition: Observer.h:26
Observer< _MessageType > * get(const char *Name)
Definition: Observer.h:388
void attach(Observer< _MessageType > *ToObserv)
Definition: Observer.h:158
Core::PropertyText name
Definition: CoreDocument.h:167
_MessageType MessageType
Definition: Observer.h:112
void setAttached(Subject< _MessageType > *t)
Definition: Observer.h:85
std::set< ObserverHolder, CompareObservers > ObserverSetType
Definition: Observer.h:435
LX_BASE_EXPORT void cDebuggerBreak(char *message)
Definition: Observer.h:16
int getObserverPriority() const
Definition: Observer.h:83
long __deadVal
Definition: Observer.h:92
Definition: Observer.h:115
ObserverSetType _ObserverSet_AddedLater
Set of attached observers.
Definition: Observer.h:448
std::vector< Observer< _MessageType > * > getAll()
Definition: Observer.h:402
void observerDeleted(Observer< _MessageType > *ToObserv)
Definition: Observer.h:234
Observer()
Definition: Observer.h:33
ObserverType * observerPtr
Definition: Observer.h:119
int observerPriority
Definition: Observer.h:120
std::map< std::string, double > getObserverTime()
Definition: Observer.h:417
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:450
Subject()
Definition: Observer.h:131
void setObserverPriority(int priority)
Definition: Observer.h:82
Subject< _MessageType > SubjectType
Definition: Observer.h:113
virtual ~Observer()
Definition: Observer.h:43
bool isAttached
Definition: Observer.h:121
Definition: Observer.h:426
Definition: AbstractXMLReader.h:5
std::list< _MessageType > _messages_WhileRunningNotify
Definition: Observer.h:451
virtual void onDestroy(Subject< _MessageType > &)
Definition: Observer.h:70
std::vector< ObserverHolder > getObserverSortedByPriority(const ObserverSetType &obs)
Definition: Observer.h:437
virtual void onChange(Subject< _MessageType > *rCaller, _MessageType rcReason)=0
void setDetached(Subject< _MessageType > *t)
Definition: Observer.h:86
virtual const char * name(void)
Definition: Observer.h:77
ObserverSetType _ObserverSet
Definition: Observer.h:447
LX_BASE_EXPORT Base::LogClass cWarn()
void resetObserverTime()
Definition: Observer.h:415
bool operator()(const ObserverHolder &o1, const ObserverHolder &o2) const
Definition: Observer.h:428
void detachAll()
Definition: Observer.h:254
virtual const char * subject_name(void)
Definition: Observer.h:413