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
This commit is contained in:
Steve Lhomme 2010-04-03 06:13:02 +00:00
parent 0b3faddd90
commit 91b9d8cc7e
8 changed files with 52 additions and 38 deletions

View File

@ -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

View File

@ -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()

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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()
{