/// /// リスナー追加 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; }
/// /// リスナーのリストを取得 EventListenerList EventManager::getListenerList( const EventType &event_type ) { if (!isValidateEventType(event_type)) { // 無効なイベントの場合 // 空のリスナーリストを返す return EventListenerList(); } // イベントのリスナーリストを取得 auto map_it = registry_.find(event_type.key()); if (map_it == registry_.end()) { // このイベント型にはリスナーがいない // 空のリストを返す return EventListenerList(); } const EventListenerTable& table = map_it->second; if (table.empty()) { // このイベント型には以前はリスナーがあったが現在は無い // 空のリストを返す return EventListenerList(); } // ※ここまで来るということは、このイベントの // リスナーのリストは確かに存在する // リスナーのリストを別インスタンスとして作成して返す EventListenerList result; result.reserve(table.size()); auto table_it = table.begin(); auto table_end = table.end(); for (; table_it != table_end; ++table_it) { // もどす用のリストにリスナーのリスト内容をコピー result.push_back((*table_it)->target()); } // もどす return result; }
/// /// イベントの有効性を判定 bool EventManager::isValidateEventType( const EventType& in_type ) { if (in_type.string().length() == 0) { return false; } if (in_type.key() == 0) { return false; } T3_ASSERT_MSG( type_list_.find(in_type) == type_list_.end(), "it was provavly not registerd whit the EventManager." ); return true; }