From: JP Dinger Date: Sun, 22 Nov 2009 18:38:23 +0000 (+0100) Subject: skins2: I fail to see why Subject (not Observer) needs to have virtual methods. If... X-Git-Tag: 1.1.0-ff~2182 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=4e7c493eb69c0083895f07683673ed1322168bdd;p=vlc skins2: I fail to see why Subject (not Observer) needs to have virtual methods. If you do find a reason do tell. Observer should probably be defined inside Subject instead. --- diff --git a/modules/gui/skins2/utils/observer.hpp b/modules/gui/skins2/utils/observer.hpp index f88ee0837b..54f1755420 100644 --- a/modules/gui/skins2/utils/observer.hpp +++ b/modules/gui/skins2/utils/observer.hpp @@ -34,55 +34,51 @@ template class Observer; /// Template for subjects in the Observer design pattern template class Subject { +private: + typedef std::set*> observers_t; + public: - virtual ~Subject() { } + ~Subject() { } +#if 0 /// Remove all observers; should only be used for debugging purposes - virtual void clearObservers() + void clearObservers() { m_observers.clear(); } +#endif - /// Add an observer to this subject - /// Note: adding twice the same observer is not harmful - virtual void addObserver( Observer* pObserver ) + /// Add an observer to this subject. Ignore NULL observers. + /// Note: adding the same observer twice is not harmful. + void addObserver( Observer* pObserver ) { - m_observers.insert( pObserver ); + if( pObserver ) m_observers.insert( pObserver ); } - /// Remove an observer from this subject - /// Note: removing twice the same observer is not harmful - virtual void delObserver( Observer* pObserver ) + /// Remove an observer from this subject. Ignore NULL observers. + /// Note: removing the same observer twice is not harmful. + void delObserver( Observer* pObserver ) { - m_observers.erase( pObserver ); + if( pObserver ) m_observers.erase( pObserver ); } /// Notify the observers when the status has changed - virtual void notify( ARG *arg ) + void notify( ARG *arg ) { - // This stupid gcc 3.2 needs "typename" - typename set*>::const_iterator iter; - for( iter = m_observers.begin(); iter != m_observers.end(); - iter++ ) - { - if( *iter == NULL ) - { - fprintf( stderr, "iter NULL !\n" ); - return; - } + typename observers_t::const_iterator iter; + for( iter = m_observers.begin(); iter != m_observers.end(); ++iter ) (*iter)->onUpdate( *this , arg ); - } } /// Notify without any argument - virtual void notify() { notify( NULL ); } + void notify() { notify( NULL ); } protected: Subject() { } private: /// Set of observers for this subject - set*> m_observers; + observers_t m_observers; };