this shouldn't be in svn
[supertux.git] / src / squirrel / squirrel / sqarray.h
1 /*      see copyright notice in squirrel.h */\r
2 #ifndef _SQARRAY_H_\r
3 #define _SQARRAY_H_\r
4 \r
5 struct SQArray : public CHAINABLE_OBJ\r
6 {\r
7 private:\r
8         SQArray(SQSharedState *ss,SQInteger nsize){_values.resize(nsize); INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}\r
9         ~SQArray()\r
10         {\r
11                 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);\r
12         }\r
13 public:\r
14         static SQArray* Create(SQSharedState *ss,SQInteger nInitialSize){\r
15                 SQArray *newarray=(SQArray*)SQ_MALLOC(sizeof(SQArray));\r
16                 new (newarray) SQArray(ss,nInitialSize);\r
17                 return newarray;\r
18         }\r
19 #ifndef NO_GARBAGE_COLLECTOR\r
20         void Mark(SQCollectable **chain);\r
21 #endif\r
22         void Finalize(){\r
23                 _values.resize(0);\r
24         }\r
25         bool Get(const SQInteger nidx,SQObjectPtr &val)\r
26         {\r
27                 if(nidx>=0 && nidx<(SQInteger)_values.size()){\r
28                         SQObjectPtr &o = _values[nidx];\r
29                         val = _realval(o);\r
30                         return true;\r
31                 }\r
32                 else return false;\r
33         }\r
34         bool Set(const SQInteger nidx,const SQObjectPtr &val)\r
35         {\r
36                 if(nidx>=0 && nidx<(SQInteger)_values.size()){\r
37                         _values[nidx]=val;\r
38                         return true;\r
39                 }\r
40                 else return false;\r
41         }\r
42         SQInteger Next(const SQObjectPtr &refpos,SQObjectPtr &outkey,SQObjectPtr &outval)\r
43         {\r
44                 SQUnsignedInteger idx=TranslateIndex(refpos);\r
45                 while(idx<_values.size()){\r
46                         //first found\r
47                         outkey=(SQInteger)idx;\r
48                         SQObjectPtr &o = _values[idx];\r
49                         outval = _realval(o);\r
50                         //return idx for the next iteration\r
51                         return ++idx;\r
52                 }\r
53                 //nothing to iterate anymore\r
54                 return -1;\r
55         }\r
56         SQArray *Clone(){SQArray *anew=Create(_opt_ss(this),Size()); anew->_values.copy(_values); return anew; }\r
57         SQInteger Size() const {return _values.size();}\r
58         void Resize(SQInteger size,SQObjectPtr &fill = _null_) { _values.resize(size,fill); ShrinkIfNeeded(); }\r
59         void Reserve(SQInteger size) { _values.reserve(size); }\r
60         void Append(const SQObject &o){_values.push_back(o);}\r
61         void Extend(const SQArray *a);\r
62         SQObjectPtr &Top(){return _values.top();}\r
63         void Pop(){_values.pop_back(); ShrinkIfNeeded(); }\r
64         void Insert(const SQObject& idx,const SQObject &val){_values.insert((SQUnsignedInteger)tointeger(idx),val);}\r
65         void ShrinkIfNeeded() {\r
66                 if(_values.size() <= _values.capacity()>>2) //shrink the array\r
67                         _values.shrinktofit();\r
68         }\r
69         void Remove(SQUnsignedInteger idx){\r
70                 _values.remove(idx);\r
71                 ShrinkIfNeeded();\r
72         }\r
73         void Release()\r
74         {\r
75                 sq_delete(this,SQArray);\r
76         }\r
77         SQObjectPtrVec _values;\r
78 };\r
79 #endif //_SQARRAY_H_\r