fix cr/lfs and remove trailing whitespaces...
[supertux.git] / src / squirrel / squirrel / sqobject.h
index c448913..ee655b0 100644 (file)
-/*     see copyright notice in squirrel.h */\r
-#ifndef _SQOBJECT_H_\r
-#define _SQOBJECT_H_\r
-\r
-#include "squtils.h"\r
-\r
-#define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R'))\r
-#define SQ_CLOSURESTREAM_PART (('P'<<24)|('A'<<16)|('R'<<8)|('T'))\r
-#define SQ_CLOSURESTREAM_TAIL (('T'<<24)|('A'<<16)|('I'<<8)|('L'))\r
-\r
-struct SQSharedState;\r
-\r
-enum SQMetaMethod{\r
-       MT_ADD=0,\r
-       MT_SUB=1,\r
-       MT_MUL=2,\r
-       MT_DIV=3,\r
-       MT_UNM=4,\r
-       MT_MODULO=5,\r
-       MT_SET=6,\r
-       MT_GET=7,\r
-       MT_TYPEOF=8,\r
-       MT_NEXTI=9,\r
-       MT_CMP=10,\r
-       MT_CALL=11,\r
-       MT_CLONED=12,\r
-       MT_NEWSLOT=13,\r
-       MT_DELSLOT=14,\r
-       MT_TOSTRING=15,\r
-       MT_NEWMEMBER=16,\r
-       MT_INHERITED=17,\r
-       MT_LAST = 18\r
-};\r
-\r
-#define MM_ADD         _SC("_add")\r
-#define MM_SUB         _SC("_sub")\r
-#define MM_MUL         _SC("_mul")\r
-#define MM_DIV         _SC("_div")\r
-#define MM_UNM         _SC("_unm")\r
-#define MM_MODULO      _SC("_modulo")\r
-#define MM_SET         _SC("_set")\r
-#define MM_GET         _SC("_get")\r
-#define MM_TYPEOF      _SC("_typeof")\r
-#define MM_NEXTI       _SC("_nexti")\r
-#define MM_CMP         _SC("_cmp")\r
-#define MM_CALL                _SC("_call")\r
-#define MM_CLONED      _SC("_cloned")\r
-#define MM_NEWSLOT     _SC("_newslot")\r
-#define MM_DELSLOT     _SC("_delslot")\r
-#define MM_TOSTRING    _SC("_tostring")\r
-#define MM_NEWMEMBER _SC("_newmember")\r
-#define MM_INHERITED _SC("_inherited")\r
-\r
-#define MINPOWER2 4\r
-\r
-struct SQRefCounted\r
-{\r
-       SQRefCounted() { _uiRef = 0; _weakref = NULL; }\r
-       virtual ~SQRefCounted();\r
-       SQWeakRef *GetWeakRef(SQObjectType type);\r
-       SQUnsignedInteger _uiRef;\r
-       struct SQWeakRef *_weakref;\r
-       virtual void Release()=0;\r
-};\r
-\r
-struct SQWeakRef : SQRefCounted\r
-{\r
-       void Release();\r
-       SQObject _obj;\r
-};\r
-\r
-#define _realval(o) (type((o)) != OT_WEAKREF?(SQObject)o:_weakref(o)->_obj)\r
-\r
-struct SQObjectPtr;\r
-\r
-#define __AddRef(type,unval) if(ISREFCOUNTED(type))    \\r
-               { \\r
-                       unval.pRefCounted->_uiRef++; \\r
-               }  \r
-\r
-#define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)<=0))     \\r
-               {       \\r
-                       unval.pRefCounted->Release();   \\r
-               }\r
-\r
-#define __ObjRelease(obj) { \\r
-       if((obj)) {     \\r
-               (obj)->_uiRef--; \\r
-               if((obj)->_uiRef == 0) \\r
-                       (obj)->Release(); \\r
-               (obj) = NULL;   \\r
-       } \\r
-}\r
-\r
-#define __ObjAddRef(obj) { \\r
-       (obj)->_uiRef++; \\r
-}\r
-\r
-#define type(obj) ((obj)._type)\r
-#define is_delegable(t) (type(t)&SQOBJECT_DELEGABLE)\r
-#define raw_type(obj) _RAW_TYPE((obj)._type)\r
-\r
-#define _integer(obj) ((obj)._unVal.nInteger)\r
-#define _float(obj) ((obj)._unVal.fFloat)\r
-#define _string(obj) ((obj)._unVal.pString)\r
-#define _table(obj) ((obj)._unVal.pTable)\r
-#define _array(obj) ((obj)._unVal.pArray)\r
-#define _closure(obj) ((obj)._unVal.pClosure)\r
-#define _generator(obj) ((obj)._unVal.pGenerator)\r
-#define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)\r
-#define _userdata(obj) ((obj)._unVal.pUserData)\r
-#define _userpointer(obj) ((obj)._unVal.pUserPointer)\r
-#define _thread(obj) ((obj)._unVal.pThread)\r
-#define _funcproto(obj) ((obj)._unVal.pFunctionProto)\r
-#define _class(obj) ((obj)._unVal.pClass)\r
-#define _instance(obj) ((obj)._unVal.pInstance)\r
-#define _delegable(obj) ((SQDelegable *)(obj)._unVal.pDelegable)\r
-#define _weakref(obj) ((obj)._unVal.pWeakRef)\r
-#define _refcounted(obj) ((obj)._unVal.pRefCounted)\r
-#define _rawval(obj) ((obj)._unVal.pRefCounted)\r
-\r
-#define _stringval(obj) (obj)._unVal.pString->_val\r
-#define _userdataval(obj) (obj)._unVal.pUserData->_val\r
-\r
-#define tofloat(num) ((type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num))\r
-#define tointeger(num) ((type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num))\r
-/////////////////////////////////////////////////////////////////////////////////////\r
-/////////////////////////////////////////////////////////////////////////////////////\r
-struct SQObjectPtr : public SQObject\r
-{\r
-       SQObjectPtr()\r
-       {\r
-               _type=OT_NULL;\r
-               _unVal.pUserPointer=NULL;\r
-       }\r
-       SQObjectPtr(const SQObjectPtr &o)\r
-       {\r
-               _type=o._type;\r
-               _unVal=o._unVal;\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(const SQObject &o)\r
-       {\r
-               _type=o._type;\r
-               _unVal=o._unVal;\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQTable *pTable)\r
-       {\r
-               _type=OT_TABLE;\r
-               _unVal.pTable=pTable;\r
-               assert(_unVal.pTable);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQClass *pClass)\r
-       {\r
-               _type=OT_CLASS;\r
-               _unVal.pClass=pClass;\r
-               assert(_unVal.pClass);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQInstance *pInstance)\r
-       {\r
-               _type=OT_INSTANCE;\r
-               _unVal.pInstance=pInstance;\r
-               assert(_unVal.pInstance);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQArray *pArray)\r
-       {\r
-               _type=OT_ARRAY;\r
-               _unVal.pArray=pArray;\r
-               assert(_unVal.pArray);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQClosure *pClosure)\r
-       {\r
-               _type=OT_CLOSURE;\r
-               _unVal.pClosure=pClosure;\r
-               assert(_unVal.pClosure);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQGenerator *pGenerator)\r
-       {\r
-               _type=OT_GENERATOR;\r
-               _unVal.pGenerator=pGenerator;\r
-               assert(_unVal.pGenerator);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQNativeClosure *pNativeClosure)\r
-       {\r
-               _type=OT_NATIVECLOSURE;\r
-               _unVal.pNativeClosure=pNativeClosure;\r
-               assert(_unVal.pNativeClosure);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQString *pString)\r
-       {\r
-               _type=OT_STRING;\r
-               _unVal.pString=pString;\r
-               assert(_unVal.pString);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQUserData *pUserData)\r
-       {\r
-               _type=OT_USERDATA;\r
-               _unVal.pUserData=pUserData;\r
-               assert(_unVal.pUserData);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQVM *pThread)\r
-       {\r
-               _type=OT_THREAD;\r
-               _unVal.pThread=pThread;\r
-               assert(_unVal.pThread);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQWeakRef *pWeakRef)\r
-       {\r
-               _type=OT_WEAKREF;\r
-               _unVal.pWeakRef=pWeakRef;\r
-               assert(_unVal.pWeakRef);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQFunctionProto *pFunctionProto)\r
-       {\r
-               _type=OT_FUNCPROTO;\r
-               _unVal.pFunctionProto=pFunctionProto;\r
-               assert(_unVal.pFunctionProto);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQInteger nInteger)\r
-       {\r
-               _unVal.pUserPointer=NULL;\r
-               _type=OT_INTEGER;\r
-               _unVal.nInteger=nInteger;\r
-       }\r
-       SQObjectPtr(SQFloat fFloat)\r
-       {\r
-               _unVal.pUserPointer=NULL;\r
-               _type=OT_FLOAT;\r
-               _unVal.fFloat=fFloat;\r
-       }\r
-       SQObjectPtr(bool bBool)\r
-       {\r
-               _unVal.pUserPointer=NULL;\r
-               _type = OT_BOOL;\r
-               _unVal.nInteger = bBool?1:0;\r
-       }\r
-       SQObjectPtr(SQUserPointer pUserPointer)\r
-       {\r
-               _type=OT_USERPOINTER;\r
-               _unVal.pUserPointer=pUserPointer;\r
-       }\r
-       ~SQObjectPtr()\r
-       {\r
-               __Release(_type,_unVal);\r
-       }\r
-       inline void Null()\r
-       {\r
-               __Release(_type,_unVal);\r
-               _type=OT_NULL;\r
-               _unVal.pUserPointer=NULL;\r
-       }\r
-       inline SQObjectPtr& operator=(const SQObjectPtr& obj)\r
-       { \r
-               SQObjectType tOldType;\r
-               SQObjectValue unOldVal;\r
-               tOldType=_type;\r
-               unOldVal=_unVal;\r
-               _unVal = obj._unVal;\r
-               _type = obj._type;\r
-               __AddRef(_type,_unVal);\r
-               __Release(tOldType,unOldVal);\r
-               return *this;\r
-       }\r
-       inline SQObjectPtr& operator=(const SQObject& obj)\r
-       { \r
-               SQObjectType tOldType;\r
-               SQObjectValue unOldVal;\r
-               tOldType=_type;\r
-               unOldVal=_unVal;\r
-               _unVal = obj._unVal;\r
-               _type = obj._type;\r
-               __AddRef(_type,_unVal);\r
-               __Release(tOldType,unOldVal);\r
-               return *this;\r
-       }\r
-       private:\r
-               SQObjectPtr(const SQChar *){} //safety\r
-};\r
-/////////////////////////////////////////////////////////////////////////////////////\r
-#ifndef NO_GARBAGE_COLLECTOR\r
-#define MARK_FLAG 0x80000000\r
-struct SQCollectable : public SQRefCounted {\r
-       SQCollectable *_next;\r
-       SQCollectable *_prev;\r
-       SQSharedState *_sharedstate;\r
-       virtual void Release()=0;\r
-       virtual void Mark(SQCollectable **chain)=0;\r
-       void UnMark();\r
-       virtual void Finalize()=0;\r
-       static void AddToChain(SQCollectable **chain,SQCollectable *c);\r
-       static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);\r
-};\r
-\r
-\r
-#define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)\r
-#define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}\r
-#define CHAINABLE_OBJ SQCollectable\r
-#define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}\r
-#else\r
-\r
-#define ADD_TO_CHAIN(chain,obj) ((void)0)\r
-#define REMOVE_FROM_CHAIN(chain,obj) ((void)0)\r
-#define CHAINABLE_OBJ SQRefCounted\r
-#define INIT_CHAIN() ((void)0)\r
-#endif\r
-\r
-struct SQDelegable : public CHAINABLE_OBJ {\r
-       bool SetDelegate(SQTable *m);\r
-       virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);\r
-       SQTable *_delegate;\r
-};\r
-\r
-SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx);\r
-typedef sqvector<SQObjectPtr> SQObjectPtrVec;\r
-typedef sqvector<SQInteger> SQIntVec;\r
-\r
-\r
-#endif //_SQOBJECT_H_\r
+/*     see copyright notice in squirrel.h */
+#ifndef _SQOBJECT_H_
+#define _SQOBJECT_H_
+
+#include "squtils.h"
+
+#define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R'))
+#define SQ_CLOSURESTREAM_PART (('P'<<24)|('A'<<16)|('R'<<8)|('T'))
+#define SQ_CLOSURESTREAM_TAIL (('T'<<24)|('A'<<16)|('I'<<8)|('L'))
+
+struct SQSharedState;
+
+enum SQMetaMethod{
+       MT_ADD=0,
+       MT_SUB=1,
+       MT_MUL=2,
+       MT_DIV=3,
+       MT_UNM=4,
+       MT_MODULO=5,
+       MT_SET=6,
+       MT_GET=7,
+       MT_TYPEOF=8,
+       MT_NEXTI=9,
+       MT_CMP=10,
+       MT_CALL=11,
+       MT_CLONED=12,
+       MT_NEWSLOT=13,
+       MT_DELSLOT=14,
+       MT_TOSTRING=15,
+       MT_NEWMEMBER=16,
+       MT_INHERITED=17,
+       MT_LAST = 18
+};
+
+#define MM_ADD         _SC("_add")
+#define MM_SUB         _SC("_sub")
+#define MM_MUL         _SC("_mul")
+#define MM_DIV         _SC("_div")
+#define MM_UNM         _SC("_unm")
+#define MM_MODULO      _SC("_modulo")
+#define MM_SET         _SC("_set")
+#define MM_GET         _SC("_get")
+#define MM_TYPEOF      _SC("_typeof")
+#define MM_NEXTI       _SC("_nexti")
+#define MM_CMP         _SC("_cmp")
+#define MM_CALL                _SC("_call")
+#define MM_CLONED      _SC("_cloned")
+#define MM_NEWSLOT     _SC("_newslot")
+#define MM_DELSLOT     _SC("_delslot")
+#define MM_TOSTRING    _SC("_tostring")
+#define MM_NEWMEMBER _SC("_newmember")
+#define MM_INHERITED _SC("_inherited")
+
+#define MINPOWER2 4
+
+struct SQRefCounted
+{
+       SQRefCounted() { _uiRef = 0; _weakref = NULL; }
+       virtual ~SQRefCounted();
+       SQWeakRef *GetWeakRef(SQObjectType type);
+       SQUnsignedInteger _uiRef;
+       struct SQWeakRef *_weakref;
+       virtual void Release()=0;
+};
+
+struct SQWeakRef : SQRefCounted
+{
+       void Release();
+       SQObject _obj;
+};
+
+#define _realval(o) (type((o)) != OT_WEAKREF?(SQObject)o:_weakref(o)->_obj)
+
+struct SQObjectPtr;
+
+#define __AddRef(type,unval) if(ISREFCOUNTED(type))    \
+               { \
+                       unval.pRefCounted->_uiRef++; \
+               }
+
+#define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)<=0))     \
+               {       \
+                       unval.pRefCounted->Release();   \
+               }
+
+#define __ObjRelease(obj) { \
+       if((obj)) {     \
+               (obj)->_uiRef--; \
+               if((obj)->_uiRef == 0) \
+                       (obj)->Release(); \
+               (obj) = NULL;   \
+       } \
+}
+
+#define __ObjAddRef(obj) { \
+       (obj)->_uiRef++; \
+}
+
+#define type(obj) ((obj)._type)
+#define is_delegable(t) (type(t)&SQOBJECT_DELEGABLE)
+#define raw_type(obj) _RAW_TYPE((obj)._type)
+
+#define _integer(obj) ((obj)._unVal.nInteger)
+#define _float(obj) ((obj)._unVal.fFloat)
+#define _string(obj) ((obj)._unVal.pString)
+#define _table(obj) ((obj)._unVal.pTable)
+#define _array(obj) ((obj)._unVal.pArray)
+#define _closure(obj) ((obj)._unVal.pClosure)
+#define _generator(obj) ((obj)._unVal.pGenerator)
+#define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)
+#define _userdata(obj) ((obj)._unVal.pUserData)
+#define _userpointer(obj) ((obj)._unVal.pUserPointer)
+#define _thread(obj) ((obj)._unVal.pThread)
+#define _funcproto(obj) ((obj)._unVal.pFunctionProto)
+#define _class(obj) ((obj)._unVal.pClass)
+#define _instance(obj) ((obj)._unVal.pInstance)
+#define _delegable(obj) ((SQDelegable *)(obj)._unVal.pDelegable)
+#define _weakref(obj) ((obj)._unVal.pWeakRef)
+#define _refcounted(obj) ((obj)._unVal.pRefCounted)
+#define _rawval(obj) ((obj)._unVal.pRefCounted)
+
+#define _stringval(obj) (obj)._unVal.pString->_val
+#define _userdataval(obj) (obj)._unVal.pUserData->_val
+
+#define tofloat(num) ((type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num))
+#define tointeger(num) ((type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num))
+/////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////
+struct SQObjectPtr : public SQObject
+{
+       SQObjectPtr()
+       {
+               _type=OT_NULL;
+               _unVal.pUserPointer=NULL;
+       }
+       SQObjectPtr(const SQObjectPtr &o)
+       {
+               _type=o._type;
+               _unVal=o._unVal;
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(const SQObject &o)
+       {
+               _type=o._type;
+               _unVal=o._unVal;
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQTable *pTable)
+       {
+               _type=OT_TABLE;
+               _unVal.pTable=pTable;
+               assert(_unVal.pTable);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQClass *pClass)
+       {
+               _type=OT_CLASS;
+               _unVal.pClass=pClass;
+               assert(_unVal.pClass);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQInstance *pInstance)
+       {
+               _type=OT_INSTANCE;
+               _unVal.pInstance=pInstance;
+               assert(_unVal.pInstance);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQArray *pArray)
+       {
+               _type=OT_ARRAY;
+               _unVal.pArray=pArray;
+               assert(_unVal.pArray);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQClosure *pClosure)
+       {
+               _type=OT_CLOSURE;
+               _unVal.pClosure=pClosure;
+               assert(_unVal.pClosure);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQGenerator *pGenerator)
+       {
+               _type=OT_GENERATOR;
+               _unVal.pGenerator=pGenerator;
+               assert(_unVal.pGenerator);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQNativeClosure *pNativeClosure)
+       {
+               _type=OT_NATIVECLOSURE;
+               _unVal.pNativeClosure=pNativeClosure;
+               assert(_unVal.pNativeClosure);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQString *pString)
+       {
+               _type=OT_STRING;
+               _unVal.pString=pString;
+               assert(_unVal.pString);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQUserData *pUserData)
+       {
+               _type=OT_USERDATA;
+               _unVal.pUserData=pUserData;
+               assert(_unVal.pUserData);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQVM *pThread)
+       {
+               _type=OT_THREAD;
+               _unVal.pThread=pThread;
+               assert(_unVal.pThread);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQWeakRef *pWeakRef)
+       {
+               _type=OT_WEAKREF;
+               _unVal.pWeakRef=pWeakRef;
+               assert(_unVal.pWeakRef);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQFunctionProto *pFunctionProto)
+       {
+               _type=OT_FUNCPROTO;
+               _unVal.pFunctionProto=pFunctionProto;
+               assert(_unVal.pFunctionProto);
+               __AddRef(_type,_unVal);
+       }
+       SQObjectPtr(SQInteger nInteger)
+       {
+               _unVal.pUserPointer=NULL;
+               _type=OT_INTEGER;
+               _unVal.nInteger=nInteger;
+       }
+       SQObjectPtr(SQFloat fFloat)
+       {
+               _unVal.pUserPointer=NULL;
+               _type=OT_FLOAT;
+               _unVal.fFloat=fFloat;
+       }
+       SQObjectPtr(bool bBool)
+       {
+               _unVal.pUserPointer=NULL;
+               _type = OT_BOOL;
+               _unVal.nInteger = bBool?1:0;
+       }
+       SQObjectPtr(SQUserPointer pUserPointer)
+       {
+               _type=OT_USERPOINTER;
+               _unVal.pUserPointer=pUserPointer;
+       }
+       ~SQObjectPtr()
+       {
+               __Release(_type,_unVal);
+       }
+       inline void Null()
+       {
+               __Release(_type,_unVal);
+               _type=OT_NULL;
+               _unVal.pUserPointer=NULL;
+       }
+       inline SQObjectPtr& operator=(const SQObjectPtr& obj)
+       {
+               SQObjectType tOldType;
+               SQObjectValue unOldVal;
+               tOldType=_type;
+               unOldVal=_unVal;
+               _unVal = obj._unVal;
+               _type = obj._type;
+               __AddRef(_type,_unVal);
+               __Release(tOldType,unOldVal);
+               return *this;
+       }
+       inline SQObjectPtr& operator=(const SQObject& obj)
+       {
+               SQObjectType tOldType;
+               SQObjectValue unOldVal;
+               tOldType=_type;
+               unOldVal=_unVal;
+               _unVal = obj._unVal;
+               _type = obj._type;
+               __AddRef(_type,_unVal);
+               __Release(tOldType,unOldVal);
+               return *this;
+       }
+       private:
+               SQObjectPtr(const SQChar *){} //safety
+};
+/////////////////////////////////////////////////////////////////////////////////////
+#ifndef NO_GARBAGE_COLLECTOR
+#define MARK_FLAG 0x80000000
+struct SQCollectable : public SQRefCounted {
+       SQCollectable *_next;
+       SQCollectable *_prev;
+       SQSharedState *_sharedstate;
+       virtual void Release()=0;
+       virtual void Mark(SQCollectable **chain)=0;
+       void UnMark();
+       virtual void Finalize()=0;
+       static void AddToChain(SQCollectable **chain,SQCollectable *c);
+       static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);
+};
+
+
+#define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
+#define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}
+#define CHAINABLE_OBJ SQCollectable
+#define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}
+#else
+
+#define ADD_TO_CHAIN(chain,obj) ((void)0)
+#define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
+#define CHAINABLE_OBJ SQRefCounted
+#define INIT_CHAIN() ((void)0)
+#endif
+
+struct SQDelegable : public CHAINABLE_OBJ {
+       bool SetDelegate(SQTable *m);
+       virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
+       SQTable *_delegate;
+};
+
+SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx);
+typedef sqvector<SQObjectPtr> SQObjectPtrVec;
+typedef sqvector<SQInteger> SQIntVec;
+
+
+#endif //_SQOBJECT_H_