Libftpp
A modern C++ library
observable_value.hpp
Go to the documentation of this file.
1 #ifndef OBSERVABLE_VALUE_HPP
2 #define OBSERVABLE_VALUE_HPP
3 
4 #include <memory>
5 #include <set>
6 
8 
37 template <typename TType>
39 {
40 private:
41  TType _value;
42  std::set<IObserver<TType>*> _subscriber;
43 
44  void notify() const
45  {
46  for (auto* observer : _subscriber)
47  {
48  if (observer)
49  observer->update(_value);
50  }
51  }
52 
53 public:
54  ObservableValue() = default;
56  {
57  while (!_subscriber.empty())
58  unsubscribe(*_subscriber.begin());
59  }
60 
61  ObservableValue(TType value)
62  {
63  _value = std::move(value);
64  }
65 
66  ObservableValue& operator=(const TType& newValue)
67  {
68  if (newValue != _value)
69  set(newValue);
70 
71  return *this;
72  }
73 
74  void subscribe(IObserver<TType>* observer)
75  {
76  if (observer)
77  _subscriber.insert(observer);
78  }
79 
80  void unsubscribe(IObserver<TType>* observer)
81  {
82  if (observer)
83  _subscriber.erase(observer);
84  }
85 
86  void set(TType newValue)
87  {
88  if (newValue != _value)
89  {
90  _value = std::move(newValue);
91  notify();
92  }
93  }
94 
95  int countSubscriber() const
96  {
97  return _subscriber.size();
98  }
99 
100  const TType& get() const
101  {
102  return _value;
103  }
104 };
105 #endif
ObservableValue class template that implements the Observer design pattern. It allows observers to su...
ObservableValue & operator=(const TType &newValue)
ObservableValue(TType value)
void set(TType newValue)
int countSubscriber() const
void unsubscribe(IObserver< TType > *observer)
void subscribe(IObserver< TType > *observer)
const TType & get() const
ObservableValue()=default