19#ifndef OC_TEMPLATE_LIB_H
20#define OC_TEMPLATE_LIB_H
22#include <Library/BaseMemoryLib.h>
38#define PRIV_OC_STRUCTOR_IGNORE(...)
39#define PRIV_OC_STRUCTOR_EXPAND(...) __VA_ARGS__
41#define PRIV_OC_SELECT_NEXT_INNER(Dummy, Next, ...) Next
47#define PRIV_OC_SELECT_NEXT_INNER_INDIR(...) PRIV_OC_SELECT_NEXT_INNER __VA_ARGS__
48#define PRIV_OC_SELECT_NEXT(...) PRIV_OC_SELECT_NEXT_INNER_INDIR((__VA_ARGS__, Unused))
49#define PRIV_OC_REMOVE_NEXT(...) , do { } while (0),
51#define PRIV_OC_DECLARE_STRUCT_MEMBER(Type, Name, Suffix, Constructor, Destructor) \
54#define PRIV_OC_CONSTRUCT_STRUCT_MEMBER(Type, Name, Suffix, Constructor, Destructor) \
57#define PRIV_OC_DESTRUCT_STRUCT_MEMBER(Type, Name, Suffix, Constructor, Destructor) \
58 PRIV_OC_SELECT_NEXT(PRIV_OC_REMOVE_NEXT Destructor, Destructor(&Obj->Name, sizeof (Type Suffix)));
60#define PRIV_OC_INVOKE_DESTRUCTOR(Destructor, Obj, Size) \
61 PRIV_OC_SELECT_NEXT(PRIV_OC_REMOVE_NEXT Destructor, Destructor(Obj, Size))
63#define PRIV_NO_KEY_TYPE UINT8
73#define NAME_FIELDS(_, __) \
74 _(Type, Name, Type Suffix, __(Constant Initializer), Destructor Function) \
75 _(Type, Name, Type Suffix, OC_CONSTR(Type, _, __), OC_DESTR(Type))
79#define OC_DECLARE(Name) \
80 typedef struct Name ## _ { \
81 Name ## _FIELDS (PRIV_OC_DECLARE_STRUCT_MEMBER, PRIV_OC_STRUCTOR_IGNORE) \
83 VOID Name ## _CONSTRUCT(VOID *Ptr, UINT32 Size); \
84 VOID Name ## _DESTRUCT(VOID *Ptr, UINT32 Size);
91#define OC_STRUCTORS(Name, Destructor) \
92 VOID Name ## _CONSTRUCT(VOID *Ptr, UINT32 Size) { \
94 Name ## _FIELDS(PRIV_OC_CONSTRUCT_STRUCT_MEMBER, PRIV_OC_STRUCTOR_EXPAND) \
96 CopyMem (Ptr, &Obj, sizeof (Name)); \
98 VOID Name ## _DESTRUCT(VOID *Ptr, UINT32 Size) { \
99 Name *Obj = (Name *) Ptr; (VOID) Obj; \
100 PRIV_OC_INVOKE_DESTRUCTOR(Destructor, Obj, sizeof (Name)); \
101 Name ## _FIELDS(PRIV_OC_DESTRUCT_STRUCT_MEMBER, PRIV_OC_STRUCTOR_EXPAND) \
115#define OC_CONSTR(A, _, __) {A ## _FIELDS(_, __)}
116#define OC_CONSTR1(A, _, __) {A ## _FIELDS(_, __)}
117#define OC_CONSTR2(A, _, __) {A ## _FIELDS(_, __)}
118#define OC_CONSTR3(A, _, __) {A ## _FIELDS(_, __)}
119#define OC_CONSTR5(A, _, __) {A ## _FIELDS(_, __)}
120#define OC_DESTR(A) A ## _DESTRUCT
126#define OC_BLOB(Type, Count, Default, _, __) \
127 _(UINT32 , Size , , 0 , OcZeroField ) \
128 _(UINT32 , MaxSize , , sizeof (Type Count) , OcZeroField ) \
129 _(Type * , DynValue , , NULL , OcFreePointer ) \
130 _(Type , Value , Count , __(Default) , () )
132#define OC_BLOB_STRUCTORS(Name) \
133 OC_STRUCTORS(Name, ())
135#define OC_BLOB_CONSTR(Type, Constructor, SizeConstructor, _, __) \
136 __({.Size = SizeConstructor, .MaxSize = sizeof (((Type *)0)->Value), .DynValue = NULL, .Value = Constructor})
142#define CONT_FIELDS(_, __) \
143 OC_MAP (KEY, ELEM, _, __)
148#define OC_MAP(KeyType, Type, _, __) \
149 _(UINT32 , Count , , 0 , () ) \
150 _(UINT32 , AllocCount , , 0 , () ) \
151 _(OC_STRUCTOR , Construct , , Type ## _CONSTRUCT , () ) \
152 _(OC_STRUCTOR , Destruct , , Type ## _DESTRUCT , () ) \
153 _(Type ** , Values , , NULL , () ) \
154 _(UINT32 , ValueSize , , sizeof (Type) , () ) \
155 _(UINT32 , KeySize , , sizeof (KeyType) , () ) \
156 _(OC_STRUCTOR , KeyConstruct , , KeyType ## _CONSTRUCT , () ) \
157 _(OC_STRUCTOR , KeyDestruct , , KeyType ## _DESTRUCT , () ) \
158 _(KeyType ** , Keys , , NULL , () )
160#define OC_MAP_STRUCTORS(Name) \
161 OC_STRUCTORS(Name, OcFreeMap)
167#define CONT_FIELDS(_, __) \
168 OC_ARRAY (ELEM, _, __)
173#define OC_ARRAY(Type, _, __) \
174 _(UINT32 , Count , , 0 , () ) \
175 _(UINT32 , AllocCount , , 0 , () ) \
176 _(OC_STRUCTOR , Construct , , Type ## _CONSTRUCT , () ) \
177 _(OC_STRUCTOR , Destruct , , Type ## _DESTRUCT , () ) \
178 _(Type ** , Values , , NULL , () ) \
179 _(UINT32 , ValueSize , , sizeof (Type) , () )
181#define OC_ARRAY_STRUCTORS(Name) \
182 OC_STRUCTORS(Name, OcFreeArray)
241 UINT32 **OutSize OPTIONAL
247#define OC_BLOB_GET(Blob) (((Blob)->DynValue) != NULL ? ((Blob)->DynValue) : ((Blob)->Value))
266#define OC_STRING_FIELDS(_, __) \
267 OC_BLOB (CHAR8, [64], {0}, _, __)
270#define OC_STRING_CONSTR(Constructor, _, __) \
271 OC_BLOB_CONSTR (OC_STRING, __(Constructor), sizeof (Constructor), _, __)
273#define OC_ESTRING_CONSTR(_, __) \
274 OC_BLOB_CONSTR (OC_STRING, __(""), 0, _, __)
276#define OC_DATA_FIELDS(_, __) \
277 OC_BLOB (UINT8, [64], {0}, _, __)
280#define OC_EDATA_CONSTR(_, __) \
281 OC_BLOB_CONSTR (OC_DATA, __({0}), 0, _, __)
283#define OC_DATA_CONSTR(Constructor, _, __) \
284 OC_BLOB_CONSTR (OC_DATA, __(Constructor), sizeof ((UINT8[]) Constructor), _, __)
286#define OC_ASSOC_FIELDS(_, __) \
287 OC_MAP (OC_STRING, OC_DATA, _, __)
DMG_SIZE_DEVICE_PATH Size
VOID OcDestructEmpty(VOID *Pointer, UINT32 Size)
VOID OcZeroField(VOID *Pointer, UINT32 Size)
VOID OcFreeMap(VOID *Pointer, UINT32 Size)
VOID OcFreeArray(VOID *Pointer, UINT32 Size)
BOOLEAN OcListEntryAllocate(VOID *Pointer, VOID **Value, VOID **Key)
VOID OcFreePointer(VOID *Pointer, UINT32 Size)
VOID * OcBlobAllocate(VOID *Pointer, UINT32 Size, UINT32 **OutSize OPTIONAL)
VOID(* OC_STRUCTOR)(VOID *Ptr, UINT32 Size)