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;
151 typename Observer_List::iterator i_observer_item = find_observer(
observer);
154 if (i_observer_item == observer_list.end())
160 observer_list.push_back(observer_item(
observer));
172 typename Observer_List::iterator i_observer_item = find_observer(
observer);
175 if (i_observer_item != observer_list.end())
178 observer_list.erase(i_observer_item);
196 typename Observer_List::iterator i_observer_item = find_observer(
observer);
199 if (i_observer_item != observer_list.end())
201 i_observer_item->enabled = state;
211 typename Observer_List::iterator i_observer_item = find_observer(
observer);
214 if (i_observer_item != observer_list.end())
216 i_observer_item->enabled =
false;
225 observer_list.clear();
233 return observer_list.size();
241 template <
typename TNotification>
244 typename Observer_List::iterator i_observer_item = observer_list.begin();
246 while (i_observer_item != observer_list.end())
248 if (i_observer_item->enabled)
250 i_observer_item->p_observer->notification(n);
262 typename Observer_List::iterator i_observer_item = observer_list.begin();
264 while (i_observer_item != observer_list.end())
266 if (i_observer_item->enabled)
268 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>
309 ETL_STATIC_ASSERT((!etl::has_duplicates<T1, TRest...>::value),
"Observer has duplicate notification types");
311 using observer<T1>::notification;
312 using observer<TRest...>::notification;
313 using type_list = etl::type_list<T1, TRest...>;
320 template <
typename T1>
325 using type_list = etl::type_list<T1>;
327 virtual ~observer() =
default;
329 virtual void notification(T1) = 0;
341 using type_list = etl::type_list<>;
343 virtual ~observer() =
default;
345 virtual void notification() = 0;
350 template <
typename TList>
351 struct observer_from_type_list;
353 template <
typename... TTypes>
354 struct observer_from_type_list<etl::type_list<TTypes...>>
356 using type = etl::observer<TTypes...>;
359 template <
typename TTypeList>
360 using observer_from_type_list_t =
typename observer_from_type_list<TTypeList>::type;
368 template <
typename T1,
typename T2 = void,
typename T3 = void,
typename T4 = void,
typename T5 = void,
typename T6 = void,
typename T7 = void,
398 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7>
424 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6>
448 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
470 template <
typename T1,
typename T2,
typename T3,
typename T4>
490 template <
typename T1,
typename T2,
typename T3>
508 template <
typename T1,
typename T2>
524 template <
typename T1>
530 virtual void notification(T1) = 0;
543 virtual void notification() = 0;
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
void add_observer(TObserver &observer)
Definition observer.h:148
bool remove_observer(TObserver &observer)
Definition observer.h:169
void notify_observers(TNotification n)
Definition observer.h:242
void notify_observers()
Notify all of the observers, sending them the notification.
Definition observer.h:260
void disable_observer(TObserver &observer)
Disable an observer.
Definition observer.h:208
void enable_observer(TObserver &observer, bool state=true)
Definition observer.h:193
size_type number_of_observers() const
Returns the number of observers.
Definition observer.h:231
void clear_observers()
Clear all observers from the list.
Definition observer.h:223
Definition observer.h:379
iterator begin()
Definition vector.h:99
iterator end()
Definition vector.h:117
bitset_ext
Definition absolute.h:40