コード例 #1
0
// 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;
}
コード例 #2
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;
}