kick
|
00001 namespace kick{ 00002 template <typename E> 00003 inline EventListener<E> Event<E>::createListener(std::function<void (E)> listener, int sortPriority){ 00004 auto insertPos = listeners.begin(); 00005 int v = 0; 00006 while (insertPos != listeners.end() && GET_LISTENER_SORTKEY(*insertPos) < sortPriority){ 00007 insertPos++; 00008 v++; 00009 } 00010 listeners.emplace(insertPos, listener, eventListenerId, sortPriority); 00011 00012 eventListenerId++; 00013 return EventListener<E>(this, eventListenerId-1); 00014 } 00015 00016 template <typename E> 00017 inline void Event<E>::registerSyncValue(SyncValue<E>& syncValue){ 00018 if (syncValue.listenerId > -1){ 00019 removeListener(syncValue.listenerId); 00020 } 00021 std::function<void (E)> updateFunction = [&](E e){ 00022 syncValue.value = e; 00023 }; 00024 listeners.emplace_back(updateFunction, eventListenerId, 0); 00025 syncValue.listenerId = eventListenerId; 00026 syncValue.ae = this; 00027 eventListenerId++; 00028 } 00029 00030 template <typename E> 00031 inline void Event<E>::notifyListeners(E e){ 00032 for (auto & l : listeners){ 00033 auto& func = GET_LISTENER_FN(l); 00034 func(e); 00035 } 00036 } 00037 00038 template <typename E> 00039 inline bool Event<E>::removeListener(int id){ 00040 auto iter = listeners.begin(); 00041 while (iter != listeners.end()){ 00042 if (GET_LISTENER_ID(*iter) == id){ 00043 listeners.erase(iter); 00044 return true; 00045 } 00046 iter++; 00047 } 00048 return false; 00049 } 00050 }