⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ef.h

📁 易语言IDE源代码
💻 H
📖 第 1 页 / 共 5 页
字号:

// 定义简单类
#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 + -