void EventManager::removeListener(GameObject *listener) { do { if (mListenerMap.empty()) break; ListenerMap::iterator mapIter = mListenerMap.begin(); for (; mapIter != mListenerMap.end(); ++mapIter) { ListenerList *list = mapIter->second; if (list == NULL) continue; ListenerList::iterator listIter = list->begin(); for (; listIter != list->end(); ++listIter) { if (*listIter == listener) { list->erase(listIter); break; } } } } while (0); }
void Environment::cleanupUnusedListeners(ListenerList& list) { for(ListenerList::iterator giter = list.begin(); giter != list.end();){ if((*giter)->isActive() == false){ giter = list.erase(giter); } else ++giter; } }
// ============================================================================ void IncidentSvc::removeListener ( IIncidentListener* lis , const std::string& type ) { boost::recursive_mutex::scoped_lock lock(m_listenerMapMutex); if( type == "") { // remove Listener from all the lists ListenerMap::iterator itmap; for ( itmap = m_listenerMap.begin(); itmap != m_listenerMap.end();) { // since the current entry may be eventually deleted // we need to keep a memory of the next index before // calling recursively this method ListenerMap::iterator itmap_old = itmap; itmap++; removeListener( lis, (*itmap_old).first ); } } else { ListenerMap::iterator itmap = m_listenerMap.find( type ); if( itmap == m_listenerMap.end() ) { // if not found the incident type then return return; } else { ListenerList* llist = (*itmap).second; ListenerList::iterator itlist; bool justScheduleForRemoval = ( 0!= m_currentIncidentType ) && (type == *m_currentIncidentType); // loop over all the entries in the Listener list // to remove all of them than matches // the listener address. Remember the next index // before erasing the current one for( itlist = llist->begin(); itlist != llist->end(); ) { if( (*itlist).iListener == lis || lis == 0) { if (justScheduleForRemoval) { (itlist++)->singleShot = true; // remove it as soon as it is safe } else { DEBMSG << "Removing [" << type << "] listener '" << getListenerName(lis) << "'" << endmsg; itlist = llist->erase(itlist); // remove from the list now } } else { itlist++; } } if( llist->size() == 0) { delete llist; m_listenerMap.erase(itmap); } } } }