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