ULRE/inc/hgl/platform/compiler/EventFunc.h

251 lines
5.0 KiB
C
Raw Normal View History

2018-11-27 15:43:32 +08:00
#ifndef HGL_EVENT_FUNC_INCLUDE
#define HGL_EVENT_FUNC_INCLUDE
#include<hgl/type/_Object.h>
#include<string.h>
namespace hgl
{
#ifdef __BORLANDC__
#define SetEventCall(event_obj,obj_this,class_name,event_func) event_obj=obj_this->class_name::event_func
#define SafeCallEvent(event_obj,intro) {if(event_obj)event_obj intro;}
#define CallEvent(event_obj,intro) event_obj intro
#define DefEvent(result,name,intro) result (__closure *name)intro
#else
template <typename RT,typename Func> struct EventFunc
{
typedef EventFunc<RT,Func> SelfClass;
union
{
void *vp_this;
_Object *this_pointer;
};
union
{
void *vp_func;
Func func_pointer;
ObjectMemberFunc omf;
};
public:
EventFunc()
{
ClearFunc();
}
EventFunc(void *t,void *f)
{
ClearFunc();
vp_this=t;
vp_func=f;
}
void ClearFunc()
{
memset(this,0,sizeof(SelfClass));
}
bool operator !()const
{
if(!vp_func)return(true);
return(false);
}
void operator = (void *v)
{
if(v==0)
memset(this,0,sizeof(SelfClass)); //omf可能不止一个指针的长度所以必须这样清
}
void operator = (const SelfClass &ef)
{
memcpy(this,&ef,sizeof(SelfClass));
}
bool operator == (void *v)
{
return(vp_func==v);
}
bool operator != (void *v)
{
return(vp_func!=v);
}
template<typename ...ARGS>
RT operator()(ARGS...args)
{
return (this_pointer->*(func_pointer))(args...);
}
template<typename ...ARGS>
RT operator()(ARGS...args)const
{
return (this_pointer->*(func_pointer))(args...);
}
template<typename ...ARGS>
RT ThisCall(void *tp,ARGS...args)
{
return (((_Object *)tp)->*(func_pointer))(args...);
}
template<typename ...ARGS>
RT ThisCall(void *tp,ARGS...args)const
{
return (((_Object *)tp)->*(func_pointer))(args...);
}
};//template<typename RT,typename Func> struct EventFunc
template<typename Func> struct EventFunc<void,Func>
{
typedef EventFunc<void,Func> SelfClass;
union
{
void *vp_this;
_Object *this_pointer;
};
union
{
void *vp_func;
Func func_pointer;
ObjectMemberFunc omf;
};
public:
EventFunc()
{
memset(this,0,sizeof(SelfClass));
}
EventFunc(void *t,void *f)
{
memset(this,0,sizeof(SelfClass));
vp_this=t;
vp_func=f;
}
bool operator !()const
{
if(!vp_func)return(true);
return(false);
}
void operator = (void *v)
{
if(v==0)
memset(this,0,sizeof(SelfClass)); //omf可能不止一个指针的长度所以必须这样清
}
void operator = (const SelfClass &ef)
{
memcpy(this,&ef,sizeof(SelfClass));
}
bool operator == (void *v)
{
return(vp_func==v);
}
bool operator != (void *v)
{
return(vp_func!=v);
}
template<typename ...ARGS>
void operator()(ARGS...args)
{
(this_pointer->*(func_pointer))(args...);
}
template<typename ...ARGS>
void operator()(ARGS...args)const
{
(this_pointer->*(func_pointer))(args...);
}
template<typename ...ARGS>
void ThisCall(void *tp,ARGS...args)
{
(((_Object *)tp)->*(func_pointer))(args...);
}
template<typename ...ARGS>
void ThisCall(void *tp,ARGS...args)const
{
(((_Object *)tp)->*(func_pointer))(args...);
}
};//template<void,typename Func> struct EventFunc
#define SetEventCall(event_obj,obj_this,class_name,event_func) { \
event_obj.vp_this=obj_this; \
event_obj.vp_func=GetMemberFuncPointer(class_name,event_func); \
}
#define SetEventThis(event_obj,obj_this) event_obj.vp_this=obj_this;
// #define CallEvent(event_obj,intro) ((event_obj.this_pointer->*(event_obj.func_pointer))intro)
#define SafeCallEvent(event_obj,intro) {if(event_obj.vp_func)event_obj intro;}
#define DefEvent(result,name,intro) EventFunc<result,result (_Object:: *)intro> name;
#endif//__BORLANDC__
/*
使:
class Example
{
//原Borland/CodeGear方式
void (__closure *OnClick)(Object *);
//现通用方式
DefEvent(void,OnClick,(Object *));
};
void Test::ClickProc(Object *);
void Test::func()
{
Example *exp;
{
//原Borland/CodeGear方式
exp->OnClick=this->ClickProc;
exp->OnClick=ClickProc;
//现通用方式
SetEventCall(exp->OnClick,this,Test,ClickProc);
}
{
//原Borland/CodeGear方式
exp->OnClick(nullptr);
//现通用方式
CallEvent(exp->OnClick,(nullptr));
//C++11方式
exp->OnClick(nullptr);
}
}
*/
}//namespace hgl
#endif//HGL_EVENT_FUNC_INCLUDE