31#ifndef ETL_OBSERVER_INCLUDED
32#define ETL_OBSERVER_INCLUDED
71 observer_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
72 :
exception(reason_, file_name_, line_number_)
81 class observer_list_full :
public observer_exception
85 observer_list_full(string_type file_name_, numeric_type line_number_)
86 : observer_exception(ETL_ERROR_TEXT(
"observer:full", ETL_OBSERVER_FILE_ID
"A"), file_name_, line_number_)
97 template <
typename TObserver, const
size_t Max_Observers>
107 observer_item(TObserver& observer_)
108 : p_observer(&observer_)
113 TObserver* p_observer;
120 struct compare_observers
122 compare_observers(TObserver& observer_)
123 : p_observer(&observer_)
127 bool operator ()(
const observer_item& item)
const
129 return p_observer == item.p_observer;
132 TObserver* p_observer;
137 typedef size_t size_type;
150 typename Observer_List::iterator i_observer_item = find_observer(
observer);
153 if (i_observer_item == observer_list.end())
159 observer_list.push_back(observer_item(
observer));
171 typename Observer_List::iterator i_observer_item = find_observer(
observer);
174 if (i_observer_item != observer_list.end())
177 observer_list.erase(i_observer_item);
194 typename Observer_List::iterator i_observer_item = find_observer(
observer);
197 if (i_observer_item != observer_list.end())
199 i_observer_item->enabled = state;
209 typename Observer_List::iterator i_observer_item = find_observer(
observer);
212 if (i_observer_item != observer_list.end())
214 i_observer_item->enabled =
false;
223 observer_list.clear();
231 return observer_list.size();
239 template <
typename TNotification>
242 typename Observer_List::iterator i_observer_item = observer_list.begin();
244 while (i_observer_item != observer_list.end())
246 if (i_observer_item->enabled)
248 i_observer_item->p_observer->notification(n);
260 typename Observer_List::iterator i_observer_item = observer_list.begin();
262 while (i_observer_item != observer_list.end())
264 if (i_observer_item->enabled)
266 i_observer_item->p_observer->notification();
285 typename Observer_List::iterator find_observer(TObserver& observer_)
287 return etl::find_if(observer_list.
begin(), observer_list.
end(), compare_observers(observer_));
291 Observer_List observer_list;
294#if ETL_USING_CPP11 && !defined(ETL_OBSERVER_FORCE_CPP03_IMPLEMENTATION)
295 template <
typename... TTypes>
302 template <
typename T1,
typename... TRest>
307 ETL_STATIC_ASSERT((!etl::has_duplicates<T1, TRest...>::value),
"Observer has duplicate notification types");
309 using observer<T1>::notification;
310 using observer<TRest...>::notification;
317 template <
typename T1>
322 virtual ~observer() =
default;
324 virtual void notification(T1) = 0;
336 virtual ~observer() =
default;
338 virtual void notification() = 0;
347 template <
typename T1,
381 template <
typename T1,
412 template <
typename T1,
440 template <
typename T1,
465 template <
typename T1,
487 template <
typename T1,
506 template <
typename T1,
522 template <
typename T1>
528 virtual void notification(T1) = 0;
541 virtual void notification() = 0;
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
void add_observer(TObserver &observer)
Definition observer.h:147
bool remove_observer(TObserver &observer)
Definition observer.h:168
void notify_observers(TNotification n)
Definition observer.h:240
void notify_observers()
Notify all of the observers, sending them the notification.
Definition observer.h:258
void disable_observer(TObserver &observer)
Disable an observer.
Definition observer.h:206
void enable_observer(TObserver &observer, bool state=true)
Definition observer.h:191
size_type number_of_observers() const
Returns the number of observers.
Definition observer.h:229
void clear_observers()
Clear all observers from the list.
Definition observer.h:221
Definition observer.h:363
iterator begin()
Definition vector.h:99
iterator end()
Definition vector.h:117
bitset_ext
Definition absolute.h:39