@@ -13,36 +13,43 @@ namespace ESPressio {
1313
1414 class Observable : public IObservable {
1515 private:
16- std::vector<IObserver *> _observers;
16+ std::vector<IObserverHandle *> _observers;
1717 protected:
1818 // / Will call the `callback` for each Observer
1919 virtual void WithObservers (std::function<void (IObserver*)> callback) {
2020 for (auto observer : _observers) {
21- callback (observer);
21+ callback (observer-> GetObserver () );
2222 }
2323 }
2424
2525 // / Will call the `callback` for each Observer that is of type `ObserverType`
2626 template <class ObserverType >
2727 void WithObservers (std::function<void (ObserverType*)> callback) {
2828 for (auto observer : _observers) {
29- ObserverType* observerAsT = dynamic_cast <ObserverType*>(observer);
29+ ObserverType* observerAsT = dynamic_cast <ObserverType*>(observer-> GetObserver () );
3030 if (!observerAsT) { continue ; }
3131 callback (observerAsT);
3232 }
3333 }
3434 public:
35+ ~Observable () {
36+ for (auto observer : _observers) {
37+ observer->__invalidate ();
38+ }
39+ }
40+
3541 virtual IObserverHandle* RegisterObserver (IObserver* observer) {
3642 for (auto thisObserver : _observers) {
37- if (thisObserver == observer) { return new ObserverHandle ( this , observer) ; }
43+ if (thisObserver-> GetObserver () == observer) { return thisObserver ; }
3844 }
39- _observers. push_back ( observer);
40- return new ObserverHandle ( this , observer );
45+ IObserverHandle* handle = new ObserverHandle ( this , observer);
46+ _observers. push_back (handle );
4147 }
4248
4349 virtual void UnregisterObserver (IObserver* observer) {
4450 for (auto thisObserver = _observers.begin (); thisObserver != _observers.end (); thisObserver++) {
45- if (*thisObserver == observer) {
51+ if ((*thisObserver)->GetObserver () == observer) {
52+ (*thisObserver)->Unregister ();
4653 _observers.erase (thisObserver);
4754 return ;
4855 }
@@ -51,7 +58,7 @@ namespace ESPressio {
5158
5259 virtual bool IsObserverRegistered (IObserver* observer) {
5360 for (auto thisObserver : _observers) {
54- if (thisObserver == observer) { return true ; }
61+ if ((* thisObserver). GetObserver () == observer) { return true ; }
5562 }
5663 return false ;
5764 }
0 commit comments