23 template<
class observer_t>
64 void reset() noexcept;
73 operator bool()
const noexcept;
77 void* m_pObserver =
nullptr;
80 using observer_token = std::unique_ptr<observer_token_data>;
102 virtual void detach(
void* pObserver) noexcept = 0;
115 template<
class observer_t>
118 template<
class base_iterator_t>
119 class base_iterator :
public base_iterator_t
122 base_iterator() noexcept =
default;
129 base_iterator(
const base_iterator_t& other,
subject* pSubject) noexcept;
131 base_iterator(
const base_iterator& other) noexcept;
132 base_iterator(base_iterator&&) noexcept =
default;
133 ~base_iterator() noexcept;
135 base_iterator& operator=(
const base_iterator& other) noexcept;
136 observer_t* operator->() noexcept;
137 observer_t& operator*() noexcept;
143 void init() noexcept;
149 template<
class base_iterator_t>
150 class const_base_iterator :
public base_iterator_t
153 const_base_iterator() noexcept =
default;
154 const_base_iterator(
const const_base_iterator&) noexcept =
default;
155 const_base_iterator(const_base_iterator&&) noexcept =
default;
156 const_base_iterator(
const base_iterator_t& other) noexcept;
158 const observer_t* operator->()
const noexcept;
159 const observer_t& operator*()
const noexcept;
163 using observers_container = std::vector<observer_t*>;
164 using iterator = base_iterator<typename observers_container::iterator>;
165 using const_iterator = const_base_iterator<typename observers_container::const_iterator>;
166 using reverse_iterator = base_iterator<typename observers_container::reverse_iterator>;
167 using const_reverse_iterator = const_base_iterator<typename observers_container::const_reverse_iterator>;
168 using notify_func = std::function<void(observer_t*)>;
182 [[nodiscard]] observer_token
attach(observer_t* pObserver) noexcept;
188 void notify(
const notify_func& notifyFunc)
const noexcept;
206 const_iterator
cbegin()
const;
218 const_iterator
end()
const;
224 const_iterator
cend()
const;
230 reverse_iterator
rbegin();
242 const_reverse_iterator
crbegin()
const;
248 reverse_iterator
rend();
254 const_reverse_iterator
rend()
const;
260 const_reverse_iterator
crend()
const;
273 virtual
void detach(
void* pObserver) noexcept override;
278 void on_iterator_destructed() noexcept;
283 void on_iterator_constructed() noexcept;
286 observers_container m_Observers;
288 size_t m_nIterators = 0;
293 #include <qx/patterns/observer.inl>
virtual void detach(void *pObserver) noexcept=0
Detach observer from subject.
Tokens are used to automatically detach observer when the observer object is destroyed.
void reset() noexcept
Reset observer_token.
Class maintains a list of its dependents, called observers, and notifies them automatically of any st...
const_iterator cbegin() const
Return const iterator to beginning.
iterator begin()
Return iterator to beginning.
const_iterator cend() const
Return const iterator to end.
const_reverse_iterator rend() const
Return reverse iterator to reverse end.
observer_token attach(observer_t *pObserver) noexcept
Attach observer to this subject.
iterator end()
Return iterator to end.
reverse_iterator rbegin()
Return reverse iterator to reverse beginning.
const_iterator end() const
Return iterator to end.
size_t get_num_observers() const noexcept
Get number of observers attached to this subject.
const_reverse_iterator rbegin() const
Return reverse iterator to reverse beginning.
void notify(const notify_func ¬ifyFunc) const noexcept
Notify all observers.
const_iterator begin() const
Return iterator to beginning.
const_reverse_iterator crend() const
Return const reverse iterator to reverse end.
reverse_iterator rend()
Return reverse iterator to reverse end.
const_reverse_iterator crbegin() const
Return const reverse iterator to reverse beginning.