UIDelegate.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 && GetFn() == rhs.GetFn();
  19. }
  20. bool CDelegateBase::operator() (void* param)
  21. {
  22. return Invoke(param);
  23. }
  24. void* CDelegateBase::GetFn() const
  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. void CEventSource::Clear()
  79. {
  80. for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
  81. CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
  82. if( pObject) delete pObject;
  83. }
  84. m_aDelegates.Empty();
  85. }
  86. } // namespace DuiLib