UIDelegate.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #ifndef __UIDELEGATE_H__
  2. #define __UIDELEGATE_H__
  3. #pragma once
  4. namespace DuiLib {
  5. class UILIB_API CDelegateBase
  6. {
  7. public:
  8. CDelegateBase(void* pObject, void* pFn);
  9. CDelegateBase(const CDelegateBase& rhs);
  10. virtual ~CDelegateBase();
  11. bool Equals(const CDelegateBase& rhs) const;
  12. bool operator() (void* param);
  13. virtual CDelegateBase* Copy() const = 0; // add const for gcc
  14. protected:
  15. virtual void* GetFn() const;
  16. void* GetObject();
  17. virtual bool Invoke(void* param) = 0;
  18. private:
  19. void* m_pObject;
  20. void* m_pFn;
  21. };
  22. class CDelegateStatic: public CDelegateBase
  23. {
  24. typedef bool (*Fn)(void*);
  25. public:
  26. CDelegateStatic(Fn pFn) : CDelegateBase(NULL, pFn) { }
  27. CDelegateStatic(const CDelegateStatic& rhs) : CDelegateBase(rhs) { }
  28. virtual CDelegateBase* Copy() const { return new CDelegateStatic(*this); }
  29. protected:
  30. virtual bool Invoke(void* param)
  31. {
  32. Fn pFn = (Fn)GetFn();
  33. return (*pFn)(param);
  34. }
  35. };
  36. template <class O, class T>
  37. class CDelegate : public CDelegateBase
  38. {
  39. typedef bool (T::* Fn)(void*);
  40. public:
  41. CDelegate(O* pObj, Fn pFn) : CDelegateBase(pObj, &pFn), m_pFn(pFn) { }
  42. CDelegate(const CDelegate& rhs) : CDelegateBase(rhs) { m_pFn = rhs.m_pFn; }
  43. virtual CDelegateBase* Copy() const { return new CDelegate(*this); }
  44. virtual void* GetFn() const { return *(void**)&m_pFn; }
  45. protected:
  46. virtual bool Invoke(void* param)
  47. {
  48. O* pObject = (O*) GetObject();
  49. return (pObject->*m_pFn)(param);
  50. }
  51. private:
  52. Fn m_pFn;
  53. };
  54. template <class O, class T>
  55. CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(void*))
  56. {
  57. return CDelegate<O, T>(pObject, pFn);
  58. }
  59. inline CDelegateStatic MakeDelegate(bool (*pFn)(void*))
  60. {
  61. return CDelegateStatic(pFn);
  62. }
  63. class UILIB_API CEventSource
  64. {
  65. typedef bool (*FnType)(void*);
  66. public:
  67. ~CEventSource();
  68. operator bool();
  69. void operator+= (const CDelegateBase& d); // add const for gcc
  70. void operator+= (FnType pFn);
  71. void operator-= (const CDelegateBase& d);
  72. void operator-= (FnType pFn);
  73. bool operator() (void* param);
  74. void Clear();
  75. protected:
  76. CStdPtrArray m_aDelegates;
  77. };
  78. } // namespace DuiLib
  79. #endif // __UIDELEGATE_H__