| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- /******************************************************************************/
- #include "stdafx.h"
- namespace EE{
- /******************************************************************************/
- void Callbacks::add(void func( ) ) {if(func!=null)_callbacks .New().set(func );}
- void Callbacks::add(void func(Ptr user), Ptr user) {if(func!=null)_callbacks_user.New().set(func, user);}
- void Callbacks::include(void func( ) ) {if(func!=null){REPA(_callbacks )if(_callbacks [i].func==func )return; add(func );}}
- void Callbacks::include(void func(Ptr user), Ptr user) {if(func!=null){REPA(_callbacks_user)if(_callbacks_user[i].func==func && _callbacks_user[i].user==user)return; add(func, user);}}
- void Callbacks::exclude(void func( ) ) {if(func!=null)REPA(_callbacks )if(_callbacks [i].func==func )_callbacks.remove(i, true);}
- void Callbacks::exclude(void func(Ptr user), Ptr user) {if(func!=null)REPA(_callbacks_user)if(_callbacks_user[i].func==func && _callbacks_user[i].user==user)_callbacks.remove(i, true);}
- void Callbacks::del()
- {
- _callbacks .del(); _temp_callbacks .del();
- _callbacks_user.del(); _temp_callbacks_user.del();
- }
- void Callbacks::update()
- {
- // call in order in which they were queued, operate on temp in case callbacks themself queue new callbacks
- // backup both callbacks first
- Swap(_callbacks , _temp_callbacks );
- Swap(_callbacks_user, _temp_callbacks_user);
- // now call them and clear them
- FREPAO(_temp_callbacks ).call(); _temp_callbacks .clear();
- FREPAO(_temp_callbacks_user).call(); _temp_callbacks_user.clear();
- }
- void ThreadSafeCallbacks::add (void func( ) ) {if(func!=null){SyncLocker locker(_lock); super::add (func );}}
- void ThreadSafeCallbacks::add (void func(Ptr user), Ptr user) {if(func!=null){SyncLocker locker(_lock); super::add (func, user);}}
- void ThreadSafeCallbacks::include(void func( ) ) {if(func!=null){SyncLocker locker(_lock); super::include(func );}}
- void ThreadSafeCallbacks::include(void func(Ptr user), Ptr user) {if(func!=null){SyncLocker locker(_lock); super::include(func, user);}}
- #if SYNC_LOCK_SAFE
- void ThreadSafeCallbacks::exclude(void func( ) ) {if(func!=null){SyncLocker locker(_lock); super::exclude(func );}}
- void ThreadSafeCallbacks::exclude(void func(Ptr user), Ptr user) {if(func!=null){SyncLocker locker(_lock); super::exclude(func, user);}}
- #else
- void ThreadSafeCallbacks::exclude(void func( ) ) {if(func!=null && _callbacks .elms()){SyncLocker locker(_lock); super::exclude(func );}}
- void ThreadSafeCallbacks::exclude(void func(Ptr user), Ptr user) {if(func!=null && _callbacks_user.elms()){SyncLocker locker(_lock); super::exclude(func, user);}}
- #endif
- void ThreadSafeCallbacks::update ( ) {if(_callbacks.elms() || _callbacks_user.elms()){SyncLocker locker(_lock); super::update();}}
- void ThreadSafeCallbacks::del ( ) {SyncLocker locker(_lock); super::del();}
- /******************************************************************************/
- }
- /******************************************************************************/
|