![]() |
Hide Changes |
![]() |
Edit |
![]() |
|
![]() |
Recent Changes |
![]() |
Subscriptions |
![]() |
Lost and Found |
![]() |
Find References |
![]() |
Rename |
![]() |
Administration Page |
![]() |
Topic Locks |
Search |
History
10/4/2007 3:48:11 PM |
-66.139.76.17 |
7/10/2007 3:39:29 PM |
ad-remover-84.49.122.139 |
5/30/2007 12:39:09 PM |
-125.72.28.38 |
5/28/2007 6:49:48 AM |
-69.136.148.27 |
7/11/2006 6:39:44 AM |
-217.76.34.165 |
![]() |
List all versions |
coacel
Change code in SqPlus.h from line
#define DECLARE_INSTANCE_TYPE_NAME_(TYPE,NAME) namespace SqPlus { \
to line
#define SQPLUS_DECLARE_INSTANCE_TYPE_CONST
#include "SqPlusConst.h"
#endif
(lines 532-583 in sqplus.h v20)
to following
#define SQPLUS_DECLARE_TYPE_INFO(TYPE, NAME) \ inline const SQChar * GetTypeName(const TYPE & /*n*/) { return _T(#NAME); } \ template<> \ struct TypeInfo<TYPE> { \ const SQChar * typeName; \ TypeInfo() : typeName(_T(#NAME)) {} \ enum {TypeID=VAR_TYPE_INSTANCE,Size=sizeof(TYPE)}; \ operator ScriptVarType() { return ScriptVarType(TypeID); } \ }; #define SQPLUS_DECLARE_TYPE_OPERATIONS(TYPE, NAME) \ inline bool Match(TypeWrapper<TYPE &>,HSQUIRRELVM v,int idx) { \ return GetInstance<TYPE,false>(v,idx) != NULL; } \ inline bool Match(TypeWrapper<TYPE *>,HSQUIRRELVM v,int idx) { \ return (sq_gettype(v,idx)==OT_NULL) || (GetInstance<TYPE,false>(v,idx) != NULL); } \ inline TYPE & Get(TypeWrapper<TYPE &>,HSQUIRRELVM v,int idx) { \ return *GetInstance<TYPE,true>(v,idx); } \ inline TYPE * Get(TypeWrapper<TYPE *>,HSQUIRRELVM v,int idx) { \ if (sq_gettype(v,idx)==OT_NULL) return NULL;\ return GetInstance<TYPE,true>(v,idx); } \ inline void PushNative(HSQUIRRELVM v,TYPE * value) { \ if (!value) sq_pushnull(v); \ else if (!CreateNativeClassInstance(v,GetTypeName(*value),value,0)) \ throw SquirrelError(_T("Push(): could not create INSTANCE (check registration name)")); } \ inline void PushNative(HSQUIRRELVM /*v*/,TYPE & value) { \ if (!CreateCopyInstance(GetTypeName(value),value)) \ throw SquirrelError(_T("Push(): could not create INSTANCE copy (check registration name)")); } #define SQPLUS_DECLARE_TYPE_PUSH_NATIVE(TYPE, NAME) \ inline void Push(HSQUIRRELVM v,TYPE * value) { PushNative(v, value); } \ inline void Push(HSQUIRRELVM v,TYPE & value) { PushNative(v, value); } #define SQPLUS_DECLARE_TYPE_PUSH_SCRIPTED(TYPE, NAME) \ inline void Push(HSQUIRRELVM v,TYPE * value) { \ if (!value) sq_pushnull(v); \ else if (value->scriptObjHandle._type != OT_NULL) Push(v, SquirrelObject(value->scriptObjHandle)); \ else PushNative(v, value); } \ inline void Push(HSQUIRRELVM v,TYPE & value) { \ if (value.scriptObjHandle._type != OT_NULL) Push(v, SquirrelObject(value.scriptObjHandle)); \ else PushNative(v, value); } #define DECLARE_INSTANCE_TYPE_NAME_(TYPE,NAME) \ namespace SqPlus { \ SQPLUS_DECLARE_TYPE_INFO(TYPE,NAME) \ SQPLUS_DECLARE_TYPE_OPERATIONS(TYPE,NAME) \ SQPLUS_DECLARE_TYPE_PUSH_NATIVE(TYPE,NAME) \ } // nameSpace SqPlus #define DECLARE_INSTANCE_TYPE_NAME_SCRIPTED_(TYPE,NAME) \ namespace SqPlus { \ SQPLUS_DECLARE_TYPE_INFO(TYPE,NAME) \ SQPLUS_DECLARE_TYPE_OPERATIONS(TYPE,NAME) \ SQPLUS_DECLARE_TYPE_PUSH_SCRIPTED(TYPE,NAME) \ } // nameSpace SqPlus #ifndef SQPLUS_CONST_OPT #define DECLARE_INSTANCE_TYPE(TYPE) DECLARE_INSTANCE_TYPE_NAME_(TYPE,TYPE) #define DECLARE_INSTANCE_TYPE_NAME(TYPE,NAME) DECLARE_INSTANCE_TYPE_NAME_(TYPE,NAME) #define DECLARE_INSTANCE_TYPE_SCRIPTED(TYPE) DECLARE_INSTANCE_TYPE_NAME_SCRIPTED_(TYPE,TYPE) #define DECLARE_INSTANCE_TYPE_NAME_SCRIPTED(TYPE,NAME) DECLARE_INSTANCE_TYPE_NAME_SCRIPTED_(TYPE,NAME) #else #define SQPLUS_DECLARE_INSTANCE_TYPE_CONST #include "SqPlusConst.h" #endif
and in in SqPlusConst.h all DECLARE_INSTANCE_TYPE_NAME_SCRIPTED-related code to
#define SQPLUS_DECLARE_TYPE_OPERATIONS_CONST(TYPE, NAME) \ inline bool Match(TypeWrapper<const TYPE &>,HSQUIRRELVM v,int idx) { \ return GetInstance<TYPE,false>(v,idx) != NULL; } \ inline const TYPE & Get(TypeWrapper<const TYPE &>,HSQUIRRELVM v,int idx) { \ return *GetInstance<TYPE,true>(v,idx); } \ inline void PushNative(HSQUIRRELVM v,const TYPE * value) { \ if (!value) sq_pushnull(v); \ else if (!CreateNativeClassInstance(v,GetTypeName(*value),(TYPE*)value,0)) \ throw SquirrelError(_T("Push(): could not create INSTANCE (check registration name)")); } \ inline void PushNative(HSQUIRRELVM /*v*/,const TYPE & value) { \ if (!CreateCopyInstance(GetTypeName(value),value)) \ throw SquirrelError(_T("Push(): could not create INSTANCE copy (check registration name)")); } #define SQPLUS_DECLARE_TYPE_PUSH_NATIVE_CONST(TYPE, NAME) \ inline void Push(HSQUIRRELVM v,const TYPE * value) { PushNative(v, value); } \ inline void Push(HSQUIRRELVM v,const TYPE & value) { PushNative(v, value); } #define SQPLUS_DECLARE_TYPE_PUSH_SCRIPTED_CONST(TYPE, NAME) \ inline void Push(HSQUIRRELVM v, const TYPE * value) { \ if (!value) sq_pushnull(v); \ else if (value->scriptObjHandle._type != OT_NULL) Push(v, SquirrelObject(value->scriptObjHandle)); \ else PushNative(v, value); } \ inline void Push(HSQUIRRELVM v, const TYPE & value) { \ if (value.scriptObjHandle._type != OT_NULL) Push(v, SquirrelObject(value.scriptObjHandle)); \ else PushNative(v, value); } #undef SQPLUS_DECLARE_INSTANCE_TYPE_CONST #define DECLARE_INSTANCE_TYPE_NAME_CONST(TYPE,NAME) \ DECLARE_INSTANCE_TYPE_NAME_(TYPE,NAME) \ namespace SqPlus { \ SQPLUS_DECLARE_TYPE_OPERATIONS_CONST(TYPE, NAME) \ SQPLUS_DECLARE_TYPE_PUSH_NATIVE_CONST(TYPE, NAME) \ } // nameSpace SqPlus #define DECLARE_INSTANCE_TYPE_NAME_SCRIPTED_CONST(TYPE,NAME) \ DECLARE_INSTANCE_TYPE_NAME_SCRIPTED_(TYPE,NAME) \ namespace SqPlus { \ SQPLUS_DECLARE_TYPE_OPERATIONS_CONST(TYPE, NAME) \ SQPLUS_DECLARE_TYPE_PUSH_SCRIPTED_CONST(TYPE, NAME) \ } // nameSpace SqPlus #define DECLARE_INSTANCE_TYPE(TYPE) DECLARE_INSTANCE_TYPE_NAME_CONST(TYPE,TYPE) #define DECLARE_INSTANCE_TYPE_NAME(TYPE,NAME) DECLARE_INSTANCE_TYPE_NAME_CONST(TYPE,NAME) #define DECLARE_INSTANCE_TYPE_SCRIPTED(TYPE) DECLARE_INSTANCE_TYPE_NAME_SCRIPTED_CONST(TYPE,TYPE) #define DECLARE_INSTANCE_TYPE_NAME_SCRIPTED(TYPE,NAME) DECLARE_INSTANCE_TYPE_NAME_SCRIPTED_CONST(TYPE,NAME)
Then it is possible to declare class with DECLARE_INSTANCE_TYPE_SCRIPTED(). Note that it must have member variable
HSQOBJECT scriptObjHandle;
It can be use like
class Walker { HSQOBJECT scriptObjHandle; int construct(HSQUIRRELVM v) { StackHandler sa(v); Walker *self = new Walker(); self->scriptObjHandle = sa.GetObjectHandle(1); self->dieHandler = SqPlus::SquirrelFunction<void>(self->scriptObjHandle, _T("onDie")); int result = SqPlus::PostConstruct<Walker>(v, self, release); sq_addref(v, &self->scriptObjHandle); return result; } ~Walker() { if (!destroyed) { destroyed = true; G_ASSERT(SquirrelVM::GetVMPtr()); onDieHandler.reset(); sq_release(SquirrelVM::GetVMPtr(), &scriptObjHandle); } } } DECLARE_INSTANCE_TYPE_SCRIPTED(Walker)
Now it is possible to subclass this class in script and when passed to script functions it will be exactly the same instance as one that was created.