Revert "Update to SQUIRREL 3.0.4"
[supertux.git] / external / 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         bool Insert(SQInteger idx,const SQObject &val){\r
65                 if(idx < 0 || idx > (SQInteger)_values.size())\r
66                         return false;\r
67                 _values.insert(idx,val);\r
68                 return true;\r
69         }\r
70         void ShrinkIfNeeded() {\r
71                 if(_values.size() <= _values.capacity()>>2) //shrink the array\r
72                         _values.shrinktofit();\r
73         }\r
74         bool Remove(SQInteger idx){\r
75                 if(idx < 0 || idx >= (SQInteger)_values.size())\r
76                         return false;\r
77                 _values.remove(idx);\r
78                 ShrinkIfNeeded();\r
79                 return true;\r
80         }\r
81         void Release()\r
82         {\r
83                 sq_delete(this,SQArray);\r
84         }\r
85         SQObjectPtrVec _values;\r
86 };\r
87 #endif //_SQARRAY_H_\r