UIDelegate.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "StdAfx.h"
  2. namespace DuiLib {
  3. CDelegateBase::CDelegateBase(void* pObject, void* pFn)
  4. {
  5. m_pObject = pObject;
  6. m_pFn = pFn;
  7. }
  8. CDelegateBase::CDelegateBase(const CDelegateBase& rhs)
  9. {
  10. m_pObject = rhs.m_pObject;
  11. m_pFn = rhs.m_pFn;
  12. }
  13. CDelegateBase::~CDelegateBase()
  14. {
  15. }
  16. bool CDelegateBase::Equals(const CDelegateBase& rhs) const
  17. {
  18. return m_pObject == rhs.m_pObject && m_pFn == rhs.m_pFn;
  19. }
  20. bool CDelegateBase::operator() (void* param)
  21. {
  22. return Invoke(param);
  23. }
  24. void* CDelegateBase::GetFn()
  25. {
  26. return m_pFn;
  27. }
  28. void* CDelegateBase::GetObject()
  29. {
  30. return m_pObject;
  31. }
  32. CEventSource::~CEventSource()
  33. {
  34. for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
  35. CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
  36. if( pObject) delete pObject;
  37. }
  38. }
  39. CEventSource::operator bool()
  40. {
  41. return m_aDelegates.GetSize() > 0;
  42. }
  43. void CEventSource::operator+= (const CDelegateBase& d)
  44. {
  45. for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
  46. CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
  47. if( pObject && pObject->Equals(d) ) return;
  48. }
  49. m_aDelegates.Add(d.Copy());
  50. }
  51. void CEventSource::operator+= (FnType pFn)
  52. {
  53. (*this) += MakeDelegate(pFn);
  54. }
  55. void CEventSource::operator-= (const CDelegateBase& d)
  56. {
  57. for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
  58. CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
  59. if( pObject && pObject->Equals(d) ) {
  60. delete pObject;
  61. m_aDelegates.Remove(i);
  62. return;
  63. }
  64. }
  65. }
  66. void CEventSource::operator-= (FnType pFn)
  67. {
  68. (*this) -= MakeDelegate(pFn);
  69. }
  70. bool CEventSource::operator() (void* param)
  71. {
  72. for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
  73. CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
  74. if( pObject && !(*pObject)(param) ) return false;
  75. }
  76. return true;
  77. }
  78. } // namespace DuiLib