Пример #1
0
///
/// リスナー追加
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;
}
Пример #2
0
///
/// リスナーのリストを取得
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;
}
Пример #3
0
///
/// イベントの有効性を判定
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;
}