emitter wip
This commit is contained in:
parent
268b188c59
commit
cdb498aac3
|
@ -25,6 +25,12 @@ protected:
|
||||||
static NAN_METHOD(destroy);
|
static NAN_METHOD(destroy);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void setDefaultMaxListeners(int count) { }
|
||||||
|
int getDefaultMaxListeners() { return 10; }
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void _destroy();
|
void _destroy();
|
||||||
|
|
|
@ -20,6 +20,7 @@ class EventEmitter : public Nan::ObjectWrap {
|
||||||
typedef std::map<int, FN_TYPE> FNMAP_TYPE;
|
typedef std::map<int, FN_TYPE> FNMAP_TYPE;
|
||||||
typedef VEC_TYPE::iterator IT_TYPE;
|
typedef VEC_TYPE::iterator IT_TYPE;
|
||||||
typedef MAP_TYPE::iterator MAP_IT_TYPE;
|
typedef MAP_TYPE::iterator MAP_IT_TYPE;
|
||||||
|
typedef FNMAP_TYPE::iterator FNMAP_IT_TYPE;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -247,7 +248,7 @@ public:
|
||||||
emitter->_raw[name].push_back(raw);
|
emitter->_raw[name].push_back(raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
int nextId = _freeId++;
|
int nextId = emitter->_freeId++;
|
||||||
emitter->_wrappedIds[nextId] = cb;
|
emitter->_wrappedIds[nextId] = cb;
|
||||||
emitter->_rawIds[nextId] = raw;
|
emitter->_rawIds[nextId] = raw;
|
||||||
|
|
||||||
|
@ -300,7 +301,8 @@ public:
|
||||||
|
|
||||||
emitter->_listeners.clear();
|
emitter->_listeners.clear();
|
||||||
emitter->_raw.clear();
|
emitter->_raw.clear();
|
||||||
emitter->_wrapped.clear();
|
emitter->_wrappedIds.clear();
|
||||||
|
emitter->_rawIds.clear();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -315,12 +317,35 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (IT_TYPE it = list.begin(); it != list.end(); ++it) {
|
if (emitter->_rawIds.size()) {
|
||||||
|
|
||||||
emitter->_wrapped.erase(*it);
|
std::vector<int> removes;
|
||||||
|
|
||||||
|
for (IT_TYPE it = list.begin(); it != list.end(); ++it) {
|
||||||
|
|
||||||
|
FN_TYPE fn = *it;
|
||||||
|
|
||||||
|
for (FNMAP_IT_TYPE itRaw = emitter->_rawIds.begin(); itRaw != emitter->_rawIds.end(); ++itRaw) {
|
||||||
|
// emitter->_wrappedIds.erase(*it);
|
||||||
|
if (fn == itRaw->second) {
|
||||||
|
removes.push_back(itRaw->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (removes.size()) {
|
||||||
|
for (std::vector<int>::const_iterator it = removes.begin(); it != removes.end(); ++it) {
|
||||||
|
|
||||||
|
emitter->_wrappedIds.erase(*it);
|
||||||
|
emitter->_rawIds.erase(*it);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
emitter->_listeners[name].clear();
|
emitter->_listeners[name].clear();
|
||||||
emitter->_raw[name].clear();
|
emitter->_raw[name].clear();
|
||||||
|
|
||||||
|
@ -356,7 +381,7 @@ public:
|
||||||
|
|
||||||
VEC_TYPE &wrapList = emitter->_listeners[name];
|
VEC_TYPE &wrapList = emitter->_listeners[name];
|
||||||
|
|
||||||
if (emitter->_wrapped.count(persistentRaw) == 0) {
|
if (emitter->_wrappedIds.size() == 0) {
|
||||||
|
|
||||||
for (IT_TYPE it = wrapList.begin(); it != wrapList.end(); ++it) {
|
for (IT_TYPE it = wrapList.begin(); it != wrapList.end(); ++it) {
|
||||||
|
|
||||||
|
@ -372,19 +397,30 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const FN_TYPE &wrapped = emitter->_wrapped[persistentRaw];
|
for (FNMAP_IT_TYPE itRaw = emitter->_rawIds.begin(); itRaw != emitter->_rawIds.end(); ++itRaw) {
|
||||||
|
|
||||||
for (IT_TYPE it = wrapList.begin(); it != wrapList.end(); ++it) {
|
if (persistentRaw == itRaw->second) {
|
||||||
|
|
||||||
|
FN_TYPE fn = emitter->_wrappedIds[itRaw->first];
|
||||||
|
|
||||||
|
for (IT_TYPE it = wrapList.begin(); it != wrapList.end(); ++it) {
|
||||||
|
|
||||||
|
if (*it == fn) {
|
||||||
|
wrapList.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
emitter->_wrappedIds.erase(itRaw->first);
|
||||||
|
emitter->_rawIds.erase(itRaw->first);
|
||||||
|
|
||||||
if (*it == wrapped) {
|
|
||||||
wrapList.erase(it);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
emitter->_wrapped.erase(persistentRaw);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue