UIDelegate.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. void* GetFn();
  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, *(void**)&pFn) { }
  42. CDelegate(const CDelegate& rhs) : CDelegateBase(rhs) { }
  43. virtual CDelegateBase* Copy() const { return new CDelegate(*this); }
  44. protected:
  45. virtual bool Invoke(void* param)
  46. {
  47. O* pObject = (O*) GetObject();
  48. union
  49. {
  50. void* ptr;
  51. Fn fn;
  52. } func = { GetFn() };
  53. return (pObject->*func.fn)(param);
  54. }
  55. private:
  56. Fn m_pFn;
  57. };
  58. template <class O, class T>
  59. CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(void*))
  60. {
  61. return CDelegate<O, T>(pObject, pFn);
  62. }
  63. inline CDelegateStatic MakeDelegate(bool (*pFn)(void*))
  64. {
  65. return CDelegateStatic(pFn);
  66. }
  67. class UILIB_API CEventSource
  68. {
  69. typedef bool (*FnType)(void*);
  70. public:
  71. ~CEventSource();
  72. operator bool();
  73. void operator+= (const CDelegateBase& d); // add const for gcc
  74. void operator+= (FnType pFn);
  75. void operator-= (const CDelegateBase& d);
  76. void operator-= (FnType pFn);
  77. bool operator() (void* param);
  78. protected:
  79. CStdPtrArray m_aDelegates;
  80. };
  81. } // namespace DuiLib
  82. #endif // __UIDELEGATE_H__