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