コード例 #1
0
	// /////////////////////////////////////////////////////////////////
	// 
	// /////////////////////////////////////////////////////////////////
	bool EventManager::VAddListener(EventListenerPtr const &inListener, EventType const & inType)
	{
		if ( ! VValidateType( inType ) )
			return false;

		// check / update type list
		
		EventTypeSet::iterator evIt = m_typeList.find( inType );

		// find listener map entry, create one if no table already
		// exists for this entry ...

		EventListenerMap::iterator elmIt =
			m_registry.find( inType.getHashValue() );

		if ( elmIt == m_registry.end() )
		{
			EventListenerMapIRes elmIRes = m_registry.insert(
				EventListenerMapEnt( inType.getHashValue(),
									  EventListenerTable() ) );

			// whoops, could not insert into map!?!?
			if ( elmIRes.second == false )
				return false;

			// should not be possible, how did we insert and create
			// an empty table!?!?!
			if ( elmIRes.first == m_registry.end() )
				return false;

			// store it so we can update the mapped list next ...
			elmIt = elmIRes.first;
		}

		// update the mapped list of listeners, walk the existing
		// list (if any entries) to prevent duplicate addition of
		// listeners. This is a bit more costly at registration time
		// but will prevent the hard-to-notice duplicate event
		// propogation sequences that would happen if double-entries
		// were allowed.

		// note: use reference to make following code more simple
		EventListenerTable & evlTable = (*elmIt).second;
		
		for ( EventListenerTable::iterator it = evlTable.begin(),
				  itEnd = evlTable.end(); it != itEnd ; it++ )
		{
			bool bListenerMatch = ( *it == inListener );

			if ( bListenerMatch )
				return false;
		}

		// okay, event type validated, event listener validated,
		// event listener not already in map, add it

		evlTable.push_back( inListener );

		return true;
	}
コード例 #2
0
bool EventManager::AddListener(EventListener *listener, EVENT_TYPE type)
{
	// TODO: validate type

	EventListenerMap::iterator listenerItor = m_registry.find(type);
	if (listenerItor == m_registry.end())
	{
		// need to register this listener for the given type
		EventListenerMapIRes result = m_registry.insert(EventListenerMapEnt(type, EventListenerTable()));
		ASSERT(result.second != false);
		ASSERT(result.first != m_registry.end());

		listenerItor = result.first;
	}

	// prevent duplicate listeners from being registered
	EventListenerTable &table = (*listenerItor).second;
	for (EventListenerTable::iterator itor = table.begin(); itor != table.end(); ++itor)
	{
		ASSERT(*itor != listener);
	}

	table.push_back(listener);

	// also update the list of currently registered event types
	m_typeList.insert(type);

	return true;
}
コード例 #3
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;
}
コード例 #4
0
ファイル: Event.cpp プロジェクト: entityhat/style
	bool Manager::VAddListener ( ListenerPtr const & inListener, TypeId const & inType )
	{
		if ( ! VValidateType( inType ) )
			return false;

		TypeIdSet::iterator evIt = m_typeList.find( inType );
		EventListenerMap::iterator elmIt = m_registry.find( inType.Value() );
		if ( elmIt == m_registry.end() )
		{
			EventListenerMapIRes elmIRes = m_registry.insert( EventListenerMapEnt( inType.Value(), EventListenerTable() ) );
			if ( elmIRes.second == false )
				return false;
			if ( elmIRes.first == m_registry.end() )
				return false;
			elmIt = elmIRes.first;
		}

		EventListenerTable & evlTable = (*elmIt).second;
	
		for ( EventListenerTable::iterator it = evlTable.begin(), itEnd = evlTable.end();
				it != itEnd;
					it++ )
		{
			bool bListenerMatch = ( *it == inListener );

			if ( bListenerMatch )
				return false;
		}

		evlTable.push_back( inListener );
		return true;
	}