You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TReaderCallbackProxy.h 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #pragma once
  2. #include "IReader.h"
  3. namespace EBML {
  4. // ________________________________________________________________________________________________________________
  5. //
  6. template <class TOwnerClass>
  7. class TReaderCallbackProxy1 final : public IReaderCallback
  8. {
  9. public:
  10. TReaderCallbackProxy1(TOwnerClass& ownerObject, bool (TOwnerClass::*mfpIsMasterChild)(const CIdentifier& identifier),
  11. void (TOwnerClass::*mfpOpenChild)(const CIdentifier& identifier),
  12. void (TOwnerClass::*mfpProcessChildData)(const void* buffer, const size_t size), void (TOwnerClass::*mfpCloseChild)())
  13. : m_ownerObject(ownerObject), m_mfpIsMasterChild(mfpIsMasterChild), m_mfpOpenChild(mfpOpenChild), m_mfpProcessChildData(mfpProcessChildData),
  14. m_mfpCloseChild(mfpCloseChild) { }
  15. bool isMasterChild(const CIdentifier& identifier) override
  16. {
  17. if (m_mfpIsMasterChild) { return (m_ownerObject.*m_mfpIsMasterChild)(identifier); }
  18. return false;
  19. }
  20. void openChild(const CIdentifier& identifier) override { if (m_mfpOpenChild) { (m_ownerObject.*m_mfpOpenChild)(identifier); } }
  21. void processChildData(const void* buffer, const size_t size) override
  22. {
  23. if (m_mfpProcessChildData) { (m_ownerObject.*m_mfpProcessChildData)(buffer, size); }
  24. }
  25. void closeChild() override { if (m_mfpCloseChild) { (m_ownerObject.*m_mfpCloseChild)(); } }
  26. protected:
  27. TOwnerClass& m_ownerObject;
  28. bool (TOwnerClass::*m_mfpIsMasterChild)(const CIdentifier& identifier);
  29. void (TOwnerClass::*m_mfpOpenChild)(const CIdentifier& identifier);
  30. void (TOwnerClass::*m_mfpProcessChildData)(const void* buffer, size_t size);
  31. void (TOwnerClass::*m_mfpCloseChild)();
  32. };
  33. // ________________________________________________________________________________________________________________
  34. //
  35. template <class TOwnerClass, bool (TOwnerClass::*TMfpIsMasterChild)(const CIdentifier& identifier),
  36. void (TOwnerClass::*TMfpOpenChild)(const CIdentifier& identifier),
  37. void (TOwnerClass::*TMfpProcessChildData)(const void* buffer, size_t size), void (TOwnerClass::*TMfpCloseChild)()>
  38. class TReaderCallbackProxy2 final : public IReaderCallback
  39. {
  40. public:
  41. TReaderCallbackProxy2(TOwnerClass& ownerObject)
  42. : m_ownerObject(ownerObject), m_mfpIsMasterChild(TMfpIsMasterChild), m_mfpOpenChild(TMfpOpenChild), m_mfpProcessChildData(TMfpProcessChildData),
  43. m_mfpCloseChild(TMfpCloseChild) { }
  44. bool isMasterChild(const CIdentifier& identifier) override
  45. {
  46. if (m_mfpIsMasterChild) { return (m_ownerObject.*m_mfpIsMasterChild)(identifier); }
  47. return false;
  48. }
  49. void openChild(const CIdentifier& identifier) override { if (m_mfpOpenChild) { (m_ownerObject.*m_mfpOpenChild)(identifier); } }
  50. void processChildData(const void* buffer, const size_t size) override
  51. {
  52. if (m_mfpProcessChildData) { (m_ownerObject.*m_mfpProcessChildData)(buffer, size); }
  53. }
  54. void closeChild() override { if (m_mfpCloseChild) { (m_ownerObject.*m_mfpCloseChild)(); } }
  55. protected:
  56. TOwnerClass& m_ownerObject;
  57. bool (TOwnerClass::*m_mfpIsMasterChild)(const CIdentifier& identifier);
  58. void (TOwnerClass::*m_mfpOpenChild)(const CIdentifier& identifier);
  59. void (TOwnerClass::*m_mfpProcessChildData)(const void* buffer, size_t size);
  60. void (TOwnerClass::*m_mfpCloseChild)();
  61. };
  62. // ________________________________________________________________________________________________________________
  63. //
  64. } // namespace EBML