sqarray.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /* see copyright notice in squirrel.h */
  2. #ifndef _SQARRAY_H_
  3. #define _SQARRAY_H_
  4. struct SQArray : public CHAINABLE_OBJ
  5. {
  6. private:
  7. SQArray(SQSharedState *ss,SQInteger nsize){_values.resize(nsize); INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
  8. ~SQArray()
  9. {
  10. REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
  11. }
  12. public:
  13. static SQArray* Create(SQSharedState *ss,SQInteger nInitialSize){
  14. SQArray *newarray=(SQArray*)SQ_MALLOC(sizeof(SQArray));
  15. new (newarray) SQArray(ss,nInitialSize);
  16. return newarray;
  17. }
  18. #ifndef NO_GARBAGE_COLLECTOR
  19. void Mark(SQCollectable **chain);
  20. SQObjectType GetType() {return OT_ARRAY;}
  21. #endif
  22. void Finalize(){
  23. _values.resize(0);
  24. }
  25. 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. }
  34. SQObjectPtr operator[](SQInteger nidx) {
  35. SQObjectPtr val;
  36. Get(nidx, val);
  37. return val;
  38. }
  39. bool Exists(const SQInteger nidx)
  40. {
  41. return (nidx>=0 && nidx<(SQInteger)_values.size());
  42. }
  43. bool Set(const SQInteger nidx,const SQObjectPtr &val)
  44. {
  45. if(nidx>=0 && nidx<(SQInteger)_values.size()){
  46. _values[nidx]=val;
  47. return true;
  48. }
  49. else return false;
  50. }
  51. SQInteger Next(const SQObjectPtr &refpos,SQObjectPtr &outkey,SQObjectPtr &outval)
  52. {
  53. SQUnsignedInteger idx=SQTranslateIndex(refpos);
  54. while(idx<_values.size()){
  55. //first found
  56. outkey=(SQInteger)idx;
  57. SQObjectPtr &o = _values[idx];
  58. outval = _realval(o);
  59. //return idx for the next iteration
  60. return ++idx;
  61. }
  62. //nothing to iterate anymore
  63. return -1;
  64. }
  65. SQArray *Clone(){SQArray *anew=Create(_opt_ss(this),0); anew->_values.copy(_values); return anew; }
  66. SQInteger Size() const {return _values.size();}
  67. void Resize(SQInteger size)
  68. {
  69. SQObjectPtr _null;
  70. Resize(size,_null);
  71. }
  72. void Resize(SQInteger size,SQObjectPtr &fill) { _values.resize(size,fill); ShrinkIfNeeded(); }
  73. void Reserve(SQInteger size) { _values.reserve(size); }
  74. void Append(const SQObject &o){_values.push_back(o);}
  75. void Extend(const SQArray *a);
  76. SQObjectPtr &Top(){return _values.top();}
  77. void Pop(){_values.pop_back(); ShrinkIfNeeded(); }
  78. bool Insert(SQInteger idx,const SQObject &val){
  79. if(idx < 0 || idx > (SQInteger)_values.size())
  80. return false;
  81. _values.insert(idx,val);
  82. return true;
  83. }
  84. void ShrinkIfNeeded() {
  85. if(_values.size() <= _values.capacity()>>2) //shrink the array
  86. _values.shrinktofit();
  87. }
  88. bool Remove(SQInteger idx){
  89. if(idx < 0 || idx >= (SQInteger)_values.size())
  90. return false;
  91. _values.remove(idx);
  92. ShrinkIfNeeded();
  93. return true;
  94. }
  95. void Release()
  96. {
  97. sq_delete(this,SQArray);
  98. }
  99. SQObjectPtrVec _values;
  100. };
  101. #endif //_SQARRAY_H_