Advertisement
Guest User

my C++ vector

a guest
May 12th, 2013
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.66 KB | None | 0 0
  1.  
  2. #define __DESTRUCTOR(ty, ptr)   (ptr)->~ty()
  3. #define __CONSTRUCTOR(ty, ptr)  (*ptr) = ty()
  4. #define _vector_start _vector_data
  5. #define _vector_capacity (_vector_end - _vector_start)
  6. #define _vector_size (_current - _vector_start)
  7.  
  8. template <class T>
  9. class tVector
  10. {
  11.  
  12. public:
  13.  
  14.     inline tVector() : _vector_data((T*) new char[sizeof(T) * 1]),
  15.     _current(_vector_start), _vector_end(_vector_data + 1){}
  16.  
  17.     inline tVector(int nElements) : _vector_data(new char[sizeof(T) * nElements]),  
  18.     _current(&_vector_data[nElements]), _vector_end(_current){}
  19.    
  20.     inline tVector(int nElements, const T& val) : _vector_data((T*) new char[sizeof(T) * nElements]), _vector_end(_vector_data + nElements){
  21.         for(_current = _vector_data;_current != _vector_end;){*_current++ = val;}
  22.     }
  23.  
  24.     inline tVector(tVector<T> &object){
  25.         if((_vector_capacity) < object.size()) allocate(object.size());
  26.         memcpy(_vector_data, object._vector_data, object.size() * sizeof(T));
  27.         _current = _vector_start + object.size();
  28.     }
  29.  
  30.     inline operator= (tVector<T> &object){
  31.         if((_vector_capacity) < object.size()) allocate(object.size());
  32.         memcpy(_vector_data, object._vector_data, object.size() * sizeof(T));
  33.         _current = _vector_start + object.size();
  34.     }
  35.  
  36.     inline ~tVector(){delete [](char*)_vector_data;}
  37.  
  38.     inline void push_back(const T &t){
  39.         if(_current == _vector_end)double_size();*_current++ = t;
  40.     }
  41.  
  42.     inline T& push_back_and_access(const T &t){
  43.         if(_current == _vector_end)double_size();*_current++ = t;return _current[-1];
  44.     }
  45.  
  46.     inline void pop_back(){_current -= (_current != _vector_start);}
  47.     inline void pop_back_and_destroy(){
  48.         if(_current != _vector_start){_current--;__DESTRUCTOR(T, _current]);}}
  49.  
  50.     inline void resize(size_t size){
  51.         if((_vector_size) == size)return;
  52.  
  53.         T *it;
  54.         if((_vector_size) < size){
  55.         if((_vector_capacity) < size)
  56.         {
  57.             T *_temp = (T*) new char[sizeof(T) * size];
  58.             _current = _temp + (_vector_size);
  59.             memcpy(_temp, _vector_data, (unsigned int)((char*)_vector_end - (char*)_vector_start));
  60.             _vector_end = (_temp + size);
  61.             delete [] (char*)_vector_data;_vector_data = _temp;return;
  62.         }else
  63.         {
  64.             it = _current;
  65.             _current = (_vector_start + size);
  66.             for(;it < _current;it++)__CONSTRUCTOR(T, it);
  67.         }}
  68.         else
  69.         {
  70.             it = _current;
  71.             _current = (_vector_start + size);
  72.  
  73.             if(it != _current)
  74.             do{it--;__DESTRUCTOR(T, it);}while(it != _current);
  75.  
  76.         }
  77.     }
  78.  
  79.     inline void resize(size_t size, const T& val){
  80.         if((_vector_size) == size)return;
  81.  
  82.         T *it;
  83.         if((_vector_size) < size){
  84.         if((_vector_capacity) < size)
  85.         {
  86.             T *_temp = (T*) new char[sizeof(T) * size];
  87.             _current = _temp + (_vector_size);
  88.             memcpy(_temp, _vector_data, (unsigned int)((char*)_vector_end - (char*)_vector_start));
  89.             _vector_end = (_temp + size);
  90.             delete [] (char*)_vector_data;_vector_data = _temp;return;
  91.         }else
  92.         {
  93.             it = _current;
  94.             _current = (_vector_start + size);
  95.             for(;it < _current;)*it++ = val;
  96.         }}
  97.         else
  98.         {
  99.             it = _current;
  100.             _current = (_vector_start + size);
  101.  
  102.             if(it != _current)
  103.             do{it--;__DESTRUCTOR(T, it);}while(it != _current);
  104.  
  105.         }
  106.     }
  107.  
  108.     inline T* insert(T * pos, const T &val){
  109.         if(pos >= _current)return 0;
  110.         unsigned int _pos = (pos - _vector_start);
  111.         if(_current == _vector_end)
  112.             {double_size();pos = _vector_start + _pos;}
  113.  
  114.         for(T *it = _current++;it != pos;)*it-- = it[-1];
  115.         *pos = val;return pos;
  116.     }
  117.  
  118.     inline void insert(T * pos, size_t n, const T &val){
  119.         if(pos >= _current)return;
  120.         unsigned int _pos = (pos - _vector_start);
  121.        
  122.         _current += n;
  123.         if(_current >= _vector_end)
  124.             {double_size();pos = _vector_start + _pos;}
  125.  
  126.         T *end = pos + n;
  127.         for(T *it = _current - n - 1;it >= pos;)
  128.                 it[n] = *it--;
  129.  
  130.         for(;pos != end;)*pos++ = val;         
  131.     }
  132.  
  133.     inline void insert(T * pos, T* first, T *last){
  134.         if(pos >= _current || first >= last)return;
  135.         unsigned int _pos = (pos - _vector_start);
  136.        
  137.         _current += (last - first);
  138.         if(_current >= _vector_end)
  139.             {double_size();pos = _vector_start + _pos;}
  140.  
  141.         int n =  (last - first);
  142.         T *end = pos + n;
  143.         for(T *it = _current - n - 1;it >= pos;)
  144.                 it[n] = *it--;
  145.         for(;pos != end;)*pos++ = *first++;        
  146.     }
  147.  
  148.     inline void assign(size_t size, const T &val){if(!size)return;
  149.         if(_current != _vector_start)
  150.             for(T *it = _vector_data;it < _current;it++)__DESTRUCTOR(T, it);
  151.         if((_vector_capacity) < size)allocate(size);
  152.         _current = _vector_start + size;
  153.  
  154.         for(T *it = _vector_start;it < _current;){*it++ = val;}
  155.     }
  156.  
  157.     inline void shrink_to_fit(){
  158.     if(_current == _vector_end || _current == _vector_start)return;
  159.  
  160.         T *_temp = (T*) new char[sizeof(T) * (_vector_size)];
  161.         memcpy(_temp, _vector_data, (unsigned int)((char*)_current - (char*)_vector_start));
  162.         _current = _temp + (_vector_size);
  163.         delete [] (char*)_vector_data;_vector_data = _temp;_vector_end = _current;
  164.     }
  165.  
  166.     inline void reverse(int count = 0){
  167.         size_t half_size = ((unsigned int)(_vector_size)) / 2;
  168.         if(count && count < half_size)half_size = count;
  169.         char temp[sizeof(T)]; //avoid constructors
  170.         T*_end = _vector_end - 1;
  171.  
  172.     for(int i = 0;i < half_size;i++)
  173.         {
  174.             *((T*)temp) = (_vector_start)[i];
  175.             (_vector_start)[i] = (_end)[-i];
  176.             (_end)[-i] = *((T*)temp);
  177.         }
  178.     }
  179.  
  180.     inline void erase(unsigned int pos){
  181.         if(_current == _vector_start || pos >= (_vector_size))return;
  182.         __DESTRUCTOR(T, &_vector_data[pos]);
  183.  
  184.         for(T *it = &_vector_data[pos + 1];it < _current;){it[-1] = *it++;}
  185.         _current--;
  186.     }
  187.  
  188.     inline void erase(T *pos){
  189.         if(pos >= _current)return;
  190.         __DESTRUCTOR(T, pos);
  191.  
  192.         T *__current = _current--;
  193.         for(pos++;pos < __current;){pos[-1] = *pos++;}
  194.     }
  195.  
  196.     inline void erase(T *first, T *last){
  197.         if(last >= _current)return;
  198.  
  199.         for(T *it = first;it < last;it++)
  200.             {__DESTRUCTOR(T, it);}
  201.  
  202.         T *__current = _current;
  203.         _current -= (last - first);
  204.         for(;it < __current;){*first++ = *it++;}
  205.  
  206.     }
  207.  
  208.     inline void erase(unsigned int first, unsigned int last){
  209.         unsigned int range = last - first;
  210.         if(first >= last || (_current - range < _vector_start) || last >= (_vector_size))return;
  211.  
  212.         T *end = &_vector_data[last];
  213.         for(T *it = &_vector_data[first];it < end;it++)
  214.             {__DESTRUCTOR(T, it);}
  215.         range = -range;
  216.  
  217.         for(;it < _current;){it[range] = *it++;}
  218.         _current += range; //it's negative
  219.     }
  220.  
  221.  
  222.     inline void swap(tVector <T> &obj){
  223.         T *__current = _current;
  224.         T *__vector_start = _vector_start;
  225.         T *__vector_end = _vector_end;
  226.         _current = obj._current;
  227.         _vector_start = obj._vector_start;
  228.         _vector_end = obj._vector_end;
  229.         obj._current = __current;
  230.         obj._vector_start = __vector_start;
  231.         obj._vector_end = __vector_end;
  232.     }
  233.  
  234.     inline void clear(bool bDestroy = false){
  235.         if(bDestroy)for(T *it = _vector_data;it < _current;it++){__DESTRUCTOR(T, it);}
  236.     _vector_end = _vector_start;_current = _vector_data;}
  237.  
  238.     inline void reset(){_current = _vector_start;}
  239.     inline void reserve(size_t max){if(max > (_vector_capacity))new_size(max);}
  240.     inline size_t size() const {return _vector_size;}
  241.     //inline void set_size(size_t new_size){if(new_size < vector_capacity)_current = _vector_start + new_size;}
  242.     inline T& at(unsigned int index) const {return _vector_start[index];}
  243.     inline bool empty(){return ((_vector_capacity) <= 0);}
  244.     inline T* data() const {return _vector_start;}
  245.     inline T* begin() const {return _vector_start;}
  246.     inline T* end() const {return _current;}
  247.     inline T& front() const {return *_vector_start;}
  248.     inline T& back() const {return _current[-1];}
  249.     inline size_t capacity() const {return (_vector_capacity);}
  250.     T& operator[] (unsigned int index) const {return _vector_start[index];}
  251.     inline size_t max_size() const {allocator<T> obj;return obj.max_size();}
  252.  
  253.     _PROTECTED :
  254.         T *_vector_data, *_current, *_vector_end;
  255.  
  256.     private :
  257.  
  258.     inline void allocate(size_t size){
  259.         delete [] _vector_data;
  260.         _vector_data = (T*) new char[sizeof(T) * size];
  261.         _current = _vector_start;
  262.         _vector_end = (_vector_start + size);
  263.     }
  264.  
  265.  
  266.     inline void double_size(){
  267.         T *_temp = (T*) new char[sizeof(T) * (unsigned int)(_vector_capacity) * 2];
  268.         _current = _temp + (_vector_capacity);
  269.         memcpy(_temp, _vector_data, (unsigned int)((char*)_vector_end - (char*)_vector_data));
  270.         _vector_end = _temp + (_vector_capacity) * 2;
  271.         delete [] (char*)_vector_data;_vector_data = _temp;
  272.     }
  273.  
  274.             inline void new_size(size_t size)
  275.     {
  276.         T *_temp = (T*) new char[sizeof(T) * size];
  277.             _current = _temp + (_vector_size);
  278.             memcpy(_temp, _vector_data, (unsigned int)((char*)_vector_end - (char*)_vector_data));
  279.             _vector_end = _temp + size;
  280.             delete [] (char*)_vector_data;_vector_data = _temp;
  281.     }
  282. };
  283. #undef __DESTRUCTOR
  284. #undef __CONSTRUCTOR
  285. #undef _array_start
  286. #undef _vector_capacity
  287. #undef _vector_size
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement