// Adds an event listener to the list for that event type. Returns false if listener is not added, true if added bool EventManager::addListener(EventListenerPtr const & listener, EventType const & type) { if (!validateType(type)) return false; EventTypeSet::iterator it = m_eventTypes.find(type); // Looks to see if the event is a type seen before and adds the event type if not. if (it == m_eventTypes.end()) { EventTypeSetRet itEvent = m_eventTypes.insert(type); if (itEvent.second == false) return false; if (itEvent.first == m_eventTypes.end()) return false; it = itEvent.first; } EventListenerMap::iterator itMap = m_listenerMap.find(type.getId()); // Finds the list of listeners for the event type and creates one if it doesn't exist. if (itMap == m_listenerMap.end()) { EventListenerMapRet itListMap = m_listenerMap.insert(EventListenerMapEntry(type.getId(), EventListenerList())); if (itListMap.second == false) return false; if (itListMap.first == m_listenerMap.end()) return false; itMap = itListMap.first; } EventListenerList & theList= (*itMap).second; // Checks to see if the listener is already in the map. for (EventListenerList::iterator i = theList.begin(); i != theList.end(); i++) { if ((*i) == listener) return false; } theList.push_back(listener); return true; }
/// /// リスナー追加 bool EventManager::addListenerCore( const EventHandler& in_listener, const EventType& in_type ) { if (!isValidateEventType(in_type)) { // 無効なイベント return false; } // リスナーマップのエントリを探し、このエントリに対応するテーブルが // まだ存在しなければエントリを作成 EventListenerMap::iterator elm_it = registry_.find(in_type.key()); if (elm_it == registry_.end()) { // 未発見なのでエントリを作成 EventListenerMapInsertResult elm_res = registry_.insert( EventListenerMapEntry(in_type.key(), EventListenerTable()) ); if (elm_res.second == false) { //挿入失敗 return false; } if (elm_res.first == registry_.end()) { // 空のテーブル return false; } // これでマップリストを更新できるようになる elm_it = elm_res.first; } // リスナーのマップリストを更新する // 既存のリストをたどりリスナーを二重に追加することを防ぐ EventListenerTable& table = (*elm_it).second; for (auto& it : table) { // 既に同じインスタンスのハンドラが登録されている T3_ASSERT(it->target() != in_listener->target()); } // まだ未登録だったので登録する table.push_back(in_listener); return true; }