Giri's C++ Support Library
C++ library providing everything you need to quickly create awesome applications.
Observer.h
Go to the documentation of this file.
1 
10 #ifndef SUPPORTLIB_OBSERVER_OBSERVABLE_H
11 #define SUPPORTLIB_OBSERVER_OBSERVABLE_H
12 #include "Object.h"
13 #include <vector>
14 #include <algorithm>
15 namespace giri {
41  template <typename U>
42  class Observer : public Object< Observer<U> >
43  {
44  public:
49  virtual void update(std::shared_ptr<U> observable) = 0;
50  protected:
51  Observer() = default;
52  };
53 
97  template <typename T>
98  class Observable : public Object< Observable<T> >, public std::enable_shared_from_this<T>
99  {
100  public:
105  void subscribe(const std::weak_ptr< Observer<T> >& obs){
106  if(!obs.expired())
107  m_Observers.push_back(obs);
108  }
113  void unsubscribe(const std::weak_ptr< Observer<T> >& obs){
114  for(size_t i = 0; i < m_Observers.size(); i++)
115  if(m_Observers[i].lock() == obs.lock()) {
116  m_Observers.erase(m_Observers.begin() + i);
117  break;
118  }
119  }
124  m_Observers.clear();
125  }
130  void notify(){
131  for(const auto& curObs : m_Observers)
132  curObs.lock()->update(this->shared_from_this());
133  }
134  protected:
135  Observable() = default;
136  private:
137  std::vector< std::weak_ptr< Observer<T> > > m_Observers;
138  };
139 }
140 #endif //SUPPORTLIB_OBSERVER_OBSERVABLE_H
Base class of all classes.
Base Class of all classes.
Definition: Object.h:33
Observable class. Inherited classes can notify all classes which inherit from Observer.
Definition: Observer.h:99
void subscribe(const std::weak_ptr< Observer< T > > &obs)
Definition: Observer.h:105
void notify()
Definition: Observer.h:130
void unsubscribeAll()
Definition: Observer.h:123
void unsubscribe(const std::weak_ptr< Observer< T > > &obs)
Definition: Observer.h:113
Observer class. Inherited classes can observe all classes which inherit from Observable.
Definition: Observer.h:43
virtual void update(std::shared_ptr< U > observable)=0
Namespace for giri's C++ support library.
Definition: Base64.h:47