xref: /aosp_15_r20/external/lzma/CPP/Common/MyVector.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Common/MyVector.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMMON_MY_VECTOR_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMMON_MY_VECTOR_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include <string.h>
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "Common.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker const unsigned k_VectorSizeMax = ((unsigned)1 << 31) - 1;
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker template <class T>
13*f6dc9357SAndroid Build Coastguard Worker class CRecordVector
14*f6dc9357SAndroid Build Coastguard Worker {
15*f6dc9357SAndroid Build Coastguard Worker   T *_items;
16*f6dc9357SAndroid Build Coastguard Worker   unsigned _size;
17*f6dc9357SAndroid Build Coastguard Worker   unsigned _capacity;
18*f6dc9357SAndroid Build Coastguard Worker 
MoveItems(unsigned destIndex,unsigned srcIndex)19*f6dc9357SAndroid Build Coastguard Worker   void MoveItems(unsigned destIndex, unsigned srcIndex)
20*f6dc9357SAndroid Build Coastguard Worker   {
21*f6dc9357SAndroid Build Coastguard Worker     memmove(_items + destIndex, _items + srcIndex, (size_t)(_size - srcIndex) * sizeof(T));
22*f6dc9357SAndroid Build Coastguard Worker   }
23*f6dc9357SAndroid Build Coastguard Worker 
ReAllocForNewCapacity(const unsigned newCapacity)24*f6dc9357SAndroid Build Coastguard Worker   void ReAllocForNewCapacity(const unsigned newCapacity)
25*f6dc9357SAndroid Build Coastguard Worker   {
26*f6dc9357SAndroid Build Coastguard Worker     T *p;
27*f6dc9357SAndroid Build Coastguard Worker     Z7_ARRAY_NEW(p, T, newCapacity)
28*f6dc9357SAndroid Build Coastguard Worker     // p = new T[newCapacity];
29*f6dc9357SAndroid Build Coastguard Worker     if (_size != 0)
30*f6dc9357SAndroid Build Coastguard Worker       memcpy(p, _items, (size_t)_size * sizeof(T));
31*f6dc9357SAndroid Build Coastguard Worker     delete []_items;
32*f6dc9357SAndroid Build Coastguard Worker     _items = p;
33*f6dc9357SAndroid Build Coastguard Worker     _capacity = newCapacity;
34*f6dc9357SAndroid Build Coastguard Worker   }
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker public:
37*f6dc9357SAndroid Build Coastguard Worker 
ReserveOnePosition()38*f6dc9357SAndroid Build Coastguard Worker   void ReserveOnePosition()
39*f6dc9357SAndroid Build Coastguard Worker   {
40*f6dc9357SAndroid Build Coastguard Worker     if (_size != _capacity)
41*f6dc9357SAndroid Build Coastguard Worker       return;
42*f6dc9357SAndroid Build Coastguard Worker     if (_capacity >= k_VectorSizeMax)
43*f6dc9357SAndroid Build Coastguard Worker       throw 2021;
44*f6dc9357SAndroid Build Coastguard Worker     const unsigned rem = k_VectorSizeMax - _capacity;
45*f6dc9357SAndroid Build Coastguard Worker     unsigned add = (_capacity >> 2) + 1;
46*f6dc9357SAndroid Build Coastguard Worker     if (add > rem)
47*f6dc9357SAndroid Build Coastguard Worker       add = rem;
48*f6dc9357SAndroid Build Coastguard Worker     ReAllocForNewCapacity(_capacity + add);
49*f6dc9357SAndroid Build Coastguard Worker   }
50*f6dc9357SAndroid Build Coastguard Worker 
CRecordVector()51*f6dc9357SAndroid Build Coastguard Worker   CRecordVector(): _items(NULL), _size(0), _capacity(0) {}
52*f6dc9357SAndroid Build Coastguard Worker 
CRecordVector(const CRecordVector & v)53*f6dc9357SAndroid Build Coastguard Worker   CRecordVector(const CRecordVector &v): _items(NULL), _size(0), _capacity(0)
54*f6dc9357SAndroid Build Coastguard Worker   {
55*f6dc9357SAndroid Build Coastguard Worker     const unsigned size = v.Size();
56*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
57*f6dc9357SAndroid Build Coastguard Worker     {
58*f6dc9357SAndroid Build Coastguard Worker       // Z7_ARRAY_NEW(_items, T, size)
59*f6dc9357SAndroid Build Coastguard Worker       _items = new T[size];
60*f6dc9357SAndroid Build Coastguard Worker       _size = size;
61*f6dc9357SAndroid Build Coastguard Worker       _capacity = size;
62*f6dc9357SAndroid Build Coastguard Worker       memcpy(_items, v._items, (size_t)size * sizeof(T));
63*f6dc9357SAndroid Build Coastguard Worker     }
64*f6dc9357SAndroid Build Coastguard Worker   }
65*f6dc9357SAndroid Build Coastguard Worker 
Size()66*f6dc9357SAndroid Build Coastguard Worker   unsigned Size() const { return _size; }
IsEmpty()67*f6dc9357SAndroid Build Coastguard Worker   bool IsEmpty() const { return _size == 0; }
68*f6dc9357SAndroid Build Coastguard Worker 
ConstructReserve(unsigned size)69*f6dc9357SAndroid Build Coastguard Worker   void ConstructReserve(unsigned size)
70*f6dc9357SAndroid Build Coastguard Worker   {
71*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
72*f6dc9357SAndroid Build Coastguard Worker     {
73*f6dc9357SAndroid Build Coastguard Worker       Z7_ARRAY_NEW(_items, T, size)
74*f6dc9357SAndroid Build Coastguard Worker       // _items = new T[size];
75*f6dc9357SAndroid Build Coastguard Worker       _capacity = size;
76*f6dc9357SAndroid Build Coastguard Worker     }
77*f6dc9357SAndroid Build Coastguard Worker   }
78*f6dc9357SAndroid Build Coastguard Worker 
Reserve(unsigned newCapacity)79*f6dc9357SAndroid Build Coastguard Worker   void Reserve(unsigned newCapacity)
80*f6dc9357SAndroid Build Coastguard Worker   {
81*f6dc9357SAndroid Build Coastguard Worker     if (newCapacity > _capacity)
82*f6dc9357SAndroid Build Coastguard Worker     {
83*f6dc9357SAndroid Build Coastguard Worker       if (newCapacity > k_VectorSizeMax)
84*f6dc9357SAndroid Build Coastguard Worker         throw 2021;
85*f6dc9357SAndroid Build Coastguard Worker       ReAllocForNewCapacity(newCapacity);
86*f6dc9357SAndroid Build Coastguard Worker     }
87*f6dc9357SAndroid Build Coastguard Worker   }
88*f6dc9357SAndroid Build Coastguard Worker 
ChangeSize_KeepData(unsigned newSize)89*f6dc9357SAndroid Build Coastguard Worker   void ChangeSize_KeepData(unsigned newSize)
90*f6dc9357SAndroid Build Coastguard Worker   {
91*f6dc9357SAndroid Build Coastguard Worker     Reserve(newSize);
92*f6dc9357SAndroid Build Coastguard Worker     _size = newSize;
93*f6dc9357SAndroid Build Coastguard Worker   }
94*f6dc9357SAndroid Build Coastguard Worker 
ClearAndReserve(unsigned newCapacity)95*f6dc9357SAndroid Build Coastguard Worker   void ClearAndReserve(unsigned newCapacity)
96*f6dc9357SAndroid Build Coastguard Worker   {
97*f6dc9357SAndroid Build Coastguard Worker     Clear();
98*f6dc9357SAndroid Build Coastguard Worker     if (newCapacity > _capacity)
99*f6dc9357SAndroid Build Coastguard Worker     {
100*f6dc9357SAndroid Build Coastguard Worker       if (newCapacity > k_VectorSizeMax)
101*f6dc9357SAndroid Build Coastguard Worker         throw 2021;
102*f6dc9357SAndroid Build Coastguard Worker       delete []_items;
103*f6dc9357SAndroid Build Coastguard Worker       _items = NULL;
104*f6dc9357SAndroid Build Coastguard Worker       _capacity = 0;
105*f6dc9357SAndroid Build Coastguard Worker       Z7_ARRAY_NEW(_items, T, newCapacity)
106*f6dc9357SAndroid Build Coastguard Worker       // _items = new T[newCapacity];
107*f6dc9357SAndroid Build Coastguard Worker       _capacity = newCapacity;
108*f6dc9357SAndroid Build Coastguard Worker     }
109*f6dc9357SAndroid Build Coastguard Worker   }
110*f6dc9357SAndroid Build Coastguard Worker 
ClearAndSetSize(unsigned newSize)111*f6dc9357SAndroid Build Coastguard Worker   void ClearAndSetSize(unsigned newSize)
112*f6dc9357SAndroid Build Coastguard Worker   {
113*f6dc9357SAndroid Build Coastguard Worker     ClearAndReserve(newSize);
114*f6dc9357SAndroid Build Coastguard Worker     _size = newSize;
115*f6dc9357SAndroid Build Coastguard Worker   }
116*f6dc9357SAndroid Build Coastguard Worker 
ReserveDown()117*f6dc9357SAndroid Build Coastguard Worker   void ReserveDown()
118*f6dc9357SAndroid Build Coastguard Worker   {
119*f6dc9357SAndroid Build Coastguard Worker     if (_size == _capacity)
120*f6dc9357SAndroid Build Coastguard Worker       return;
121*f6dc9357SAndroid Build Coastguard Worker     T *p = NULL;
122*f6dc9357SAndroid Build Coastguard Worker     if (_size != 0)
123*f6dc9357SAndroid Build Coastguard Worker     {
124*f6dc9357SAndroid Build Coastguard Worker       // Z7_ARRAY_NEW(p, T, _size)
125*f6dc9357SAndroid Build Coastguard Worker       p = new T[_size];
126*f6dc9357SAndroid Build Coastguard Worker       memcpy(p, _items, (size_t)_size * sizeof(T));
127*f6dc9357SAndroid Build Coastguard Worker     }
128*f6dc9357SAndroid Build Coastguard Worker     delete []_items;
129*f6dc9357SAndroid Build Coastguard Worker     _items = p;
130*f6dc9357SAndroid Build Coastguard Worker     _capacity = _size;
131*f6dc9357SAndroid Build Coastguard Worker   }
132*f6dc9357SAndroid Build Coastguard Worker 
~CRecordVector()133*f6dc9357SAndroid Build Coastguard Worker   ~CRecordVector() { delete []_items; }
134*f6dc9357SAndroid Build Coastguard Worker 
ClearAndFree()135*f6dc9357SAndroid Build Coastguard Worker   void ClearAndFree()
136*f6dc9357SAndroid Build Coastguard Worker   {
137*f6dc9357SAndroid Build Coastguard Worker     delete []_items;
138*f6dc9357SAndroid Build Coastguard Worker     _items = NULL;
139*f6dc9357SAndroid Build Coastguard Worker     _size = 0;
140*f6dc9357SAndroid Build Coastguard Worker     _capacity = 0;
141*f6dc9357SAndroid Build Coastguard Worker   }
142*f6dc9357SAndroid Build Coastguard Worker 
Clear()143*f6dc9357SAndroid Build Coastguard Worker   void Clear() { _size = 0; }
144*f6dc9357SAndroid Build Coastguard Worker 
DeleteBack()145*f6dc9357SAndroid Build Coastguard Worker   void DeleteBack() { _size--; }
146*f6dc9357SAndroid Build Coastguard Worker 
DeleteFrom(unsigned index)147*f6dc9357SAndroid Build Coastguard Worker   void DeleteFrom(unsigned index)
148*f6dc9357SAndroid Build Coastguard Worker   {
149*f6dc9357SAndroid Build Coastguard Worker     // if (index <= _size)
150*f6dc9357SAndroid Build Coastguard Worker       _size = index;
151*f6dc9357SAndroid Build Coastguard Worker   }
152*f6dc9357SAndroid Build Coastguard Worker 
DeleteFrontal(unsigned num)153*f6dc9357SAndroid Build Coastguard Worker   void DeleteFrontal(unsigned num)
154*f6dc9357SAndroid Build Coastguard Worker   {
155*f6dc9357SAndroid Build Coastguard Worker     if (num != 0)
156*f6dc9357SAndroid Build Coastguard Worker     {
157*f6dc9357SAndroid Build Coastguard Worker       MoveItems(0, num);
158*f6dc9357SAndroid Build Coastguard Worker       _size -= num;
159*f6dc9357SAndroid Build Coastguard Worker     }
160*f6dc9357SAndroid Build Coastguard Worker   }
161*f6dc9357SAndroid Build Coastguard Worker 
Delete(unsigned index)162*f6dc9357SAndroid Build Coastguard Worker   void Delete(unsigned index)
163*f6dc9357SAndroid Build Coastguard Worker   {
164*f6dc9357SAndroid Build Coastguard Worker     MoveItems(index, index + 1);
165*f6dc9357SAndroid Build Coastguard Worker     _size -= 1;
166*f6dc9357SAndroid Build Coastguard Worker   }
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker   /*
169*f6dc9357SAndroid Build Coastguard Worker   void Delete(unsigned index, unsigned num)
170*f6dc9357SAndroid Build Coastguard Worker   {
171*f6dc9357SAndroid Build Coastguard Worker     if (num > 0)
172*f6dc9357SAndroid Build Coastguard Worker     {
173*f6dc9357SAndroid Build Coastguard Worker       MoveItems(index, index + num);
174*f6dc9357SAndroid Build Coastguard Worker       _size -= num;
175*f6dc9357SAndroid Build Coastguard Worker     }
176*f6dc9357SAndroid Build Coastguard Worker   }
177*f6dc9357SAndroid Build Coastguard Worker   */
178*f6dc9357SAndroid Build Coastguard Worker 
179*f6dc9357SAndroid Build Coastguard Worker   CRecordVector& operator=(const CRecordVector &v)
180*f6dc9357SAndroid Build Coastguard Worker   {
181*f6dc9357SAndroid Build Coastguard Worker     if (&v == this)
182*f6dc9357SAndroid Build Coastguard Worker       return *this;
183*f6dc9357SAndroid Build Coastguard Worker     const unsigned size = v.Size();
184*f6dc9357SAndroid Build Coastguard Worker     if (size > _capacity)
185*f6dc9357SAndroid Build Coastguard Worker     {
186*f6dc9357SAndroid Build Coastguard Worker       delete []_items;
187*f6dc9357SAndroid Build Coastguard Worker       _capacity = 0;
188*f6dc9357SAndroid Build Coastguard Worker       _size = 0;
189*f6dc9357SAndroid Build Coastguard Worker       _items = NULL;
190*f6dc9357SAndroid Build Coastguard Worker       _items = new T[size];
191*f6dc9357SAndroid Build Coastguard Worker       _capacity = size;
192*f6dc9357SAndroid Build Coastguard Worker     }
193*f6dc9357SAndroid Build Coastguard Worker     _size = size;
194*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
195*f6dc9357SAndroid Build Coastguard Worker       memcpy(_items, v._items, (size_t)size * sizeof(T));
196*f6dc9357SAndroid Build Coastguard Worker     return *this;
197*f6dc9357SAndroid Build Coastguard Worker   }
198*f6dc9357SAndroid Build Coastguard Worker 
199*f6dc9357SAndroid Build Coastguard Worker   CRecordVector& operator+=(const CRecordVector &v)
200*f6dc9357SAndroid Build Coastguard Worker   {
201*f6dc9357SAndroid Build Coastguard Worker     const unsigned size = v.Size();
202*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
203*f6dc9357SAndroid Build Coastguard Worker     {
204*f6dc9357SAndroid Build Coastguard Worker       if (_size >= k_VectorSizeMax || size > k_VectorSizeMax - _size)
205*f6dc9357SAndroid Build Coastguard Worker         throw 2021;
206*f6dc9357SAndroid Build Coastguard Worker       const unsigned newSize = _size + size;
207*f6dc9357SAndroid Build Coastguard Worker       Reserve(newSize);
208*f6dc9357SAndroid Build Coastguard Worker       memcpy(_items + _size, v._items, (size_t)size * sizeof(T));
209*f6dc9357SAndroid Build Coastguard Worker       _size = newSize;
210*f6dc9357SAndroid Build Coastguard Worker     }
211*f6dc9357SAndroid Build Coastguard Worker     return *this;
212*f6dc9357SAndroid Build Coastguard Worker   }
213*f6dc9357SAndroid Build Coastguard Worker 
Add(const T item)214*f6dc9357SAndroid Build Coastguard Worker   unsigned Add(const T item)
215*f6dc9357SAndroid Build Coastguard Worker   {
216*f6dc9357SAndroid Build Coastguard Worker     ReserveOnePosition();
217*f6dc9357SAndroid Build Coastguard Worker     const unsigned size = _size;
218*f6dc9357SAndroid Build Coastguard Worker     _size = size + 1;
219*f6dc9357SAndroid Build Coastguard Worker     _items[size] = item;
220*f6dc9357SAndroid Build Coastguard Worker     return size;
221*f6dc9357SAndroid Build Coastguard Worker   }
222*f6dc9357SAndroid Build Coastguard Worker 
223*f6dc9357SAndroid Build Coastguard Worker   /*
224*f6dc9357SAndroid Build Coastguard Worker   unsigned Add2(const T &item)
225*f6dc9357SAndroid Build Coastguard Worker   {
226*f6dc9357SAndroid Build Coastguard Worker     ReserveOnePosition();
227*f6dc9357SAndroid Build Coastguard Worker     const unsigned size = _size;
228*f6dc9357SAndroid Build Coastguard Worker     _size = size + 1;
229*f6dc9357SAndroid Build Coastguard Worker     _items[size] = item;
230*f6dc9357SAndroid Build Coastguard Worker     return size;
231*f6dc9357SAndroid Build Coastguard Worker   }
232*f6dc9357SAndroid Build Coastguard Worker   */
233*f6dc9357SAndroid Build Coastguard Worker 
AddInReserved(const T item)234*f6dc9357SAndroid Build Coastguard Worker   unsigned AddInReserved(const T item)
235*f6dc9357SAndroid Build Coastguard Worker   {
236*f6dc9357SAndroid Build Coastguard Worker     const unsigned size = _size;
237*f6dc9357SAndroid Build Coastguard Worker     _size = size + 1;
238*f6dc9357SAndroid Build Coastguard Worker     _items[size] = item;
239*f6dc9357SAndroid Build Coastguard Worker     return size;
240*f6dc9357SAndroid Build Coastguard Worker   }
241*f6dc9357SAndroid Build Coastguard Worker 
Insert(unsigned index,const T item)242*f6dc9357SAndroid Build Coastguard Worker   void Insert(unsigned index, const T item)
243*f6dc9357SAndroid Build Coastguard Worker   {
244*f6dc9357SAndroid Build Coastguard Worker     ReserveOnePosition();
245*f6dc9357SAndroid Build Coastguard Worker     MoveItems(index + 1, index);
246*f6dc9357SAndroid Build Coastguard Worker     _items[index] = item;
247*f6dc9357SAndroid Build Coastguard Worker     _size++;
248*f6dc9357SAndroid Build Coastguard Worker   }
249*f6dc9357SAndroid Build Coastguard Worker 
InsertInReserved(unsigned index,const T item)250*f6dc9357SAndroid Build Coastguard Worker   void InsertInReserved(unsigned index, const T item)
251*f6dc9357SAndroid Build Coastguard Worker   {
252*f6dc9357SAndroid Build Coastguard Worker     MoveItems(index + 1, index);
253*f6dc9357SAndroid Build Coastguard Worker     _items[index] = item;
254*f6dc9357SAndroid Build Coastguard Worker     _size++;
255*f6dc9357SAndroid Build Coastguard Worker   }
256*f6dc9357SAndroid Build Coastguard Worker 
MoveToFront(unsigned index)257*f6dc9357SAndroid Build Coastguard Worker   void MoveToFront(unsigned index)
258*f6dc9357SAndroid Build Coastguard Worker   {
259*f6dc9357SAndroid Build Coastguard Worker     if (index != 0)
260*f6dc9357SAndroid Build Coastguard Worker     {
261*f6dc9357SAndroid Build Coastguard Worker       const T temp = _items[index];
262*f6dc9357SAndroid Build Coastguard Worker       memmove(_items + 1, _items, (size_t)index * sizeof(T));
263*f6dc9357SAndroid Build Coastguard Worker       _items[0] = temp;
264*f6dc9357SAndroid Build Coastguard Worker     }
265*f6dc9357SAndroid Build Coastguard Worker   }
266*f6dc9357SAndroid Build Coastguard Worker 
267*f6dc9357SAndroid Build Coastguard Worker   const T& operator[](unsigned index) const { return _items[index]; }
268*f6dc9357SAndroid Build Coastguard Worker         T& operator[](unsigned index)       { return _items[index]; }
269*f6dc9357SAndroid Build Coastguard Worker   const T& operator[](int index) const { return _items[(unsigned)index]; }
270*f6dc9357SAndroid Build Coastguard Worker         T& operator[](int index)       { return _items[(unsigned)index]; }
271*f6dc9357SAndroid Build Coastguard Worker 
ConstData()272*f6dc9357SAndroid Build Coastguard Worker   const T* ConstData()    const { return _items; }
NonConstData()273*f6dc9357SAndroid Build Coastguard Worker         T* NonConstData() const { return _items; }
NonConstData()274*f6dc9357SAndroid Build Coastguard Worker         T* NonConstData()       { return _items; }
275*f6dc9357SAndroid Build Coastguard Worker 
Data()276*f6dc9357SAndroid Build Coastguard Worker   const T* Data() const         { return _items; }
Data()277*f6dc9357SAndroid Build Coastguard Worker         T* Data()               { return _items; }
278*f6dc9357SAndroid Build Coastguard Worker 
FrontItem()279*f6dc9357SAndroid Build Coastguard Worker   const T& FrontItem() const { return _items[0]; }
FrontItem()280*f6dc9357SAndroid Build Coastguard Worker         T& FrontItem()       { return _items[0]; }
281*f6dc9357SAndroid Build Coastguard Worker   /*
282*f6dc9357SAndroid Build Coastguard Worker   const T Front() const { return _items[0]; }
283*f6dc9357SAndroid Build Coastguard Worker         T Front()       { return _items[0]; }
284*f6dc9357SAndroid Build Coastguard Worker   const T& Front() const { return _items[0]; }
285*f6dc9357SAndroid Build Coastguard Worker         T& Front()       { return _items[0]; }
286*f6dc9357SAndroid Build Coastguard Worker   */
Back()287*f6dc9357SAndroid Build Coastguard Worker   const T& Back() const  { return _items[(size_t)_size - 1]; }
Back()288*f6dc9357SAndroid Build Coastguard Worker         T& Back()        { return _items[(size_t)_size - 1]; }
289*f6dc9357SAndroid Build Coastguard Worker 
290*f6dc9357SAndroid Build Coastguard Worker   /*
291*f6dc9357SAndroid Build Coastguard Worker   void Swap(unsigned i, unsigned j)
292*f6dc9357SAndroid Build Coastguard Worker   {
293*f6dc9357SAndroid Build Coastguard Worker     const T temp = _items[i];
294*f6dc9357SAndroid Build Coastguard Worker     _items[i] = _items[j];
295*f6dc9357SAndroid Build Coastguard Worker     _items[j] = temp;
296*f6dc9357SAndroid Build Coastguard Worker   }
297*f6dc9357SAndroid Build Coastguard Worker   */
298*f6dc9357SAndroid Build Coastguard Worker 
FindInSorted(const T item,unsigned left,unsigned right)299*f6dc9357SAndroid Build Coastguard Worker   int FindInSorted(const T item, unsigned left, unsigned right) const
300*f6dc9357SAndroid Build Coastguard Worker   {
301*f6dc9357SAndroid Build Coastguard Worker     while (left != right)
302*f6dc9357SAndroid Build Coastguard Worker     {
303*f6dc9357SAndroid Build Coastguard Worker       // const unsigned mid = (unsigned)(((size_t)left + (size_t)right) / 2);
304*f6dc9357SAndroid Build Coastguard Worker       const unsigned mid = (left + right) / 2;
305*f6dc9357SAndroid Build Coastguard Worker       const T midVal = (*this)[mid];
306*f6dc9357SAndroid Build Coastguard Worker       if (item == midVal)
307*f6dc9357SAndroid Build Coastguard Worker         return (int)mid;
308*f6dc9357SAndroid Build Coastguard Worker       if (item < midVal)
309*f6dc9357SAndroid Build Coastguard Worker         right = mid;
310*f6dc9357SAndroid Build Coastguard Worker       else
311*f6dc9357SAndroid Build Coastguard Worker         left = mid + 1;
312*f6dc9357SAndroid Build Coastguard Worker     }
313*f6dc9357SAndroid Build Coastguard Worker     return -1;
314*f6dc9357SAndroid Build Coastguard Worker   }
315*f6dc9357SAndroid Build Coastguard Worker 
FindInSorted2(const T & item,unsigned left,unsigned right)316*f6dc9357SAndroid Build Coastguard Worker   int FindInSorted2(const T &item, unsigned left, unsigned right) const
317*f6dc9357SAndroid Build Coastguard Worker   {
318*f6dc9357SAndroid Build Coastguard Worker     while (left != right)
319*f6dc9357SAndroid Build Coastguard Worker     {
320*f6dc9357SAndroid Build Coastguard Worker       // const unsigned mid = (unsigned)(((size_t)left + (size_t)right) / 2);
321*f6dc9357SAndroid Build Coastguard Worker       const unsigned mid = (left + right) / 2;
322*f6dc9357SAndroid Build Coastguard Worker       const T& midVal = (*this)[mid];
323*f6dc9357SAndroid Build Coastguard Worker       const int comp = item.Compare(midVal);
324*f6dc9357SAndroid Build Coastguard Worker       if (comp == 0)
325*f6dc9357SAndroid Build Coastguard Worker         return (int)mid;
326*f6dc9357SAndroid Build Coastguard Worker       if (comp < 0)
327*f6dc9357SAndroid Build Coastguard Worker         right = mid;
328*f6dc9357SAndroid Build Coastguard Worker       else
329*f6dc9357SAndroid Build Coastguard Worker         left = mid + 1;
330*f6dc9357SAndroid Build Coastguard Worker     }
331*f6dc9357SAndroid Build Coastguard Worker     return -1;
332*f6dc9357SAndroid Build Coastguard Worker   }
333*f6dc9357SAndroid Build Coastguard Worker 
FindInSorted(const T item)334*f6dc9357SAndroid Build Coastguard Worker   int FindInSorted(const T item) const
335*f6dc9357SAndroid Build Coastguard Worker   {
336*f6dc9357SAndroid Build Coastguard Worker     return FindInSorted(item, 0, _size);
337*f6dc9357SAndroid Build Coastguard Worker   }
338*f6dc9357SAndroid Build Coastguard Worker 
FindInSorted2(const T & item)339*f6dc9357SAndroid Build Coastguard Worker   int FindInSorted2(const T &item) const
340*f6dc9357SAndroid Build Coastguard Worker   {
341*f6dc9357SAndroid Build Coastguard Worker     return FindInSorted2(item, 0, _size);
342*f6dc9357SAndroid Build Coastguard Worker   }
343*f6dc9357SAndroid Build Coastguard Worker 
AddToUniqueSorted(const T item)344*f6dc9357SAndroid Build Coastguard Worker   unsigned AddToUniqueSorted(const T item)
345*f6dc9357SAndroid Build Coastguard Worker   {
346*f6dc9357SAndroid Build Coastguard Worker     unsigned left = 0, right = _size;
347*f6dc9357SAndroid Build Coastguard Worker     while (left != right)
348*f6dc9357SAndroid Build Coastguard Worker     {
349*f6dc9357SAndroid Build Coastguard Worker       // const unsigned mid = (unsigned)(((size_t)left + (size_t)right) / 2);
350*f6dc9357SAndroid Build Coastguard Worker       const unsigned mid = (left + right) / 2;
351*f6dc9357SAndroid Build Coastguard Worker       const T midVal = (*this)[mid];
352*f6dc9357SAndroid Build Coastguard Worker       if (item == midVal)
353*f6dc9357SAndroid Build Coastguard Worker         return mid;
354*f6dc9357SAndroid Build Coastguard Worker       if (item < midVal)
355*f6dc9357SAndroid Build Coastguard Worker         right = mid;
356*f6dc9357SAndroid Build Coastguard Worker       else
357*f6dc9357SAndroid Build Coastguard Worker         left = mid + 1;
358*f6dc9357SAndroid Build Coastguard Worker     }
359*f6dc9357SAndroid Build Coastguard Worker     Insert(right, item);
360*f6dc9357SAndroid Build Coastguard Worker     return right;
361*f6dc9357SAndroid Build Coastguard Worker   }
362*f6dc9357SAndroid Build Coastguard Worker 
AddToUniqueSorted2(const T & item)363*f6dc9357SAndroid Build Coastguard Worker   unsigned AddToUniqueSorted2(const T &item)
364*f6dc9357SAndroid Build Coastguard Worker   {
365*f6dc9357SAndroid Build Coastguard Worker     unsigned left = 0, right = _size;
366*f6dc9357SAndroid Build Coastguard Worker     while (left != right)
367*f6dc9357SAndroid Build Coastguard Worker     {
368*f6dc9357SAndroid Build Coastguard Worker       // const unsigned mid = (unsigned)(((size_t)left + (size_t)right) / 2);
369*f6dc9357SAndroid Build Coastguard Worker       const unsigned mid = (left + right) / 2;
370*f6dc9357SAndroid Build Coastguard Worker       const T& midVal = (*this)[mid];
371*f6dc9357SAndroid Build Coastguard Worker       const int comp = item.Compare(midVal);
372*f6dc9357SAndroid Build Coastguard Worker       if (comp == 0)
373*f6dc9357SAndroid Build Coastguard Worker         return mid;
374*f6dc9357SAndroid Build Coastguard Worker       if (comp < 0)
375*f6dc9357SAndroid Build Coastguard Worker         right = mid;
376*f6dc9357SAndroid Build Coastguard Worker       else
377*f6dc9357SAndroid Build Coastguard Worker         left = mid + 1;
378*f6dc9357SAndroid Build Coastguard Worker     }
379*f6dc9357SAndroid Build Coastguard Worker     Insert(right, item);
380*f6dc9357SAndroid Build Coastguard Worker     return right;
381*f6dc9357SAndroid Build Coastguard Worker   }
382*f6dc9357SAndroid Build Coastguard Worker 
SortRefDown(T * p,unsigned k,unsigned size,int (* compare)(const T *,const T *,void *),void * param)383*f6dc9357SAndroid Build Coastguard Worker   static void SortRefDown(T* p, unsigned k, unsigned size, int (*compare)(const T*, const T*, void *), void *param)
384*f6dc9357SAndroid Build Coastguard Worker   {
385*f6dc9357SAndroid Build Coastguard Worker     const T temp = p[k];
386*f6dc9357SAndroid Build Coastguard Worker     for (;;)
387*f6dc9357SAndroid Build Coastguard Worker     {
388*f6dc9357SAndroid Build Coastguard Worker       unsigned s = (k << 1);
389*f6dc9357SAndroid Build Coastguard Worker       if (s > size)
390*f6dc9357SAndroid Build Coastguard Worker         break;
391*f6dc9357SAndroid Build Coastguard Worker       if (s < size && compare(p + s + 1, p + s, param) > 0)
392*f6dc9357SAndroid Build Coastguard Worker         s++;
393*f6dc9357SAndroid Build Coastguard Worker       if (compare(&temp, p + s, param) >= 0)
394*f6dc9357SAndroid Build Coastguard Worker         break;
395*f6dc9357SAndroid Build Coastguard Worker       p[k] = p[s];
396*f6dc9357SAndroid Build Coastguard Worker       k = s;
397*f6dc9357SAndroid Build Coastguard Worker     }
398*f6dc9357SAndroid Build Coastguard Worker     p[k] = temp;
399*f6dc9357SAndroid Build Coastguard Worker   }
400*f6dc9357SAndroid Build Coastguard Worker 
Sort(int (* compare)(const T *,const T *,void *),void * param)401*f6dc9357SAndroid Build Coastguard Worker   void Sort(int (*compare)(const T*, const T*, void *), void *param)
402*f6dc9357SAndroid Build Coastguard Worker   {
403*f6dc9357SAndroid Build Coastguard Worker     unsigned size = _size;
404*f6dc9357SAndroid Build Coastguard Worker     if (size <= 1)
405*f6dc9357SAndroid Build Coastguard Worker       return;
406*f6dc9357SAndroid Build Coastguard Worker     T* p = _items - 1;
407*f6dc9357SAndroid Build Coastguard Worker     {
408*f6dc9357SAndroid Build Coastguard Worker       unsigned i = size >> 1;
409*f6dc9357SAndroid Build Coastguard Worker       do
410*f6dc9357SAndroid Build Coastguard Worker         SortRefDown(p, i, size, compare, param);
411*f6dc9357SAndroid Build Coastguard Worker       while (--i);
412*f6dc9357SAndroid Build Coastguard Worker     }
413*f6dc9357SAndroid Build Coastguard Worker     do
414*f6dc9357SAndroid Build Coastguard Worker     {
415*f6dc9357SAndroid Build Coastguard Worker       const T temp = p[size];
416*f6dc9357SAndroid Build Coastguard Worker       p[size--] = p[1];
417*f6dc9357SAndroid Build Coastguard Worker       p[1] = temp;
418*f6dc9357SAndroid Build Coastguard Worker       SortRefDown(p, 1, size, compare, param);
419*f6dc9357SAndroid Build Coastguard Worker     }
420*f6dc9357SAndroid Build Coastguard Worker     while (size > 1);
421*f6dc9357SAndroid Build Coastguard Worker   }
422*f6dc9357SAndroid Build Coastguard Worker 
SortRefDown2(T * p,unsigned k,unsigned size)423*f6dc9357SAndroid Build Coastguard Worker   static void SortRefDown2(T* p, unsigned k, unsigned size)
424*f6dc9357SAndroid Build Coastguard Worker   {
425*f6dc9357SAndroid Build Coastguard Worker     const T temp = p[k];
426*f6dc9357SAndroid Build Coastguard Worker     for (;;)
427*f6dc9357SAndroid Build Coastguard Worker     {
428*f6dc9357SAndroid Build Coastguard Worker       unsigned s = (k << 1);
429*f6dc9357SAndroid Build Coastguard Worker       if (s > size)
430*f6dc9357SAndroid Build Coastguard Worker         break;
431*f6dc9357SAndroid Build Coastguard Worker       if (s < size && p[(size_t)s + 1].Compare(p[s]) > 0)
432*f6dc9357SAndroid Build Coastguard Worker         s++;
433*f6dc9357SAndroid Build Coastguard Worker       if (temp.Compare(p[s]) >= 0)
434*f6dc9357SAndroid Build Coastguard Worker         break;
435*f6dc9357SAndroid Build Coastguard Worker       p[k] = p[s];
436*f6dc9357SAndroid Build Coastguard Worker       k = s;
437*f6dc9357SAndroid Build Coastguard Worker     }
438*f6dc9357SAndroid Build Coastguard Worker     p[k] = temp;
439*f6dc9357SAndroid Build Coastguard Worker   }
440*f6dc9357SAndroid Build Coastguard Worker 
Sort2()441*f6dc9357SAndroid Build Coastguard Worker   void Sort2()
442*f6dc9357SAndroid Build Coastguard Worker   {
443*f6dc9357SAndroid Build Coastguard Worker     unsigned size = _size;
444*f6dc9357SAndroid Build Coastguard Worker     if (size <= 1)
445*f6dc9357SAndroid Build Coastguard Worker       return;
446*f6dc9357SAndroid Build Coastguard Worker     T* p = _items - 1;
447*f6dc9357SAndroid Build Coastguard Worker     {
448*f6dc9357SAndroid Build Coastguard Worker       unsigned i = size >> 1;
449*f6dc9357SAndroid Build Coastguard Worker       do
450*f6dc9357SAndroid Build Coastguard Worker         SortRefDown2(p, i, size);
451*f6dc9357SAndroid Build Coastguard Worker       while (--i);
452*f6dc9357SAndroid Build Coastguard Worker     }
453*f6dc9357SAndroid Build Coastguard Worker     do
454*f6dc9357SAndroid Build Coastguard Worker     {
455*f6dc9357SAndroid Build Coastguard Worker       const T temp = p[size];
456*f6dc9357SAndroid Build Coastguard Worker       p[size--] = p[1];
457*f6dc9357SAndroid Build Coastguard Worker       p[1] = temp;
458*f6dc9357SAndroid Build Coastguard Worker       SortRefDown2(p, 1, size);
459*f6dc9357SAndroid Build Coastguard Worker     }
460*f6dc9357SAndroid Build Coastguard Worker     while (size > 1);
461*f6dc9357SAndroid Build Coastguard Worker   }
462*f6dc9357SAndroid Build Coastguard Worker };
463*f6dc9357SAndroid Build Coastguard Worker 
464*f6dc9357SAndroid Build Coastguard Worker typedef CRecordVector<int> CIntVector;
465*f6dc9357SAndroid Build Coastguard Worker typedef CRecordVector<unsigned int> CUIntVector;
466*f6dc9357SAndroid Build Coastguard Worker typedef CRecordVector<bool> CBoolVector;
467*f6dc9357SAndroid Build Coastguard Worker typedef CRecordVector<unsigned char> CByteVector;
468*f6dc9357SAndroid Build Coastguard Worker typedef CRecordVector<void *> CPointerVector;
469*f6dc9357SAndroid Build Coastguard Worker 
470*f6dc9357SAndroid Build Coastguard Worker template <class T>
471*f6dc9357SAndroid Build Coastguard Worker class CObjectVector
472*f6dc9357SAndroid Build Coastguard Worker {
473*f6dc9357SAndroid Build Coastguard Worker   CPointerVector _v;
474*f6dc9357SAndroid Build Coastguard Worker public:
Size()475*f6dc9357SAndroid Build Coastguard Worker   unsigned Size() const { return _v.Size(); }
IsEmpty()476*f6dc9357SAndroid Build Coastguard Worker   bool IsEmpty() const { return _v.IsEmpty(); }
ReserveDown()477*f6dc9357SAndroid Build Coastguard Worker   void ReserveDown() { _v.ReserveDown(); }
478*f6dc9357SAndroid Build Coastguard Worker   // void Reserve(unsigned newCapacity) { _v.Reserve(newCapacity); }
ClearAndReserve(unsigned newCapacity)479*f6dc9357SAndroid Build Coastguard Worker   void ClearAndReserve(unsigned newCapacity) { Clear(); _v.ClearAndReserve(newCapacity); }
480*f6dc9357SAndroid Build Coastguard Worker 
CObjectVector()481*f6dc9357SAndroid Build Coastguard Worker   CObjectVector() {}
CObjectVector(const CObjectVector & v)482*f6dc9357SAndroid Build Coastguard Worker   CObjectVector(const CObjectVector &v)
483*f6dc9357SAndroid Build Coastguard Worker   {
484*f6dc9357SAndroid Build Coastguard Worker     const unsigned size = v.Size();
485*f6dc9357SAndroid Build Coastguard Worker     _v.ConstructReserve(size);
486*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < size; i++)
487*f6dc9357SAndroid Build Coastguard Worker       AddInReserved(v[i]);
488*f6dc9357SAndroid Build Coastguard Worker   }
489*f6dc9357SAndroid Build Coastguard Worker   CObjectVector& operator=(const CObjectVector &v)
490*f6dc9357SAndroid Build Coastguard Worker   {
491*f6dc9357SAndroid Build Coastguard Worker     if (&v == this)
492*f6dc9357SAndroid Build Coastguard Worker       return *this;
493*f6dc9357SAndroid Build Coastguard Worker     Clear();
494*f6dc9357SAndroid Build Coastguard Worker     const unsigned size = v.Size();
495*f6dc9357SAndroid Build Coastguard Worker     _v.Reserve(size);
496*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < size; i++)
497*f6dc9357SAndroid Build Coastguard Worker       AddInReserved(v[i]);
498*f6dc9357SAndroid Build Coastguard Worker     return *this;
499*f6dc9357SAndroid Build Coastguard Worker   }
500*f6dc9357SAndroid Build Coastguard Worker 
501*f6dc9357SAndroid Build Coastguard Worker   CObjectVector& operator+=(const CObjectVector &v)
502*f6dc9357SAndroid Build Coastguard Worker   {
503*f6dc9357SAndroid Build Coastguard Worker     const unsigned addSize = v.Size();
504*f6dc9357SAndroid Build Coastguard Worker     if (addSize != 0)
505*f6dc9357SAndroid Build Coastguard Worker     {
506*f6dc9357SAndroid Build Coastguard Worker       const unsigned size = Size();
507*f6dc9357SAndroid Build Coastguard Worker       if (size >= k_VectorSizeMax || addSize > k_VectorSizeMax - size)
508*f6dc9357SAndroid Build Coastguard Worker         throw 2021;
509*f6dc9357SAndroid Build Coastguard Worker       _v.Reserve(size + addSize);
510*f6dc9357SAndroid Build Coastguard Worker       for (unsigned i = 0; i < addSize; i++)
511*f6dc9357SAndroid Build Coastguard Worker         AddInReserved(v[i]);
512*f6dc9357SAndroid Build Coastguard Worker     }
513*f6dc9357SAndroid Build Coastguard Worker     return *this;
514*f6dc9357SAndroid Build Coastguard Worker   }
515*f6dc9357SAndroid Build Coastguard Worker 
516*f6dc9357SAndroid Build Coastguard Worker   const T& operator[](unsigned index) const { return *((T *)_v[index]); }
517*f6dc9357SAndroid Build Coastguard Worker         T& operator[](unsigned index)       { return *((T *)_v[index]); }
518*f6dc9357SAndroid Build Coastguard Worker   const T& operator[](int index) const { return *((T *)_v[(unsigned)index]); }
519*f6dc9357SAndroid Build Coastguard Worker         T& operator[](int index)       { return *((T *)_v[(unsigned)index]); }
Front()520*f6dc9357SAndroid Build Coastguard Worker   const T& Front() const { return operator[](0); }
Front()521*f6dc9357SAndroid Build Coastguard Worker         T& Front()       { return operator[](0); }
Back()522*f6dc9357SAndroid Build Coastguard Worker   const T& Back() const  { return *(T *)_v.Back(); }
Back()523*f6dc9357SAndroid Build Coastguard Worker         T& Back()        { return *(T *)_v.Back(); }
524*f6dc9357SAndroid Build Coastguard Worker 
MoveToFront(unsigned index)525*f6dc9357SAndroid Build Coastguard Worker   void MoveToFront(unsigned index) { _v.MoveToFront(index); }
526*f6dc9357SAndroid Build Coastguard Worker 
Add(const T & item)527*f6dc9357SAndroid Build Coastguard Worker   unsigned Add(const T& item)
528*f6dc9357SAndroid Build Coastguard Worker   {
529*f6dc9357SAndroid Build Coastguard Worker     _v.ReserveOnePosition();
530*f6dc9357SAndroid Build Coastguard Worker     return AddInReserved(item);
531*f6dc9357SAndroid Build Coastguard Worker   }
532*f6dc9357SAndroid Build Coastguard Worker 
AddInReserved(const T & item)533*f6dc9357SAndroid Build Coastguard Worker   unsigned AddInReserved(const T& item)
534*f6dc9357SAndroid Build Coastguard Worker   {
535*f6dc9357SAndroid Build Coastguard Worker     return _v.AddInReserved(new T(item));
536*f6dc9357SAndroid Build Coastguard Worker   }
537*f6dc9357SAndroid Build Coastguard Worker 
ReserveOnePosition()538*f6dc9357SAndroid Build Coastguard Worker   void ReserveOnePosition()
539*f6dc9357SAndroid Build Coastguard Worker   {
540*f6dc9357SAndroid Build Coastguard Worker     _v.ReserveOnePosition();
541*f6dc9357SAndroid Build Coastguard Worker   }
542*f6dc9357SAndroid Build Coastguard Worker 
AddInReserved_Ptr_of_new(T * ptr)543*f6dc9357SAndroid Build Coastguard Worker   unsigned AddInReserved_Ptr_of_new(T *ptr)
544*f6dc9357SAndroid Build Coastguard Worker   {
545*f6dc9357SAndroid Build Coastguard Worker     return _v.AddInReserved(ptr);
546*f6dc9357SAndroid Build Coastguard Worker   }
547*f6dc9357SAndroid Build Coastguard Worker 
548*f6dc9357SAndroid Build Coastguard Worker   #define VECTOR_ADD_NEW_OBJECT(v, a) \
549*f6dc9357SAndroid Build Coastguard Worker     (v).ReserveOnePosition(); \
550*f6dc9357SAndroid Build Coastguard Worker     (v).AddInReserved_Ptr_of_new(new a);
551*f6dc9357SAndroid Build Coastguard Worker 
552*f6dc9357SAndroid Build Coastguard Worker 
AddNew()553*f6dc9357SAndroid Build Coastguard Worker   T& AddNew()
554*f6dc9357SAndroid Build Coastguard Worker   {
555*f6dc9357SAndroid Build Coastguard Worker     _v.ReserveOnePosition();
556*f6dc9357SAndroid Build Coastguard Worker     T *p = new T;
557*f6dc9357SAndroid Build Coastguard Worker     _v.AddInReserved(p);
558*f6dc9357SAndroid Build Coastguard Worker     return *p;
559*f6dc9357SAndroid Build Coastguard Worker   }
560*f6dc9357SAndroid Build Coastguard Worker 
AddNewInReserved()561*f6dc9357SAndroid Build Coastguard Worker   T& AddNewInReserved()
562*f6dc9357SAndroid Build Coastguard Worker   {
563*f6dc9357SAndroid Build Coastguard Worker     T *p = new T;
564*f6dc9357SAndroid Build Coastguard Worker     _v.AddInReserved(p);
565*f6dc9357SAndroid Build Coastguard Worker     return *p;
566*f6dc9357SAndroid Build Coastguard Worker   }
567*f6dc9357SAndroid Build Coastguard Worker 
Insert(unsigned index,const T & item)568*f6dc9357SAndroid Build Coastguard Worker   void Insert(unsigned index, const T& item)
569*f6dc9357SAndroid Build Coastguard Worker   {
570*f6dc9357SAndroid Build Coastguard Worker     _v.ReserveOnePosition();
571*f6dc9357SAndroid Build Coastguard Worker     _v.InsertInReserved(index, new T(item));
572*f6dc9357SAndroid Build Coastguard Worker   }
573*f6dc9357SAndroid Build Coastguard Worker 
InsertNew(unsigned index)574*f6dc9357SAndroid Build Coastguard Worker   T& InsertNew(unsigned index)
575*f6dc9357SAndroid Build Coastguard Worker   {
576*f6dc9357SAndroid Build Coastguard Worker     _v.ReserveOnePosition();
577*f6dc9357SAndroid Build Coastguard Worker     T *p = new T;
578*f6dc9357SAndroid Build Coastguard Worker     _v.InsertInReserved(index, p);
579*f6dc9357SAndroid Build Coastguard Worker     return *p;
580*f6dc9357SAndroid Build Coastguard Worker   }
581*f6dc9357SAndroid Build Coastguard Worker 
~CObjectVector()582*f6dc9357SAndroid Build Coastguard Worker   ~CObjectVector()
583*f6dc9357SAndroid Build Coastguard Worker   {
584*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = _v.Size(); i != 0;)
585*f6dc9357SAndroid Build Coastguard Worker       delete (T *)_v[--i];
586*f6dc9357SAndroid Build Coastguard Worker   }
587*f6dc9357SAndroid Build Coastguard Worker 
ClearAndFree()588*f6dc9357SAndroid Build Coastguard Worker   void ClearAndFree()
589*f6dc9357SAndroid Build Coastguard Worker   {
590*f6dc9357SAndroid Build Coastguard Worker     Clear();
591*f6dc9357SAndroid Build Coastguard Worker     _v.ClearAndFree();
592*f6dc9357SAndroid Build Coastguard Worker   }
593*f6dc9357SAndroid Build Coastguard Worker 
Clear()594*f6dc9357SAndroid Build Coastguard Worker   void Clear()
595*f6dc9357SAndroid Build Coastguard Worker   {
596*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = _v.Size(); i != 0;)
597*f6dc9357SAndroid Build Coastguard Worker       delete (T *)_v[--i];
598*f6dc9357SAndroid Build Coastguard Worker     _v.Clear();
599*f6dc9357SAndroid Build Coastguard Worker   }
600*f6dc9357SAndroid Build Coastguard Worker 
DeleteFrom(unsigned index)601*f6dc9357SAndroid Build Coastguard Worker   void DeleteFrom(unsigned index)
602*f6dc9357SAndroid Build Coastguard Worker   {
603*f6dc9357SAndroid Build Coastguard Worker     const unsigned size = _v.Size();
604*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = index; i < size; i++)
605*f6dc9357SAndroid Build Coastguard Worker       delete (T *)_v[i];
606*f6dc9357SAndroid Build Coastguard Worker     _v.DeleteFrom(index);
607*f6dc9357SAndroid Build Coastguard Worker   }
608*f6dc9357SAndroid Build Coastguard Worker 
DeleteFrontal(unsigned num)609*f6dc9357SAndroid Build Coastguard Worker   void DeleteFrontal(unsigned num)
610*f6dc9357SAndroid Build Coastguard Worker   {
611*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < num; i++)
612*f6dc9357SAndroid Build Coastguard Worker       delete (T *)_v[i];
613*f6dc9357SAndroid Build Coastguard Worker     _v.DeleteFrontal(num);
614*f6dc9357SAndroid Build Coastguard Worker   }
615*f6dc9357SAndroid Build Coastguard Worker 
DeleteBack()616*f6dc9357SAndroid Build Coastguard Worker   void DeleteBack()
617*f6dc9357SAndroid Build Coastguard Worker   {
618*f6dc9357SAndroid Build Coastguard Worker     delete (T *)_v.Back();
619*f6dc9357SAndroid Build Coastguard Worker     _v.DeleteBack();
620*f6dc9357SAndroid Build Coastguard Worker   }
621*f6dc9357SAndroid Build Coastguard Worker 
Delete(unsigned index)622*f6dc9357SAndroid Build Coastguard Worker   void Delete(unsigned index)
623*f6dc9357SAndroid Build Coastguard Worker   {
624*f6dc9357SAndroid Build Coastguard Worker     delete (T *)_v[index];
625*f6dc9357SAndroid Build Coastguard Worker     _v.Delete(index);
626*f6dc9357SAndroid Build Coastguard Worker   }
627*f6dc9357SAndroid Build Coastguard Worker   // void Delete(int index) { Delete((unsigned)index); }
628*f6dc9357SAndroid Build Coastguard Worker 
629*f6dc9357SAndroid Build Coastguard Worker   /*
630*f6dc9357SAndroid Build Coastguard Worker   void Delete(unsigned index, unsigned num)
631*f6dc9357SAndroid Build Coastguard Worker   {
632*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < num; i++)
633*f6dc9357SAndroid Build Coastguard Worker       delete (T *)_v[index + i];
634*f6dc9357SAndroid Build Coastguard Worker     _v.Delete(index, num);
635*f6dc9357SAndroid Build Coastguard Worker   }
636*f6dc9357SAndroid Build Coastguard Worker   */
637*f6dc9357SAndroid Build Coastguard Worker 
638*f6dc9357SAndroid Build Coastguard Worker   /*
639*f6dc9357SAndroid Build Coastguard Worker   int Find(const T& item) const
640*f6dc9357SAndroid Build Coastguard Worker   {
641*f6dc9357SAndroid Build Coastguard Worker     unsigned size = Size();
642*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < size; i++)
643*f6dc9357SAndroid Build Coastguard Worker       if (item == (*this)[i])
644*f6dc9357SAndroid Build Coastguard Worker         return i;
645*f6dc9357SAndroid Build Coastguard Worker     return -1;
646*f6dc9357SAndroid Build Coastguard Worker   }
647*f6dc9357SAndroid Build Coastguard Worker   */
648*f6dc9357SAndroid Build Coastguard Worker 
FindInSorted(const T & item)649*f6dc9357SAndroid Build Coastguard Worker   int FindInSorted(const T& item) const
650*f6dc9357SAndroid Build Coastguard Worker   {
651*f6dc9357SAndroid Build Coastguard Worker     unsigned left = 0, right = Size();
652*f6dc9357SAndroid Build Coastguard Worker     while (left != right)
653*f6dc9357SAndroid Build Coastguard Worker     {
654*f6dc9357SAndroid Build Coastguard Worker       // const unsigned mid = (unsigned)(((size_t)left + (size_t)right) / 2);
655*f6dc9357SAndroid Build Coastguard Worker       const unsigned mid = (left + right) / 2;
656*f6dc9357SAndroid Build Coastguard Worker       const T& midVal = (*this)[mid];
657*f6dc9357SAndroid Build Coastguard Worker       const int comp = item.Compare(midVal);
658*f6dc9357SAndroid Build Coastguard Worker       if (comp == 0)
659*f6dc9357SAndroid Build Coastguard Worker         return (int)mid;
660*f6dc9357SAndroid Build Coastguard Worker       if (comp < 0)
661*f6dc9357SAndroid Build Coastguard Worker         right = mid;
662*f6dc9357SAndroid Build Coastguard Worker       else
663*f6dc9357SAndroid Build Coastguard Worker         left = mid + 1;
664*f6dc9357SAndroid Build Coastguard Worker     }
665*f6dc9357SAndroid Build Coastguard Worker     return -1;
666*f6dc9357SAndroid Build Coastguard Worker   }
667*f6dc9357SAndroid Build Coastguard Worker 
AddToUniqueSorted(const T & item)668*f6dc9357SAndroid Build Coastguard Worker   unsigned AddToUniqueSorted(const T& item)
669*f6dc9357SAndroid Build Coastguard Worker   {
670*f6dc9357SAndroid Build Coastguard Worker     unsigned left = 0, right = Size();
671*f6dc9357SAndroid Build Coastguard Worker     while (left != right)
672*f6dc9357SAndroid Build Coastguard Worker     {
673*f6dc9357SAndroid Build Coastguard Worker       // const unsigned mid = (unsigned)(((size_t)left + (size_t)right) / 2);
674*f6dc9357SAndroid Build Coastguard Worker       const unsigned mid = (left + right) / 2;
675*f6dc9357SAndroid Build Coastguard Worker       const T& midVal = (*this)[mid];
676*f6dc9357SAndroid Build Coastguard Worker       const int comp = item.Compare(midVal);
677*f6dc9357SAndroid Build Coastguard Worker       if (comp == 0)
678*f6dc9357SAndroid Build Coastguard Worker         return mid;
679*f6dc9357SAndroid Build Coastguard Worker       if (comp < 0)
680*f6dc9357SAndroid Build Coastguard Worker         right = mid;
681*f6dc9357SAndroid Build Coastguard Worker       else
682*f6dc9357SAndroid Build Coastguard Worker         left = mid + 1;
683*f6dc9357SAndroid Build Coastguard Worker     }
684*f6dc9357SAndroid Build Coastguard Worker     Insert(right, item);
685*f6dc9357SAndroid Build Coastguard Worker     return right;
686*f6dc9357SAndroid Build Coastguard Worker   }
687*f6dc9357SAndroid Build Coastguard Worker 
688*f6dc9357SAndroid Build Coastguard Worker   /*
689*f6dc9357SAndroid Build Coastguard Worker   unsigned AddToSorted(const T& item)
690*f6dc9357SAndroid Build Coastguard Worker   {
691*f6dc9357SAndroid Build Coastguard Worker     unsigned left = 0, right = Size();
692*f6dc9357SAndroid Build Coastguard Worker     while (left != right)
693*f6dc9357SAndroid Build Coastguard Worker     {
694*f6dc9357SAndroid Build Coastguard Worker       // const unsigned mid = (unsigned)(((size_t)left + (size_t)right) / 2);
695*f6dc9357SAndroid Build Coastguard Worker       const unsigned mid = (left + right) / 2;
696*f6dc9357SAndroid Build Coastguard Worker       const T& midVal = (*this)[mid];
697*f6dc9357SAndroid Build Coastguard Worker       const int comp = item.Compare(midVal);
698*f6dc9357SAndroid Build Coastguard Worker       if (comp == 0)
699*f6dc9357SAndroid Build Coastguard Worker       {
700*f6dc9357SAndroid Build Coastguard Worker         right = mid + 1;
701*f6dc9357SAndroid Build Coastguard Worker         break;
702*f6dc9357SAndroid Build Coastguard Worker       }
703*f6dc9357SAndroid Build Coastguard Worker       if (comp < 0)
704*f6dc9357SAndroid Build Coastguard Worker         right = mid;
705*f6dc9357SAndroid Build Coastguard Worker       else
706*f6dc9357SAndroid Build Coastguard Worker         left = mid + 1;
707*f6dc9357SAndroid Build Coastguard Worker     }
708*f6dc9357SAndroid Build Coastguard Worker     Insert(right, item);
709*f6dc9357SAndroid Build Coastguard Worker     return right;
710*f6dc9357SAndroid Build Coastguard Worker   }
711*f6dc9357SAndroid Build Coastguard Worker   */
712*f6dc9357SAndroid Build Coastguard Worker 
Sort(int (* compare)(void * const *,void * const *,void *),void * param)713*f6dc9357SAndroid Build Coastguard Worker   void Sort(int (*compare)(void *const *, void *const *, void *), void *param)
714*f6dc9357SAndroid Build Coastguard Worker     { _v.Sort(compare, param); }
715*f6dc9357SAndroid Build Coastguard Worker 
CompareObjectItems(void * const * a1,void * const * a2,void *)716*f6dc9357SAndroid Build Coastguard Worker   static int CompareObjectItems(void *const *a1, void *const *a2, void * /* param */)
717*f6dc9357SAndroid Build Coastguard Worker     { return (*(*((const T *const *)a1))).Compare(*(*((const T *const *)a2))); }
718*f6dc9357SAndroid Build Coastguard Worker 
Sort()719*f6dc9357SAndroid Build Coastguard Worker   void Sort() { _v.Sort(CompareObjectItems, NULL); }
720*f6dc9357SAndroid Build Coastguard Worker };
721*f6dc9357SAndroid Build Coastguard Worker 
722*f6dc9357SAndroid Build Coastguard Worker #define FOR_VECTOR(_i_, _v_) for (unsigned _i_ = 0; _i_ < (_v_).Size(); _i_++)
723*f6dc9357SAndroid Build Coastguard Worker 
724*f6dc9357SAndroid Build Coastguard Worker #endif
725