Annotation of elwix/tools/oldlzma/SRC/Common/Vector.h, revision 1.1

1.1     ! misho       1: // Common/Vector.h
        !             2: 
        !             3: #ifndef __COMMON_VECTOR_H
        !             4: #define __COMMON_VECTOR_H
        !             5: 
        !             6: #include "Defs.h"
        !             7: 
        !             8: class CBaseRecordVector
        !             9: {
        !            10:   void MoveItems(int destIndex, int srcIndex);
        !            11: protected:
        !            12:        int _capacity;
        !            13:   int _size;
        !            14:        void *_items;
        !            15:   size_t _itemSize;
        !            16: 
        !            17:        void ReserveOnePosition();
        !            18:   void InsertOneItem(int index);
        !            19:   void TestIndexAndCorrectNum(int index, int &num) const
        !            20:     { if (index + num > _size) num = _size - index; } 
        !            21: public:
        !            22:   CBaseRecordVector(size_t itemSize):
        !            23:       _capacity(0), _size(0), _items(0), _itemSize(itemSize) {}
        !            24:        virtual ~CBaseRecordVector();
        !            25:   int Size() const { return _size; }
        !            26:        bool IsEmpty() const { return (_size == 0); }
        !            27:        void Reserve(int newCapacity);
        !            28:        virtual void Delete(int index, int num = 1);
        !            29:        void Clear();
        !            30:   void DeleteFrom(int index);
        !            31:   void DeleteBack();
        !            32: };
        !            33: 
        !            34: template <class T>
        !            35: class CRecordVector: public CBaseRecordVector
        !            36: {
        !            37: public:
        !            38:   CRecordVector():CBaseRecordVector(sizeof(T)){};
        !            39:   CRecordVector(const CRecordVector &v):
        !            40:     CBaseRecordVector(sizeof(T)) { *this = v;}
        !            41:        CRecordVector& operator=(const CRecordVector &v)
        !            42:   {
        !            43:     Clear();
        !            44:     return (*this += v);
        !            45:   }
        !            46:   CRecordVector& operator+=(const CRecordVector &v)
        !            47:   {
        !            48:     int size = v.Size();
        !            49:     Reserve(Size() + size);
        !            50:     for(int i = 0; i < size; i++)
        !            51:       Add(v[i]);
        !            52:     return *this;
        !            53:   }
        !            54:        int Add(T item)
        !            55:   {
        !            56:     ReserveOnePosition();
        !            57:     ((T *)_items)[_size] = item;
        !            58:     return _size++;
        !            59:   }
        !            60:        void Insert(int index, T item)
        !            61:   {
        !            62:     InsertOneItem(index);
        !            63:     ((T *)_items)[index] = item;
        !            64:   }
        !            65:   // T* GetPointer() const { return (T*)_items; }
        !            66:   // operator const T *() const { return _items; };
        !            67:   const T& operator[](int index) const { return ((T *)_items)[index]; }
        !            68:        T& operator[](int index) { return ((T *)_items)[index]; }
        !            69:        const T& Front() const { return operator[](0); }
        !            70:   T& Front()   { return operator[](0); }
        !            71:        const T& Back() const { return operator[](_size - 1); }
        !            72:   T& Back()   { return operator[](_size - 1); }
        !            73:   static int 
        !            74:   #ifdef _MSC_VER
        !            75:   __cdecl
        !            76:   #endif
        !            77:   CompareRecordItems(const void *a1, const void *a2)
        !            78:     { return MyCompare(*((const T *)a1), *((const T *)a2)); }
        !            79:   void Sort()
        !            80:     { qsort(&Front(), Size(), _itemSize, CompareRecordItems); }
        !            81: };
        !            82: 
        !            83: typedef CRecordVector<int> CIntVector;
        !            84: typedef CRecordVector<unsigned int> CUIntVector;
        !            85: typedef CRecordVector<bool> CBoolVector;
        !            86: typedef CRecordVector<unsigned char> CByteVector;
        !            87: typedef CRecordVector<void *> CPointerVector;
        !            88: 
        !            89: template <class T>
        !            90: class CObjectVector: public CPointerVector
        !            91: {
        !            92: public:
        !            93:   CObjectVector(){};
        !            94:   ~CObjectVector() { Clear(); }
        !            95:   CObjectVector(const CObjectVector &objectVector)
        !            96:     { *this = objectVector; }
        !            97:        CObjectVector& operator=(const CObjectVector &objectVector)
        !            98:   {
        !            99:     Clear();
        !           100:     return (*this += objectVector);
        !           101:   }
        !           102:        CObjectVector& operator+=(const CObjectVector &objectVector)
        !           103:   {
        !           104:     int size = objectVector.Size();
        !           105:     Reserve(Size() + size);
        !           106:     for(int i = 0; i < size; i++)
        !           107:       Add(objectVector[i]);
        !           108:     return *this;
        !           109:   }
        !           110:        const T& operator[](int index) const { return *((T *)CPointerVector::operator[](index)); }
        !           111:        T& operator[](int index) { return *((T *)CPointerVector::operator[](index)); }
        !           112:        T& Front() { return operator[](0); }
        !           113:        const T& Front() const { return operator[](0); }
        !           114:        T& Back() { return operator[](_size - 1); }
        !           115:        const T& Back() const { return operator[](_size - 1); }
        !           116:        int Add(const T& item)
        !           117:     { return CPointerVector::Add(new T(item)); }
        !           118:        void Insert(int index, const T& item)
        !           119:     { CPointerVector::Insert(index, new T(item)); }
        !           120:        virtual void Delete(int index, int num = 1)
        !           121:   {
        !           122:     TestIndexAndCorrectNum(index, num);
        !           123:     for(int i = 0; i < num; i++)
        !           124:       delete (T *)(((void **)_items)[index + i]);
        !           125:     CPointerVector::Delete(index, num);
        !           126:   }
        !           127:   int Find(const T& item) const
        !           128:   {
        !           129:     for(int i = 0; i < Size(); i++)
        !           130:       if (item == (*this)[i])
        !           131:         return i;
        !           132:       return -1;
        !           133:   }
        !           134:   int FindInSorted(const T& item) const
        !           135:   {
        !           136:     int left = 0, right = Size(); 
        !           137:     while (left != right)
        !           138:     {
        !           139:       int mid = (left + right) / 2;
        !           140:       const T& midValue = (*this)[mid];
        !           141:       if (item == midValue)
        !           142:         return mid;
        !           143:       if (item < midValue)
        !           144:         right = mid;
        !           145:       else
        !           146:         left = mid + 1;
        !           147:     }
        !           148:     return -1;
        !           149:   }
        !           150:   int AddToSorted(const T& item)
        !           151:   {
        !           152:     int left = 0, right = Size(); 
        !           153:     while (left != right)
        !           154:     {
        !           155:       int mid = (left + right) / 2;
        !           156:       const T& midValue = (*this)[mid];
        !           157:       if (item == midValue)
        !           158:       {
        !           159:         right = mid + 1;
        !           160:         break;
        !           161:       }
        !           162:       if (item < midValue)
        !           163:         right = mid;
        !           164:       else
        !           165:         left = mid + 1;
        !           166:     }
        !           167:     Insert(right, item);
        !           168:     return right;
        !           169:   }
        !           170:   static int
        !           171:   #ifdef _MSC_VER
        !           172:   __cdecl
        !           173:   #endif
        !           174:   CompareObjectItems(const void *a1, const void *a2)
        !           175:     { return MyCompare(*(*((const T **)a1)), *(*((const T **)a2))); }
        !           176:   void Sort()
        !           177:   {
        !           178:     CPointerVector &pointerVector = *this;
        !           179:     qsort(&pointerVector[0], Size(), sizeof(void *), CompareObjectItems);
        !           180:   }
        !           181: };
        !           182: 
        !           183: #endif 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>