00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "stdmisc.h"
00027 #include "nel/misc/event_emitter_multi.h"
00028
00029
00030 namespace NLMISC
00031 {
00032
00033
00034 struct EmitterEqualPred
00035 {
00036 EmitterEqualPred(IEventEmitter *e) : E(e) {}
00037 IEventEmitter *E;
00038 bool operator()(const std::pair<IEventEmitter *, bool> &el)
00039 {
00040 return el.first == E;
00041 }
00042 };
00043
00045 CEventEmitterMulti::~CEventEmitterMulti()
00046 {
00047 for (TEmitterCont::iterator it = _Emitters.begin(); it != _Emitters.end(); ++it)
00048 {
00049 if (it->second)
00050 {
00051 delete it->first;
00052 }
00053 }
00054 }
00055
00057 void CEventEmitterMulti::addEmitter(IEventEmitter *e, bool mustDelete)
00058 {
00059 nlassert(e != this);
00060 nlassert(!isEmitter(e));
00061 _Emitters.push_back(std::make_pair(e, mustDelete));
00062 }
00063
00065 void CEventEmitterMulti::removeEmitter(IEventEmitter *e)
00066 {
00067 TEmitterCont::iterator it = std::find_if(_Emitters.begin(), _Emitters.end(), EmitterEqualPred(e));
00068 nlassert(it!= _Emitters.end());
00069 if (it->second)
00070 {
00071 delete it->first;
00072 }
00073 _Emitters.erase(it);
00074 }
00075
00077 bool CEventEmitterMulti::isEmitter(IEventEmitter *e) const
00078 {
00079 TEmitterCont::const_iterator it = std::find_if(_Emitters.begin(), _Emitters.end(), EmitterEqualPred(e));
00080 return it != _Emitters.end();
00081 }
00082
00084 void CEventEmitterMulti::submitEvents(CEventServer &server)
00085 {
00086 for (TEmitterCont::iterator it = _Emitters.begin(); it != _Emitters.end(); ++it)
00087 {
00088 it->first->submitEvents(server);
00089 }
00090 }
00092 IEventEmitter *CEventEmitterMulti::getEmitter(uint index)
00093 {
00094 nlassert(index < _Emitters.size());
00095 return _Emitters[index].first;
00096 }
00097
00098
00099
00100
00101
00102 }