From 91b9d8cc7e1612b812825a7e5c283bd7d24d2c50 Mon Sep 17 00:00:00 2001 From: Steve Lhomme Date: Sat, 3 Apr 2010 06:13:02 +0000 Subject: [PATCH] libebml: add macros to simplify the EBML class item definitions (ID, ClassInfo, SemanticContext) git-svn-id: https://matroska.svn.sourceforge.net/svnroot/matroska/trunk/libebml@66 a6f86f6d-0131-4f8e-9e7b-e335508773d5 --- ebml/EbmlContexts.h | 3 ++- ebml/EbmlElement.h | 34 ++++++++++++++++++++++++++++++++++ src/EbmlContexts.cpp | 4 ++-- src/EbmlCrc32.cpp | 3 +-- src/EbmlDummy.cpp | 6 +++--- src/EbmlHead.cpp | 7 ++----- src/EbmlSubHead.cpp | 30 +++++++----------------------- src/EbmlVoid.cpp | 3 +-- 8 files changed, 52 insertions(+), 38 deletions(-) diff --git a/ebml/EbmlContexts.h b/ebml/EbmlContexts.h index a18fa07..9e9cb65 100644 --- a/ebml/EbmlContexts.h +++ b/ebml/EbmlContexts.h @@ -50,8 +50,9 @@ extern const EbmlSemanticContext EBML_DLL_API EDocType_Context; extern const EbmlSemanticContext EBML_DLL_API EDocTypeVersion_Context; extern const EbmlSemanticContext EBML_DLL_API EDocTypeReadVersion_Context; +#define Context_EbmlHead EbmlHead_Context + // global elements -extern const EbmlSemanticContext EBML_DLL_API EbmlVoid_Context; extern const EbmlSemanticContext EBML_DLL_API & GetEbmlGlobal_Context(); END_LIBEBML_NAMESPACE diff --git a/ebml/EbmlElement.h b/ebml/EbmlElement.h index 47e6cb3..aec3823 100644 --- a/ebml/EbmlElement.h +++ b/ebml/EbmlElement.h @@ -78,6 +78,8 @@ class EbmlStream; class EbmlSemanticContext; class EbmlElement; +extern const EbmlSemanticContext Context_EbmlGlobal; + #if defined(EBML_STRICT_API) #define EBML_CONCRETE_CLASS(Type) \ public: \ @@ -92,6 +94,38 @@ class EbmlElement; private: \ static const EbmlCallbacks ClassInfos; \ + +#define DEFINE_xxx_MASTER(x,id,idl,parent,name,global) \ + const EbmlId Id_##x (id, idl); \ + const EbmlSemanticContext Context_##x = EbmlSemanticContext(countof(ContextList_##x), ContextList_##x, &Context_##parent, global, &EBML_INFO(x)); \ + const EbmlCallbacks x::ClassInfos(x::Create, Id_##x, name, Context_##x); \ + +#define DEFINE_xxx_MASTER_GLOBAL(x,id,idl,name,global) \ + const EbmlId Id_##x (id, idl); \ + const EbmlSemanticContext Context_##x = EbmlSemanticContext(countof(ContextList_##x), ContextList_##x, NULL, global, &EBML_INFO(x)); \ + const EbmlCallbacks x::ClassInfos(x::Create, Id_##x, name, Context_##x); \ + +#define DEFINE_xxx_CLASS(x,id,idl,parent,name,global) \ + const EbmlId Id_##x (id, idl); \ + const EbmlSemanticContext Context_##x = EbmlSemanticContext(0, NULL, &Context_##parent, global, &EBML_INFO(x)); \ + const EbmlCallbacks x::ClassInfos(x::Create, Id_##x, name, Context_##x); \ + +#define DEFINE_xxx_CLASS_GLOBAL(x,id,idl,name,global) \ + const EbmlId Id_##x (id, idl); \ + const EbmlCallbacks x::ClassInfos(x::Create, Id_##x, name, Context_EbmlGlobal); \ + +#define DEFINE_xxx_CLASS_ORPHAN(x,id,idl,name,global) \ + const EbmlId Id_##x (id, idl); \ + const EbmlSemanticContext Context_##x = EbmlSemanticContext(0, NULL, NULL, global, &EBML_INFO(x)); \ + const EbmlCallbacks x::ClassInfos(x::Create, Id_##x, name, Context_##x); \ + +#define DEFINE_EBML_MASTER(x,id,idl,parent,name) DEFINE_xxx_MASTER(x,id,idl,parent,name,*GetEbmlGlobal_Context) +#define DEFINE_EBML_MASTER_GLOBAL(x,id,idl,name) DEFINE_xxx_MASTER_GLOBAL(x,id,idl,name,*GetEbmlGlobal_Context) +#define DEFINE_EBML_CLASS(x,id,idl,parent,name) DEFINE_xxx_CLASS(x,id,idl,parent,name,*GetEbmlGlobal_Context) +#define DEFINE_EBML_CLASS_GLOBAL(x,id,idl,name) DEFINE_xxx_CLASS_GLOBAL(x,id,idl,name,*GetEbmlGlobal_Context) +#define DEFINE_EBML_CLASS_ORPHAN(x,id,idl,name) DEFINE_xxx_CLASS_ORPHAN(x,id,idl,name,*GetEbmlGlobal_Context) + + #define EBML_INFO(ref) ref::ClassInfo() #define EBML_ID(ref) ref::ClassId() #define EBML_CONTEXT(e) (e)->Context() diff --git a/src/EbmlContexts.cpp b/src/EbmlContexts.cpp index 3f6f2ab..9a18412 100644 --- a/src/EbmlContexts.cpp +++ b/src/EbmlContexts.cpp @@ -39,13 +39,13 @@ START_LIBEBML_NAMESPACE -const EbmlSemantic EbmlGlobal_ContextList[2] = +static const EbmlSemantic EbmlGlobal_ContextList[2] = { EbmlSemantic(false, false, EBML_INFO(EbmlCrc32)), ///< EbmlCrc32 EbmlSemantic(false, false, EBML_INFO(EbmlVoid)), ///< EbmlVoid }; -const EbmlSemanticContext EbmlVoid_Context = EbmlSemanticContext(0, NULL, NULL, *GetEbmlGlobal_Context, NULL); +const EbmlSemanticContext Context_EbmlGlobal = EbmlSemanticContext(0, NULL, NULL, *GetEbmlGlobal_Context, NULL); static const EbmlSemanticContext EbmlGlobal_Context = EbmlSemanticContext(countof(EbmlGlobal_ContextList), EbmlGlobal_ContextList, NULL, *GetEbmlGlobal_Context, NULL); diff --git a/src/EbmlCrc32.cpp b/src/EbmlCrc32.cpp index 3484a30..265cc10 100644 --- a/src/EbmlCrc32.cpp +++ b/src/EbmlCrc32.cpp @@ -40,8 +40,7 @@ START_LIBEBML_NAMESPACE -EbmlId EbmlCrc32_TheId(0xBF, 1); -const EbmlCallbacks EbmlCrc32::ClassInfos(EbmlCrc32::Create, EbmlCrc32_TheId, "EBMLCrc32\0ratamadabapa", EbmlVoid_Context); +DEFINE_EBML_CLASS_GLOBAL(EbmlCrc32, 0xBF, 1, "EBMLCrc32\0ratamadabapa"); const uint32 EbmlCrc32::m_tab[] = { #ifdef WORDS_BIGENDIAN diff --git a/src/EbmlDummy.cpp b/src/EbmlDummy.cpp index 266f682..6cefde2 100644 --- a/src/EbmlDummy.cpp +++ b/src/EbmlDummy.cpp @@ -38,8 +38,8 @@ START_LIBEBML_NAMESPACE -const EbmlId EbmlDummy::DummyRawId(0xFF, 1); -const EbmlSemanticContext EbmlDummy_Context = EbmlSemanticContext(0, NULL, NULL, *GetEbmlGlobal_Context, &EBML_INFO(EbmlDummy)); -const EbmlCallbacks EbmlDummy::ClassInfos(NULL, DummyRawId, "DummyElement", EbmlDummy_Context); +DEFINE_EBML_CLASS_ORPHAN(EbmlDummy, 0xFF, 1, "DummyElement"); + +const EbmlId EbmlDummy::DummyRawId = Id_EbmlDummy; END_LIBEBML_NAMESPACE diff --git a/src/EbmlHead.cpp b/src/EbmlHead.cpp index 00c00ed..9c626aa 100644 --- a/src/EbmlHead.cpp +++ b/src/EbmlHead.cpp @@ -39,7 +39,7 @@ START_LIBEBML_NAMESPACE -const EbmlSemantic EbmlHead_ContextList[] = +static const EbmlSemantic ContextList_EbmlHead[7] = { EbmlSemantic(true, true, EBML_INFO(EVersion)), ///< EBMLVersion EbmlSemantic(true, true, EBML_INFO(EReadVersion)), ///< EBMLReadVersion @@ -50,10 +50,7 @@ const EbmlSemantic EbmlHead_ContextList[] = EbmlSemantic(true, true, EBML_INFO(EDocTypeReadVersion)), ///< DocTypeReadVersion }; -const EbmlSemanticContext EbmlHead_Context = EbmlSemanticContext(countof(EbmlHead_ContextList), EbmlHead_ContextList, NULL, *GetEbmlGlobal_Context, &EBML_INFO(EbmlHead)); - -EbmlId EbmlHead_TheId(0x1A45DFA3, 4); -const EbmlCallbacks EbmlHead::ClassInfos(EbmlHead::Create, EbmlHead_TheId, "EBMLHead\0ratamapaga", EbmlHead_Context); +DEFINE_EBML_MASTER_GLOBAL(EbmlHead, 0x1A45DFA3, 4, "EBMLHead\0ratamapaga"); EbmlHead::EbmlHead() :EbmlMaster(EbmlHead_Context) diff --git a/src/EbmlSubHead.cpp b/src/EbmlSubHead.cpp index faaf529..48adb69 100644 --- a/src/EbmlSubHead.cpp +++ b/src/EbmlSubHead.cpp @@ -38,28 +38,12 @@ START_LIBEBML_NAMESPACE -EbmlId EVersion_TheId (0x4286, 2); -EbmlId EReadVersion_TheId (0x42F7, 2); -EbmlId EMaxIdLength_TheId (0x42F2, 2); -EbmlId EMaxSizeLength_TheId (0x42F3, 2); -EbmlId EDocType_TheId (0x4282, 2); -EbmlId EDocTypeVersion_TheId (0x4287, 2); -EbmlId EDocTypeReadVersion_TheId (0x4285, 2); - -const EbmlCallbacks EVersion::ClassInfos(EVersion::Create, EVersion_TheId, "EBMLVersion", EVersion_Context); -const EbmlCallbacks EReadVersion::ClassInfos(EReadVersion::Create, EReadVersion_TheId, "EBMLReadVersion", EReadVersion_Context); -const EbmlCallbacks EMaxIdLength::ClassInfos(EMaxIdLength::Create, EMaxIdLength_TheId, "EBMLMaxIdLength", EMaxIdLength_Context); -const EbmlCallbacks EMaxSizeLength::ClassInfos(EMaxSizeLength::Create, EMaxSizeLength_TheId, "EBMLMaxSizeLength", EMaxSizeLength_Context); -const EbmlCallbacks EDocType::ClassInfos(EDocType::Create, EDocType_TheId, "EBMLDocType", EDocType_Context); -const EbmlCallbacks EDocTypeVersion::ClassInfos(EDocTypeVersion::Create, EDocTypeVersion_TheId, "EBMLDocTypeVersion", EDocTypeVersion_Context); -const EbmlCallbacks EDocTypeReadVersion::ClassInfos(EDocTypeReadVersion::Create, EDocTypeReadVersion_TheId, "EBMLDocTypeReadVersion", EDocTypeReadVersion_Context); - -const EbmlSemanticContext EVersion_Context = EbmlSemanticContext(0, NULL, &EbmlHead_Context, *GetEbmlGlobal_Context, &EBML_INFO(EVersion)); -const EbmlSemanticContext EReadVersion_Context = EbmlSemanticContext(0, NULL, &EbmlHead_Context, *GetEbmlGlobal_Context, &EBML_INFO(EReadVersion)); -const EbmlSemanticContext EMaxIdLength_Context = EbmlSemanticContext(0, NULL, &EbmlHead_Context, *GetEbmlGlobal_Context, &EBML_INFO(EMaxIdLength)); -const EbmlSemanticContext EMaxSizeLength_Context = EbmlSemanticContext(0, NULL, &EbmlHead_Context, *GetEbmlGlobal_Context, &EBML_INFO(EMaxSizeLength)); -const EbmlSemanticContext EDocType_Context = EbmlSemanticContext(0, NULL, &EbmlHead_Context, *GetEbmlGlobal_Context, &EBML_INFO(EDocType)); -const EbmlSemanticContext EDocTypeVersion_Context = EbmlSemanticContext(0, NULL, &EbmlHead_Context, *GetEbmlGlobal_Context, &EBML_INFO(EDocTypeVersion)); -const EbmlSemanticContext EDocTypeReadVersion_Context = EbmlSemanticContext(0, NULL, &EbmlHead_Context, *GetEbmlGlobal_Context, &EBML_INFO(EDocTypeReadVersion)); +DEFINE_EBML_CLASS(EVersion, 0x4286, 2, EbmlHead, "EBMLVersion"); +DEFINE_EBML_CLASS(EReadVersion, 0x42F7, 2, EbmlHead, "EBMLReadVersion"); +DEFINE_EBML_CLASS(EMaxIdLength, 0x42F2, 2, EbmlHead, "EBMLMaxIdLength"); +DEFINE_EBML_CLASS(EMaxSizeLength, 0x42F3, 2, EbmlHead, "EBMLMaxSizeLength"); +DEFINE_EBML_CLASS(EDocType, 0x4282, 2, EbmlHead, "EBMLDocType"); +DEFINE_EBML_CLASS(EDocTypeVersion, 0x4287, 2, EbmlHead, "EBMLDocTypeVersion"); +DEFINE_EBML_CLASS(EDocTypeReadVersion, 0x4285, 2, EbmlHead, "EBMLDocTypeReadVersion"); END_LIBEBML_NAMESPACE diff --git a/src/EbmlVoid.cpp b/src/EbmlVoid.cpp index 84f9163..28564bf 100644 --- a/src/EbmlVoid.cpp +++ b/src/EbmlVoid.cpp @@ -38,8 +38,7 @@ START_LIBEBML_NAMESPACE -EbmlId EbmlVoid_TheId(0xEC, 1); -const EbmlCallbacks EbmlVoid::ClassInfos(EbmlVoid::Create, EbmlVoid_TheId, "EBMLVoid", EbmlVoid_Context); +DEFINE_EBML_CLASS_GLOBAL(EbmlVoid, 0xEC, 1, "EBMLVoid"); EbmlVoid::EbmlVoid() {