1 #ifndef _SQUIRREL_OBJECT_H_
2 #define _SQUIRREL_OBJECT_H_
3 
4 // C::B patch: Include required, so references are found
5 #include "sqplus.h"
6 
7 class SquirrelObject
8 {
9 	friend class SquirrelVM;
10 public:
11 	SquirrelObject();
12 	virtual ~SquirrelObject();
13 	SquirrelObject(const SquirrelObject &o);
14 	SquirrelObject(HSQOBJECT o);
15 	SquirrelObject & operator =(const SquirrelObject &o);
16 	SquirrelObject & operator =(SQInteger n);
17 	void AttachToStackObject(SQInteger idx);
18   void Reset(void); // Release (any) reference and reset _o.
19   SquirrelObject Clone();
20 	BOOL_T SetValue(const SquirrelObject &key,const SquirrelObject &val);
21 
22 	BOOL_T SetValue(SQInteger key,const SquirrelObject &val);
23 	BOOL_T SetValue(INT_T key,bool b); // Compiler treats SQBool as INT_T.
24 	BOOL_T SetValue(INT_T key,INT_T n);
25 	BOOL_T SetValue(INT_T key,FLOAT_T f);
26 	BOOL_T SetValue(INT_T key,const SQChar *s);
27 
28 	BOOL_T SetValue(const SQChar *key,const SquirrelObject &val);
29 	BOOL_T SetValue(const SQChar *key,bool b);
30 	BOOL_T SetValue(const SQChar *key,INT_T n);
31 	BOOL_T SetValue(const SQChar *key,FLOAT_T f);
32 	BOOL_T SetValue(const SQChar *key,const SQChar *s);
33 
34   BOOL_T SetUserPointer(const SQChar * key,SQUserPointer up);
35   SQUserPointer GetUserPointer(const SQChar * key);
36   BOOL_T SetUserPointer(INT_T key,SQUserPointer up);
37   SQUserPointer GetUserPointer(INT_T key);
38 
39   BOOL_T NewUserData(const SQChar * key,INT_T size,SQUserPointer * typetag=0);
40   BOOL_T GetUserData(const SQChar * key,SQUserPointer * data,SQUserPointer * typetag=0);
41   BOOL_T RawGetUserData(const SQChar * key,SQUserPointer * data,SQUserPointer * typetag=0);
42 
43   // === BEGIN Arrays ===
44 
45   BOOL_T ArrayResize(INT_T newSize);
46   BOOL_T ArrayExtend(INT_T amount);
47   BOOL_T ArrayReverse(void);
48   SquirrelObject ArrayPop(SQBool returnPoppedVal=SQTrue);
49 
50   void ArrayAppend(const SquirrelObject &o);
51 
52   template<typename T>
53   BOOL_T ArrayAppend(T item);
54 
55   // === END Arrays ===
56 
57 	BOOL_T SetInstanceUP(SQUserPointer up);
58 	BOOL_T IsNull() const;
59 	SQInteger IsNumeric() const;
60 	SQInteger Len() const;
61 	BOOL_T SetDelegate(SquirrelObject &obj);
62 	SquirrelObject GetDelegate();
63 	const SQChar* ToString();
64 	bool ToBool();
65 	SQInteger ToInteger();
66 	SQFloat ToFloat();
67 	SQUserPointer GetInstanceUP(SQUserPointer tag) const;
68 	SquirrelObject GetValue(const SQChar *key) const;
69 	BOOL_T Exists(const SQChar *key) const;
70 	FLOAT_T GetFloat(const SQChar *key) const;
71 	INT_T GetInt(const SQChar *key) const;
72 	const SQChar *GetString(const SQChar *key) const;
73 	bool GetBool(const SQChar *key) const;
74 	SquirrelObject GetValue(INT_T key) const;
75 	FLOAT_T GetFloat(INT_T key) const;
76 	INT_T GetInt(INT_T key) const;
77 	const SQChar *GetString(INT_T key) const;
78 	bool GetBool(INT_T key) const;
79 	SquirrelObject GetAttributes(const SQChar *key = NULL);
80 	SQObjectType GetType();
GetObjectHandle()81 	HSQOBJECT & GetObjectHandle(){return _o;}
82 	BOOL_T BeginIteration();
83 	BOOL_T Next(SquirrelObject &key,SquirrelObject &value);
84 	void EndIteration();
85 
86   BOOL_T GetTypeTag(SQUserPointer * typeTag);
87 
88   // === Get the type name of item/object through string key in a table or class. Returns NULL if the type name is not set (not an SqPlus registered type).
89   const SQChar * GetTypeName(const SQChar * key);
90   // === Get the type name of item/object through INT_T key in a table or class. Returns NULL if the type name is not set (not an SqPlus registered type).
91   const SQChar * GetTypeName(INT_T key);
92   // === Get the type name of this object, else return NULL if not an SqPlus registered type.
93   const SQChar * GetTypeName(void);
94 
95 
96 private:
97 	BOOL_T GetSlot(const SQChar *name) const;
98   BOOL_T RawGetSlot(const SQChar *name) const;
99 	BOOL_T GetSlot(INT_T key) const;
100 	HSQOBJECT _o;
101 };
102 
103 struct StackHandler {
StackHandlerStackHandler104 	StackHandler(HSQUIRRELVM vm) {
105 		_top = sq_gettop(vm);
106 		this->v = vm;
107 	}
GetFloatStackHandler108 	SQFloat GetFloat(SQInteger idx) {
109 		SQFloat x = 0.0f;
110 		if(idx > 0 && idx <= _top) {
111 			sq_getfloat(v,idx,&x);
112 		}
113 		return x;
114 	}
GetIntStackHandler115 	SQInteger GetInt(SQInteger idx) {
116 		SQInteger x = 0;
117 		if(idx > 0 && idx <= _top) {
118 			sq_getinteger(v,idx,&x);
119 		}
120 		return x;
121 	}
GetObjectHandleStackHandler122 	HSQOBJECT GetObjectHandle(SQInteger idx) {
123 		HSQOBJECT x;
124 		if(idx > 0 && idx <= _top) {
125 			sq_resetobject(&x);
126 			sq_getstackobj(v,idx,&x);
127 		}
128 		return x;
129 	}
GetStringStackHandler130 	const SQChar *GetString(SQInteger idx)
131 	{
132     const SQChar *x = NULL;
133 		if(idx > 0 && idx <= _top) {
134 			sq_getstring(v,idx,&x);
135 		}
136 		return x;
137 	}
GetUserPointerStackHandler138 	SQUserPointer GetUserPointer(SQInteger idx)
139 	{
140 		SQUserPointer x = 0;
141 		if(idx > 0 && idx <= _top) {
142 			sq_getuserpointer(v,idx,&x);
143 		}
144 		return x;
145 	}
GetInstanceUpStackHandler146 	SQUserPointer GetInstanceUp(SQInteger idx,SQUserPointer tag)
147 	{
148 		SQUserPointer self;
149 		if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer*)&self,tag)))
150 			return NULL;
151 		return self;
152 	}
153 	SQUserPointer GetUserData(SQInteger idx,SQUserPointer tag=0)
154 	{
155 		SQUserPointer otag;
156 		SQUserPointer up;
157 		if(idx > 0 && idx <= _top) {
158 			if(SQ_SUCCEEDED(sq_getuserdata(v,idx,&up,&otag))) {
159 				if(tag == otag)
160 					return up;
161 			}
162 		}
163 		return NULL;
164 	}
GetBoolStackHandler165 	BOOL_T GetBool(SQInteger idx)
166 	{
167 		SQBool ret;
168 		if(idx > 0 && idx <= _top) {
169 			if(SQ_SUCCEEDED(sq_getbool(v,idx,&ret)))
170 				return ret;
171 		}
172 		return FALSE;
173 	}
GetTypeStackHandler174 	SQInteger GetType(SQInteger idx)
175 	{
176 		if(idx > 0 && idx <= _top) {
177 			return sq_gettype(v,idx);
178 		}
179 		return -1;
180 	}
181 
GetParamCountStackHandler182 	SQInteger GetParamCount() {
183 		return _top;
184 	}
ReturnStackHandler185 	SQInteger Return(const SQChar *s)
186 	{
187 		sq_pushstring(v,s,-1);
188 		return 1;
189 	}
ReturnStackHandler190 	SQInteger Return(FLOAT_T f)
191 	{
192 		sq_pushfloat(v,f);
193 		return 1;
194 	}
ReturnStackHandler195 	SQInteger Return(INT_T i)
196 	{
197 		sq_pushinteger(v,i);
198 		return 1;
199 	}
ReturnStackHandler200 	SQInteger Return(bool b)
201 	{
202 		sq_pushbool(v,b);
203 		return 1;
204 	}
ReturnStackHandler205   SQInteger Return(SQUserPointer p) {
206     sq_pushuserpointer(v,p);
207     return 1;
208   }
ReturnStackHandler209 	SQInteger Return(SquirrelObject &o)
210 	{
211 		sq_pushobject(v,o.GetObjectHandle());
212 		return 1;
213 	}
ReturnStackHandler214 	SQInteger Return() { return 0; }
ThrowErrorStackHandler215 	SQInteger ThrowError(const SQChar *error) {
216 		return sq_throwerror(v,error);
217 	}
GetVMPtrStackHandler218   HSQUIRRELVM GetVMPtr() { return v; }
219 private:
220 	SQInteger _top;
221 	HSQUIRRELVM v;
222 };
223 
224 #endif //_SQUIRREL_OBJECT_H_
225