8fe0411ea5476981fc6d4f1e2df7b84a9fb74068
[supertux.git] / src / 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(sizeof(SQUserData)+(size-1));\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 #endif\r
25         void Release() {\r
26                 if (_hook) _hook(_val,_size);\r
27                 SQInteger tsize = _size - 1;\r
28                 this->~SQUserData();\r
29                 SQ_FREE(this, sizeof(SQUserData) + tsize);\r
30         }\r
31                 \r
32         SQInteger _size;\r
33         SQRELEASEHOOK _hook;\r
34         SQUserPointer _typetag;\r
35         SQChar _val[1];\r
36 };\r
37 \r
38 #endif //_SQUSERDATA_H_\r