summaryrefslogtreecommitdiffstats
path: root/squirrel_3_0_1_stable/sqrat/sqrat/sqratClassType.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--squirrel_3_0_1_stable/sqrat/sqrat/sqratClassType.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/squirrel_3_0_1_stable/sqrat/sqrat/sqratClassType.h b/squirrel_3_0_1_stable/sqrat/sqrat/sqratClassType.h
new file mode 100644
index 000000000..35dfcc447
--- /dev/null
+++ b/squirrel_3_0_1_stable/sqrat/sqrat/sqratClassType.h
@@ -0,0 +1,126 @@
+
+//
+// SqratClassType: Type Translators
+//
+
+//
+// Copyright (c) 2009 Brandon Jones
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source
+// distribution.
+//
+
+#if !defined(_SCRAT_CLASSTYPE_H_)
+#define _SCRAT_CLASSTYPE_H_
+
+#include <squirrel.h>
+#include <map>
+
+namespace Sqrat
+{
+
+//
+// ClassType
+//
+
+// Get the Copy Function for this Class
+typedef SQInteger (*COPYFUNC)(HSQUIRRELVM, SQInteger, const void*);
+
+struct ClassTypeData {
+ bool initialized;
+ HSQOBJECT classObj;
+ HSQOBJECT getTable;
+ HSQOBJECT setTable;
+ COPYFUNC copyFunc;
+ ClassTypeData(): initialized(false) {}
+};
+
+template<class C>
+struct ClassType {
+
+ static std::map< HSQUIRRELVM, ClassTypeData > s_classTypeDataMap;
+
+ static inline ClassTypeData& getClassTypeData(HSQUIRRELVM vm) {
+ //TODO: use mutex to lock s_classTypeDataMap in multithreaded environment
+ return s_classTypeDataMap[vm];
+ }
+
+ static inline bool hasClassTypeData(HSQUIRRELVM vm) {
+ //TODO: use mutex to lock s_classTypeDataMap in multithreaded environment
+ return (s_classTypeDataMap.find(vm) != s_classTypeDataMap.end());
+ }
+
+ static inline void deleteClassTypeData(HSQUIRRELVM vm) {
+ //TODO: use mutex to lock s_classTypeDataMap in multithreaded environment
+ std::map< HSQUIRRELVM, ClassTypeData >::iterator it = s_classTypeDataMap.find(vm);
+ if(it != s_classTypeDataMap.end()) {
+ s_classTypeDataMap.erase(it);
+ }
+ }
+
+ // Get the Squirrel Object for this Class
+ static inline HSQOBJECT& ClassObject(HSQUIRRELVM vm) {
+ return getClassTypeData(vm).classObj;
+ }
+
+ // Get the Get Table for this Class
+ static inline HSQOBJECT& GetTable(HSQUIRRELVM vm) {
+ return getClassTypeData(vm).getTable;
+ }
+
+ // Get the Set Table for this Class
+ static inline HSQOBJECT& SetTable(HSQUIRRELVM vm) {
+ return getClassTypeData(vm).setTable;
+ }
+
+ static inline COPYFUNC& CopyFunc(HSQUIRRELVM vm) {
+ return getClassTypeData(vm).copyFunc;
+ }
+
+ static inline bool& Initialized(HSQUIRRELVM vm) {
+ return getClassTypeData(vm).initialized;
+ }
+
+ static void PushInstance(HSQUIRRELVM vm, C* ptr) {
+ sq_pushobject(vm, ClassObject(vm));
+ sq_createinstance(vm, -1);
+ sq_remove(vm, -2);
+ sq_setinstanceup(vm, -1, ptr);
+ }
+
+ static void PushInstanceCopy(HSQUIRRELVM vm, C& value) {
+ sq_pushobject(vm, ClassObject(vm));
+ sq_createinstance(vm, -1);
+ sq_remove(vm, -2);
+ CopyFunc(vm)(vm, -1, &value);
+ }
+
+ static C* GetInstance(HSQUIRRELVM vm, SQInteger idx) {
+ C* ptr = NULL;
+ sq_getinstanceup(vm, idx, (SQUserPointer*)&ptr, NULL);
+ return ptr;
+ }
+};
+
+template<class C>
+std::map< HSQUIRRELVM, ClassTypeData > ClassType<C>::s_classTypeDataMap;
+
+}
+
+#endif