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