Callback.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. void Callbacks::add(void func( ) ) {if(func!=null)_callbacks .New().set(func );}
  6. void Callbacks::add(void func(Ptr user), Ptr user) {if(func!=null)_callbacks_user.New().set(func, user);}
  7. void Callbacks::include(void func( ) ) {if(func!=null){REPA(_callbacks )if(_callbacks [i].func==func )return; add(func );}}
  8. 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);}}
  9. void Callbacks::exclude(void func( ) ) {if(func!=null)REPA(_callbacks )if(_callbacks [i].func==func )_callbacks.remove(i, true);}
  10. 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);}
  11. void Callbacks::del()
  12. {
  13. _callbacks .del(); _temp_callbacks .del();
  14. _callbacks_user.del(); _temp_callbacks_user.del();
  15. }
  16. void Callbacks::update()
  17. {
  18. // call in order in which they were queued, operate on temp in case callbacks themself queue new callbacks
  19. // backup both callbacks first
  20. Swap(_callbacks , _temp_callbacks );
  21. Swap(_callbacks_user, _temp_callbacks_user);
  22. // now call them and clear them
  23. FREPAO(_temp_callbacks ).call(); _temp_callbacks .clear();
  24. FREPAO(_temp_callbacks_user).call(); _temp_callbacks_user.clear();
  25. }
  26. void ThreadSafeCallbacks::add (void func( ) ) {if(func!=null){SyncLocker locker(_lock); super::add (func );}}
  27. void ThreadSafeCallbacks::add (void func(Ptr user), Ptr user) {if(func!=null){SyncLocker locker(_lock); super::add (func, user);}}
  28. void ThreadSafeCallbacks::include(void func( ) ) {if(func!=null){SyncLocker locker(_lock); super::include(func );}}
  29. void ThreadSafeCallbacks::include(void func(Ptr user), Ptr user) {if(func!=null){SyncLocker locker(_lock); super::include(func, user);}}
  30. #if SYNC_LOCK_SAFE
  31. void ThreadSafeCallbacks::exclude(void func( ) ) {if(func!=null){SyncLocker locker(_lock); super::exclude(func );}}
  32. void ThreadSafeCallbacks::exclude(void func(Ptr user), Ptr user) {if(func!=null){SyncLocker locker(_lock); super::exclude(func, user);}}
  33. #else
  34. void ThreadSafeCallbacks::exclude(void func( ) ) {if(func!=null && _callbacks .elms()){SyncLocker locker(_lock); super::exclude(func );}}
  35. void ThreadSafeCallbacks::exclude(void func(Ptr user), Ptr user) {if(func!=null && _callbacks_user.elms()){SyncLocker locker(_lock); super::exclude(func, user);}}
  36. #endif
  37. void ThreadSafeCallbacks::update ( ) {if(_callbacks.elms() || _callbacks_user.elms()){SyncLocker locker(_lock); super::update();}}
  38. void ThreadSafeCallbacks::del ( ) {SyncLocker locker(_lock); super::del();}
  39. /******************************************************************************/
  40. }
  41. /******************************************************************************/