This is my wrap codes. I very like AngleScript, hope it from strength to strength. Also, this is my first time to try to write a script engine wrap, thinking is not enough and it is await completed. I like hear some suggestion from you and I'll consummate it continued, thx:) Usage:
class test
{
public:
bool Put(int i)
{
printf("%d\r\n", i);
return true;
}
void Put(float f)
{
printf("%f\r\n", f);
}
void Test()
{
puts("In test");
}
} ;
ScriptWrapBegin(test)
.def_construct()
.def_destruct()
.def_method(void, Test).end()
.def_method_ovlod(bool, Put, (int))
.add_arg("int")
.end()
.def_method_ovlod(void, Put, (float))
.add_arg("float")
.end()
ScriptWrapEnd(test)
template <typename T> class object_wrap_handle;
template <typename T> class object_method_wrap_handle
{
friend class object_wrap_handle<T>;
friend class object_method_wrap_handle<T>;
public:
inline object_method_wrap_handle()
: m_ptr (NULL)
, m_iParamCount (0)
, m_bEnd (false)
{
}
inline object_method_wrap_handle(object_method_wrap_handle<T>* ptr)
: m_ptr (ptr)
, m_iParamCount (0)
, m_bEnd (false)
, m_strCombined (ptr->m_strCombined)
{
}
inline ~object_method_wrap_handle()
{
if (!m_bEnd) end();
}
inline const object_method_wrap_handle<T>& operator = (const object_method_wrap_handle<T>& src)
{
return *this;
}
object_method_wrap_handle<T>& add_arg(const char* pParameter)
{
if (m_iParamCount > 0)
m_strCombined.append(", ", 2);
m_strCombined += pParameter;
m_iParamCount ++;
return *this;
}
object_method_wrap_handle<T>& add_arg_in(const char* pParameter)
{
if (m_iParamCount > 0) m_strCombined += ', ';
m_strCombined += pParameter;
m_strCombined.append(" in", 3);
m_strCombined ++;
return *this;
}
object_method_wrap_handle<T>& add_arg_out(const char* pParameter)
{
return *this;
}
object_method_wrap_handle<T>& add_arg_inout(const char* pParameter)
{
return *this;
}
object_wrap_handle<T>& end()
{
if (!m_bEnd)
{
m_strCombined += ')';
int r = PScriptHandle::GetInstance().RegisterObjectMethod(
m_ptr->m_strClassName.c_str(),
m_strCombined.c_str(),
m_ptr->m_UPtr,
asCALL_THISCALL);
assert(r >= 0 && "script function RegisterObjectMethod()");
m_bEnd = true;
}
return *m_ptr;
}
private:
object_wrap_handle<T>* m_ptr;
String m_strCombined;
word m_iParamCount;
bool m_bEnd;
} ;
template <typename T> class object_wrap_handle
{
friend class object_method_wrap_handle<T>;
private:
static void Construct(T* obj)
{
new(obj) T();
}
static void Destruct(T* obj)
{
obj->~T();
}
public:
~object_wrap_handle()
{
if (m_bFirstDefMethod) register_class();
}
object_wrap_handle<T>& def_class(const char* pClassName)
{
m_strClassName = pClassName;
m_TSize = sizeof(T);
m_bWithConstruct = false;
m_bWithDestruct = false;
m_bWithAssigment = false;
m_bFirstDefMethod = true;
return *this;
}
object_wrap_handle<T>& def_construct()
{
m_bWithConstruct = true;
return *this;
}
object_wrap_handle<T>& def_destruct()
{
m_bWithDestruct = true;
return *this;
}
inline object_method_wrap_handle<T> def_method(asUPtr& UPtr, const char* pMethodName,
const char* pReturnType)
{
object_method_wrap_handle<T> h;
add_method(UPtr, pMethodName, pReturnType, h);
return h;
}
inline object_method_wrap_handle<T> def_method_ovlod(asUPtr& UPtr, const char* pMethodName,
const char* pReturnType)
{
object_method_wrap_handle<T> h;
add_method(UPtr, pMethodName, pReturnType, h);
return h;
}
private:
void register_class()
{
asIScriptEngine& eng = PScriptHandle::GetInstance();
int r;
asDWORD flag = 1;
if (m_bWithConstruct) flag |= asOBJ_CLASS_CONSTRUCTOR;
if (m_bWithDestruct) flag |= asOBJ_CLASS_DESTRUCTOR;
if (m_bWithAssigment) flag |= asOBJ_CLASS_ASSIGNMENT;
r = eng.RegisterObjectType(m_strClassName.c_str(), (int)m_TSize, flag);
assert(r >= 0 && "script function RegisterObjectType()");
if (m_bWithConstruct)
{
r = eng.RegisterObjectBehaviour(m_strClassName.c_str(), asBEHAVE_CONSTRUCT, "void f()",
asFUNCTION(object_wrap_handle<T>::Construct), asCALL_CDECL_OBJLAST);
assert(r >= 0 && "script function RegisterObjectBehaviour() with register a construct function");
}
if (m_bWithDestruct)
{
r = eng.RegisterObjectBehaviour(m_strClassName.c_str(), asBEHAVE_DESTRUCT, "void f()",
asFUNCTION(object_wrap_handle<T>::Destruct), asCALL_CDECL_OBJLAST);
assert(r >= 0 && "script function RegisterObjectBehaviour() with register a destruct function");
}
m_bFirstDefMethod = false;
}
void add_method(asUPtr& UPtr, const char* pMethodName, const char* pReturnType,
object_method_wrap_handle<T>& mhandle)
{
if (m_bFirstDefMethod) register_class();
m_strMethodName = pMethodName;
m_strReturnType = pReturnType;
m_UPtr = UPtr;
mhandle.m_ptr = this;
mhandle.m_strCombined = m_strReturnType;
mhandle.m_strCombined += ' ';
mhandle.m_strCombined += m_strMethodName;
mhandle.m_strCombined += '(';
}
private:
String m_strClassName, m_strMethodName, m_strReturnType;
size_t m_TSize;
bool m_bWithConstruct, m_bWithDestruct, m_bWithAssigment;
bool m_bFirstDefMethod;
asUPtr m_UPtr;
} ;
#define ScriptWrapBegin(ClassName) struct __WrapClassObject__##ClassName{ __WrapClassObject__##ClassName(){ typedef ClassName tClass; object_wrap_handle<ClassName> owh; owh.def_class(#ClassName)
#define def_method(ReturnType, MethodName) def_method(asMETHOD(tClass, MethodName), #MethodName, #ReturnType)
#define def_method_ovlod(ReturnType, MethodName, Parameters) def_method_ovlod(asMETHODPR(tClass, MethodName, Parameters, ReturnType), #MethodName, #ReturnType)
#define ScriptWrapEnd(ClassName) ;} } __WrapClassObject__##ClassName##_Instance;
[Edited by - coollofty on August 18, 2005 10:01:53 PM]