📄 ef.h
字号:
// 定义简单类
#define EF_DEFINE_LITE_CLASS_INFO(class_en_name, class_name, help_string, base_classname) \
EF_DEFINE_CLASS_INFO(1, class_en_name, class_name, help_string, base_classname, 0, NULL, EF_S_PUBLIC, -1, myT(""), NULL, NULL, NULL, 0, NULL, 0, NULL, 0, NULL)
// 定义只有常量的类
#define EF_DEFINE_CONST_CLASS_INFO(version, class_en_name, class_name, help_string,state,properties_list, category_index) \
EF_DEFINE_CLASS_INFO(version, class_en_name, class_name, help_string, CLS_sys_Object, 0, NULL, state, category_index, properties_list, NULL, NULL, NULL, 0, NULL, EF_FIELD_COUNT(class_en_name), EF_FIELD_TABLE(class_en_name), 0, NULL)
//////////////////////////////////////////////////////////////////////////
// 定义常量类中的整数常量成员
#define EF_BEGIN_DEFINE_CONST_FIELD_TABLE(class_en_name) EF_STATIC EFFieldInfo _ef_field_table_of_##class_en_name [] = {
#define EF_INT_CONST(name, int_value, help_string) \
{ EF_S_F_CONST | EF_S_PUBLIC | EF_S_F_HAS_INITIAL_VALUE, name, help_string, myT(""), EF_GetStrHash (name), 0, EF_INT, EF_GetStrHash (EF_INT), { 0 }, { int_value } }
#define EF_END_DEFINE_CONST_FIELD_TABLE };
//////////////////////////////////////////////////////////////////////////
#define EF_DEFINE_INTERFACE_INFO(version, interface_en_name, interface_name, help_string, base_interface_name, state, category_index, properties_list, method_count, method_table) \
EFInterfaceInfo _ef_interface_info_of_##interface_en_name = { \
state, \
interface_name, \
help_string, \
properties_list, \
EF_GetStrHash (interface_name), \
0, \
&ef_LibInfo, \
EF_TT_INTERFACE, \
version, \
category_index, \
base_interface_name, \
EF_GetStrHash (base_interface_name), \
method_count, \
method_table \
}; \
EF_STATIC _EF_TypeInfoRecorder _ef_interface_info_recorder_of_##interface_en_name ((EFTypeInfo*)&_ef_interface_info_of_##interface_en_name);
//////////////////////////////////////////////////////////////////////////
#define EF_DEFINE_ENUM_INFO(version, enum_en_name, enum_name, help_string, state, properties_list, category_index) \
EFEnumInfo _ef_enum_info_of_##enum_en_name = { \
state, \
enum_name, \
help_string, \
properties_list, \
EF_GetStrHash (enum_name), \
0, \
&ef_LibInfo, \
EF_TT_ENUM, \
version, \
category_index, \
EF_ENUM_ITEM_COUNT(enum_en_name), \
EF_ENUM_ITEM_TABLE(enum_en_name) \
}; \
EF_STATIC _EF_TypeInfoRecorder _ef_enum_info_recorder_of_##enum_en_name ((EFTypeInfo*)&_ef_enum_info_of_##enum_en_name);
//////////////////////////////////////////////////////////////////////////
// 此全局变量由EF_DEFINE_LIB_INFO定义
extern EFLibInfo ef_LibInfo;
// 以下全局变量由EF_DEFINE_EFN_GLOBAL_VARS定义
extern EFObject* ef_pRuntimeObject;
extern EFClassInfo* ef_pRuntimeClassInfo;
extern EFClassInfo* ef_pGCClassInfo;
#define EF_DEFINE_EFN_GLOBAL_VARS \
EFObject* ef_pRuntimeObject = NULL; \
EFClassInfo* ef_pRuntimeClassInfo = NULL; \
EFClassInfo* ef_pGCClassInfo = NULL;
// 4为runtime对象的“取垃圾收集器类”方法的索引,如果该索引有更改,必须同步修改此宏
// 2为runtime对象的“添加常量区”方法的索引,如果该索引有更改,必须同步修改此宏
// 如果没有libinfo,pLibInfo参数可以提供NULL
#define EF_FILL_EFN_GLOBAL_VARS(pRuntimeObject, pLibInfo) \
ef_pRuntimeObject = pRuntimeObject; \
ASSERT (ef_pRuntimeObject != NULL); \
ef_pRuntimeClassInfo = EF_GET_CLASS_INFO (ef_pRuntimeObject); \
ef_pGCClassInfo = (*(EFClassInfo* (*) ())ef_pRuntimeClassInfo->m_pMethodTable [4].m_func) (); \
((EFConstDataHeader*)&g_EmptyConst)->m_pLibInfo = pLibInfo; \
(*(void (*) (EFConstDataHeader*))ef_pRuntimeClassInfo->m_pMethodTable [2].m_func) ((EFConstDataHeader*)&g_EmptyConst);
#ifdef WIN32
#define EF_EXPORT __declspec(dllexport)
#else
#define EF_EXPORT
#endif
typedef void (*EF_PFN_ON_GET_LIB_INFO) (EFLibInfo* pLibInfo); // 在 EF_GetLibInfo() 被调用时执行的函数指针,可以在其中修改 pLibInfo 中的数据
// 定义类库信息
// 最后一个参数 pfn_on_get_lib_info 的类型为 EF_PFN_ON_GET_LIB_INFO,可以为NULL
// EF_DEFINE_LIB_INFO must be used in .cpp (not .h) file.
#define EF_DEFINE_LIB_INFO(version, build_number, lib_en_name, lib_name, help_string, state, properties_list, language, os_type, type_info_category, depend_files, author, other_info, pfnOnGetLibInfo) \
EF_DEFINE_EFN_GLOBAL_VARS; \
EF_PFN_ON_GET_LIB_INFO _ef_pfnOnGetLibInfo = pfnOnGetLibInfo; \
EFInt EF_NotifyLib (EFLibInfo* pLibInfo, EF_NotifyLibCode enMsg, EFDWord dwParam1, EFDWord dwParam2); \
\
EF_STATIC EFInt _EF_GetTypeInfos (EFLibInfo* pLibInfo, EFTypeInfo** ppTypeInfoBuf, EFInt nBufItemCount) \
{ \
if (ppTypeInfoBuf == NULL) \
{ \
return (_EF_TypeInfoRecorder::sm_pBaseTypeInfoTable == NULL) ? 0 : \
_EF_TypeInfoRecorder::sm_pBaseTypeInfoTable->GetCount (); \
} \
if (_EF_TypeInfoRecorder::sm_pBaseTypeInfoTable == NULL) \
return 0; \
EFTypeInfo* pTypeInfo; \
EF_Text2PtrHashmap::p2p_iterator iter = (_EF_TypeInfoRecorder::sm_pBaseTypeInfoTable)->begin (); \
EFInt i = 0; \
while (i < nBufItemCount && iter.GetValue ((void**)&pTypeInfo)) \
{ \
ppTypeInfoBuf [i++] = pTypeInfo; \
iter.skip (); \
} \
return i; \
} \
EF_STATIC EFTypeInfo* _EF_FindTypeInfo (EFLibInfo* pLibInfo, EFChar* szTypeInfoName) \
{ \
if (_EF_TypeInfoRecorder::sm_pBaseTypeInfoTable == NULL) \
return (EFTypeInfo*)0; \
void* value; \
if ((_EF_TypeInfoRecorder::sm_pBaseTypeInfoTable)->Get (szTypeInfoName, &value) == EF_FALSE) \
return (EFTypeInfo*)0; \
else \
return (EFTypeInfo*)value; \
} \
\
EFLibInfo ef_LibInfo = { \
state, \
lib_name, \
help_string, \
properties_list, \
EF_GetStrHash (lib_name), \
0, \
EF_CURRENT_LIB_FORMAT_VER, \
language, \
os_type, \
version, \
build_number, \
type_info_category, \
depend_files, \
myT(""), \
_EF_GetTypeInfos, \
_EF_FindTypeInfo, \
EF_NotifyLib, \
author, \
other_info, \
0, \
NULL, \
0 \
}; \
extern "C" EF_EXPORT EFLibInfo* EF_GetLibInfo () \
{ \
if (_ef_pfnOnGetLibInfo) \
(*_ef_pfnOnGetLibInfo) (&ef_LibInfo); \
return &ef_LibInfo; \
} \
\
EF_Text2PtrHashmap* _EF_TypeInfoRecorder::sm_pBaseTypeInfoTable = (EF_Text2PtrHashmap*)NULL; \
EF_STATIC _EF_TypeInfoCleaner _ef_BaseTypeInfoTableCleaner; \
\
_EF_TypeInfoRecorder::_EF_TypeInfoRecorder (EFTypeInfo* pBaseTypeInfo) \
{ \
if (sm_pBaseTypeInfoTable == NULL) \
sm_pBaseTypeInfoTable = new EF_Text2PtrHashmap (300, EF_FALSE); \
sm_pBaseTypeInfoTable->Set (pBaseTypeInfo->m_szName, pBaseTypeInfo); \
} \
void _EF_TypeInfoRecorder::CleanUp () \
{ \
if (sm_pBaseTypeInfoTable != (EF_Text2PtrHashmap*)0) \
{ \
delete sm_pBaseTypeInfoTable; \
sm_pBaseTypeInfoTable = (EF_Text2PtrHashmap*)0; \
} \
}
typedef void (*EF_PFN_ON_LOAD_LIB) (EFLibInfo* pLibInfo); // 在收到 EF_NOTIFY_LIB_LOAD 通知时执行的函数指针
typedef void (*EF_PFN_ON_UNLOAD_LIB) (EFLibInfo* pLibInfo); // 在收到 EF_NOTIFY_LIB_UNLOAD 通知时执行的函数指针
// 定义默认的通知处理函数
// 两个参数的类型分别是 EF_PFN_ON_LOAD_LIB, EF_PFN_ON_UNLOAD_LIB,都可以为NULL
#define EF_DEFINE_DEFAULT_NOTIFY_LIB_FUNC(pfnOnLoadLib, pfnOnUnloadLib) \
EF_PFN_ON_LOAD_LIB _ef_pfnOnLoadLib = pfnOnLoadLib; \
EF_PFN_ON_UNLOAD_LIB _ef_pfnOnUnloadLib = pfnOnUnloadLib; \
\
EFInt EF_NotifyLib (EFLibInfo* pLibInfo, EF_NotifyLibCode enMsg, EFDWord dwParam1, EFDWord dwParam2) \
{ \
switch (enMsg) \
{ \
case EF_NOTIFY_LIB_LOAD: \
EF_FILL_EFN_GLOBAL_VARS ((EFObject*)dwParam1, pLibInfo); \
if (_ef_pfnOnLoadLib) \
(*_ef_pfnOnLoadLib) (pLibInfo); \
break; \
case EF_NOTIFY_LIB_UNLOAD: \
if (_ef_pfnOnUnloadLib) \
(*_ef_pfnOnUnloadLib) (pLibInfo); \
break; \
default: \
return EF_ERROR; \
} \
return EF_OK; \
}
////////////////////////////////////////////////////////////////////////
// EF_CM_*, 用于调用对象的成员方法(可能已被子类覆盖)
// EF_OM_*, 用于调用对象的成员方法(未被子类覆盖之前)
// EF_CM_*,EF_OM_* 参数中的 vmethod_index 为虚函数索引(>=0),即,除去静态方法和私有方法之后的方法索引。
#define EF_CM_0(class_index, vmethod_index, ret_datatype, pThis) \
(*(ret_datatype (*) (EFObject*)) (pThis)->m_pObjectInfo->m_aryInfos [class_index].m_pVirtualFuncTable [vmethod_index].m_pfnCurrent) (pThis)
#define EF_OM_0(class_index, vmethod_index, ret_datatype, pThis) \
(*(ret_datatype (*) (EFObject*)) (pThis)->m_pObjectInfo->m_aryInfos [class_index
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -