28 #if !defined(_SCRAT_CLASSTYPE_H_)
29 #define _SCRAT_CLASSTYPE_H_
34 #include "sqratUtil.h"
42 typedef SQInteger (*COPYFUNC)(HSQUIRRELVM, SQInteger,
const void*);
45 struct ClassTypeDataBase {
51 ClassTypeDataBase* baseClass;
53 virtual ~ClassTypeDataBase() {}
54 virtual SQUserPointer Cast(SQUserPointer ptr, SQUserPointer classType) = 0;
55 ClassTypeDataBase() : ctorCalled(false){}
59 template<
class C,
class B>
60 struct ClassTypeData :
public ClassTypeDataBase {
61 virtual SQUserPointer Cast(SQUserPointer ptr, SQUserPointer classType) {
62 if (classType !=
this) {
63 ptr = baseClass->Cast(static_cast<B*>(static_cast<C*>(ptr)), classType);
73 static std::map< HSQUIRRELVM, ClassTypeDataBase* > s_classTypeDataMap;
75 static inline ClassTypeDataBase*& getClassTypeData(HSQUIRRELVM vm) {
77 return s_classTypeDataMap[vm];
80 static inline bool hasClassTypeData(HSQUIRRELVM vm) {
82 return (s_classTypeDataMap.find(vm) != s_classTypeDataMap.end());
85 static inline void deleteClassTypeData(HSQUIRRELVM vm) {
87 std::map< HSQUIRRELVM, ClassTypeDataBase* >::iterator it = s_classTypeDataMap.find(vm);
88 if(it != s_classTypeDataMap.end()) {
89 s_classTypeDataMap.erase(it);
94 static inline HSQOBJECT& ClassObject(HSQUIRRELVM vm) {
95 return getClassTypeData(vm)->classObj;
99 static inline HSQOBJECT& GetTable(HSQUIRRELVM vm) {
100 return getClassTypeData(vm)->getTable;
104 static inline HSQOBJECT& SetTable(HSQUIRRELVM vm) {
105 return getClassTypeData(vm)->setTable;
108 static inline COPYFUNC& CopyFunc(HSQUIRRELVM vm) {
109 return getClassTypeData(vm)->copyFunc;
112 static inline string& ClassName(HSQUIRRELVM vm) {
113 return getClassTypeData(vm)->className;
116 static inline ClassTypeDataBase*& BaseClass(HSQUIRRELVM vm) {
117 return getClassTypeData(vm)->baseClass;
120 static void PushInstance(HSQUIRRELVM vm, C* ptr) {
121 #if !defined (SCRAT_NO_ERROR_CHECKING)
123 sq_pushobject(vm, ClassObject(vm));
124 sq_createinstance(vm, -1);
126 sq_setinstanceup(vm, -1, ptr);
131 sq_pushobject(vm, ClassObject(vm));
132 sq_createinstance(vm, -1);
134 sq_setinstanceup(vm, -1, ptr);
138 static void PushInstanceCopy(HSQUIRRELVM vm,
const C& value) {
139 sq_pushobject(vm, ClassObject(vm));
140 sq_createinstance(vm, -1);
142 CopyFunc(vm)(vm, -1, &value);
145 static C* GetInstance(HSQUIRRELVM vm, SQInteger idx) {
146 SQUserPointer ptr = NULL;
147 ClassTypeDataBase* classType = getClassTypeData(vm);
150 #if !defined (SCRAT_NO_ERROR_CHECKING)
151 if (SQ_FAILED(sq_getinstanceup(vm, idx, &ptr, classType))) {
156 sq_getinstanceup(vm, idx, &ptr, 0);
161 #if !defined (SCRAT_NO_ERROR_CHECKING)
166 ClassTypeDataBase* actualType;
167 sq_gettypetag(vm, idx, (SQUserPointer*)&actualType);
168 if (actualType == NULL) {
169 SQInteger top = sq_gettop(vm);
170 sq_getclass(vm, idx);
171 while (actualType == NULL) {
173 sq_gettypetag(vm, -1, (SQUserPointer*)&actualType);
177 if (classType != actualType) {
178 return static_cast<C*
>(actualType->Cast(ptr, classType));
180 return static_cast<C*
>(ptr);
185 std::map< HSQUIRRELVM, ClassTypeDataBase* > ClassType<C>::s_classTypeDataMap;
static string FormatTypeError(HSQUIRRELVM vm, SQInteger idx, const string &expectedType)
Definition: sqratUtil.h:149
static Error & Instance()
Definition: sqratUtil.h:134
void Throw(HSQUIRRELVM vm, const string &err)
Definition: sqratUtil.h:210