Header.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #pragma once
  2. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3. *
  4. */
  5. /**
  6. * Basic std::function callback example. Templated on a function signature
  7. * that takes in a uint32_t and returns void.
  8. */
  9. struct myData {
  10. int myAge = 55;
  11. const char* pchar = "myData struct";
  12. enum en_sex { MALE, FEMALE, DIVERS } sex = MALE;
  13. };
  14. struct myOtherData : myData {
  15. int myOtherAge = 35;
  16. };
  17. /**
  18. * Alternative storage implementation. Perhaps you want to store
  19. * callbacks for different event types?
  20. */
  21. enum my_events_t
  22. {
  23. VIDEO_STOP = 0,
  24. VIDEO_START,
  25. VIDEO_PAUS,
  26. EVENT_MAX
  27. };
  28. /**
  29. * Alternative storage implementation. Perhaps you want to store
  30. * callbacks for different event types?
  31. */
  32. struct cb_event_t
  33. {
  34. std::function<void(myData)> cb;
  35. my_events_t event;
  36. };
  37. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  38. *
  39. */
  40. /***********************************************************************************************************************
  41. * Dummy Client #1
  42. * Uses a static method for a callback.
  43. */
  44. class Client1
  45. {
  46. public:
  47. static void func(myData v)
  48. {
  49. printf("static member callback: %d\n", v.myAge);
  50. }
  51. };
  52. /***********************************************************************************************************************
  53. * Dummy Client #2
  54. * Uses an instance method as a callback
  55. */
  56. class Client2
  57. {
  58. public:
  59. void func(myData v) const
  60. {
  61. printf("instance member callback: %d\n", v.myAge);
  62. }
  63. };
  64. /***********************************************************************************************************************
  65. * Callback on a c function
  66. */
  67. extern "C"
  68. {
  69. static void c_client_callback(myData v)
  70. {
  71. printf("C function callback: %d\n", v.myAge);
  72. }
  73. }
  74. /**
  75. * Event based example. Constructed with a uint32_t.
  76. * Callbacks are passed this uint32_t.
  77. * Callbacks are only invoked when their event type matches the
  78. * occuring event.
  79. */
  80. class EventDriver
  81. {
  82. typedef std::function<void(myData)> cb_t;
  83. public:
  84. EventDriver() : callbacks_() {};
  85. // Register a callback.
  86. void register_callback(const cb_t& cb, const my_events_t event)
  87. {
  88. // add callback to end of callback list
  89. callbacks_.push_back({ cb, event });
  90. }
  91. /// Call all the registered callbacks.
  92. void callback(myData& val, my_events_t event) const
  93. {
  94. // my_events_t event = VIDEO_START;
  95. // iterate through callback list and call each one
  96. for (const auto& cb : callbacks_)
  97. {
  98. if (cb.event == event)
  99. {
  100. cb.cb(val);
  101. }
  102. }
  103. }
  104. private:
  105. /// Integer to pass to callbacks.
  106. // myData &val_ ;
  107. /// List of callback functions.
  108. std::vector<cb_event_t> callbacks_;
  109. };