moved back to old acc
[vox.git] / src / core / array.cpp
blob35ebce5e437eb0f10fa3aa4aa5a5467bd3722b94
2 #include "pcheader.hpp"
3 #include "utils.hpp"
4 #include "object.hpp"
5 #include "vm.hpp"
6 #include "state.hpp"
8 VXArrayObj::VXArrayObj(VXSharedState *ss,VXInteger nsize)
10 _values.resize(nsize);
11 INIT_CHAIN();
12 ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);
15 VXArrayObj::~VXArrayObj()
17 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
20 VXArrayObj* VXArrayObj::Create(VXSharedState *ss,VXInteger nInitialSize)
22 VXArrayObj *newarray = (VXArrayObj*)VX_MALLOC(sizeof(VXArrayObj));
23 new (newarray) VXArrayObj(ss,nInitialSize);
24 return newarray;
27 void VXArrayObj::Mark(VXCollectable **chain)
29 START_MARK()
30 VXInteger len = _values.size();
31 for(VXInteger i = 0;i < len; i++)
33 VXSharedState::MarkObject(_values[i], chain);
35 END_MARK()
38 VXOType VXArrayObj::GetType()
40 return VX_OT_ARRAY;
43 void VXArrayObj::Finalize()
45 _values.resize(0);
47 bool VXArrayObj::Get(const VXInteger nidx,VXObject &val)
49 if(nidx>=0 && nidx<(VXInteger)_values.size())
51 VXObject &o = _values[nidx];
52 val = VX_REALVAL(o);
53 return true;
55 return false;
58 bool VXArrayObj::Set(const VXInteger nidx,const VXObject &val)
60 if(nidx>=0 && nidx < (VXInteger)_values.size())
62 _values[nidx] = val;
63 return true;
65 else
67 VXObject fill;
68 Resize(nidx + 1, fill);
69 return Set(nidx, val);
71 return false;
74 VXInteger VXArrayObj::Next(const VXObject &refpos, VXObject &outkey, VXObject &outval)
76 VXUnsignedInteger idx=TranslateIndex(refpos);
77 while(idx < _values.size())
79 //first found
80 outkey=(VXInteger)idx;
81 VXObject &o = _values[idx];
82 outval = VX_REALVAL(o);
83 //return idx for the next iteration
84 return ++idx;
86 //nothing to iterate anymore
87 return -1;
90 VXArrayObj* VXArrayObj::Clone()
92 VXArrayObj *anew=Create(_opt_ss(this),0);
93 anew->_values.copy(_values);
94 return anew;
97 VXInteger VXArrayObj::Size() const
99 return _values.size();
102 void VXArrayObj::Resize(VXInteger size)
104 VXObject _null;
105 Resize(size,_null);
108 void VXArrayObj::Resize(VXInteger size,VXObject &fill)
110 _values.resize(size,fill);
111 ShrinkIfNeeded();
114 void VXArrayObj::Reserve(VXInteger size)
116 _values.reserve(size);
119 void VXArrayObj::Append(const VXObject &o)
121 _values.push_back(o);
124 void VXArrayObj::Extend(const VXArrayObj *a)
126 VXInteger xlen;
127 if((xlen=a->Size()))
128 for(VXInteger i=0;i<xlen;i++)
129 Append(a->_values[i]);
133 VXObject& VXArrayObj::Top()
135 return _values.top();
138 void VXArrayObj::Pop()
140 _values.pop_back();
141 ShrinkIfNeeded();
144 bool VXArrayObj::Insert(VXInteger idx,const VXRawObj &val)
146 if(idx < 0 || idx > (VXInteger)_values.size())
148 return false;
150 _values.insert(idx,val);
151 return true;
154 void VXArrayObj::ShrinkIfNeeded()
156 //shrink the array
157 if(_values.size() <= _values.capacity()>>2)
159 _values.shrinktofit();
163 bool VXArrayObj::Remove(VXInteger idx)
165 if(idx < 0 || idx >= (VXInteger)_values.size())
167 return false;
169 _values.remove(idx);
170 ShrinkIfNeeded();
171 return true;
174 void VXArrayObj::Release()
176 vox_delete(this,VXArrayObj);