dea27ae78b079748ef6bebf034319e4abb6679ee
[supertux.git] / external / squirrel / squirrel / squserdata.h
1 /*      see copyright notice in squirrel.h */\r
2 #ifndef _SQUSERDATA_H_\r
3 #define _SQUSERDATA_H_\r
4 \r
5 struct SQUserData : SQDelegable\r
6 {\r
7         SQUserData(SQSharedState *ss){ _delegate = 0; _hook = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain, this); }\r
8         ~SQUserData()\r
9         {\r
10                 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain, this);\r
11                 SetDelegate(NULL);\r
12         }\r
13         static SQUserData* Create(SQSharedState *ss, SQInteger size)\r
14         {\r
15                 SQUserData* ud = (SQUserData*)SQ_MALLOC(sq_aligning(sizeof(SQUserData))+size);\r
16                 new (ud) SQUserData(ss);\r
17                 ud->_size = size;\r
18                 ud->_typetag = 0;\r
19                 return ud;\r
20         }\r
21 #ifndef NO_GARBAGE_COLLECTOR\r
22         void Mark(SQCollectable **chain);\r
23         void Finalize(){SetDelegate(NULL);}\r
24         SQObjectType GetType(){ return OT_USERDATA;}\r
25 #endif\r
26         void Release() {\r
27                 if (_hook) _hook((SQUserPointer)sq_aligning(this + 1),_size);\r
28                 SQInteger tsize = _size;\r
29                 this->~SQUserData();\r
30                 SQ_FREE(this, sq_aligning(sizeof(SQUserData)) + tsize);\r
31         }\r
32         \r
33                 \r
34         SQInteger _size;\r
35         SQRELEASEHOOK _hook;\r
36         SQUserPointer _typetag;\r
37         //SQChar _val[1];\r
38 };\r
39 \r
40 #endif //_SQUSERDATA_H_\r