forked from trestletech/rgl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDisposable.cpp
36 lines (29 loc) · 966 Bytes
/
Disposable.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "Disposable.hpp"
#include <algorithm>
#include <vector>
#include "assert.hpp"
using namespace rgl;
void Disposable::addDisposeListener(IDisposeListener* l)
{
assert( std::find( disposeListeners.begin(), disposeListeners.end(), l )
== disposeListeners.end() );
disposeListeners.push_back(l);
}
void Disposable::removeDisposeListener(IDisposeListener* l)
{
Container::iterator pos = std::find( disposeListeners.begin(), disposeListeners.end(), l );
assert( pos != disposeListeners.end() );
disposeListeners.erase(pos);
}
void Disposable::fireNotifyDisposed()
{
// copy the listeners to a queue,
// so add/remove are stable during 'notifyDispose'.
std::vector<IDisposeListener*> queue( disposeListeners.begin(), disposeListeners.end() );
for ( std::vector<IDisposeListener*>::iterator i = queue.begin() ; i != queue.end() ; ++ i )
(*i)->notifyDisposed(this);
}
void Disposable::dispose()
{
fireNotifyDisposed();
}