diff options
Diffstat (limited to 'src/core/smallvec_type.hpp')
-rw-r--r-- | src/core/smallvec_type.hpp | 135 |
1 files changed, 43 insertions, 92 deletions
diff --git a/src/core/smallvec_type.hpp b/src/core/smallvec_type.hpp index 588dd599d..795435d7a 100644 --- a/src/core/smallvec_type.hpp +++ b/src/core/smallvec_type.hpp @@ -14,6 +14,8 @@ #include "alloc_func.hpp" #include "mem_func.hpp" +#include <vector> +#include <algorithm> /** * Simple vector template class. @@ -26,43 +28,30 @@ * @tparam S The steps of allocation */ template <typename T, uint S> -class SmallVector { -protected: - T *data; ///< The pointer to the first item - uint items; ///< The number of items stored - uint capacity; ///< The available space for storing items - +class SmallVector : public std::vector<T> { public: - SmallVector() : data(NULL), items(0), capacity(0) { } + SmallVector() = default; /** * Copy constructor. * @param other The other vector to copy. */ - SmallVector(const SmallVector &other) : data(NULL), items(0), capacity(0) - { - this->Assign(other); - } + SmallVector(const SmallVector &other) = default; /** * Generic copy constructor. * @param other The other vector to copy. */ template <uint X> - SmallVector(const SmallVector<T, X> &other) : data(NULL), items(0), capacity(0) + SmallVector(const SmallVector<T, X> &other) : std::vector<T>(other) { - this->Assign(other); } /** * Assignment. * @param other The other vector to assign. */ - SmallVector &operator=(const SmallVector &other) - { - this->Assign(other); - return *this; - } + SmallVector &operator=(const SmallVector &other) = default; /** * Generic assignment. @@ -75,10 +64,7 @@ public: return *this; } - ~SmallVector() - { - free(this->data); - } + ~SmallVector() = default; /** * Assign items from other vector. @@ -88,8 +74,7 @@ public: { if ((const void *)&other == (void *)this) return; - this->Clear(); - if (other.Length() > 0) MemCpyT<T>(this->Append(other.Length()), other.Begin(), other.Length()); + std::vector<T>::operator=(other); } /** @@ -97,10 +82,7 @@ public: */ inline void Clear() { - /* In fact we just reset the item counter avoiding the need to - * probably reallocate the same amount of memory the list was - * previously using. */ - this->items = 0; + std::vector<T>::clear(); } /** @@ -108,10 +90,8 @@ public: */ inline void Reset() { - this->items = 0; - this->capacity = 0; - free(data); - data = NULL; + std::vector<T>::clear(); + std::vector<T>::shrink_to_fit(); } /** @@ -119,11 +99,7 @@ public: */ inline void Compact() { - uint capacity = Align(this->items, S); - if (capacity >= this->capacity) return; - - this->capacity = capacity; - this->data = ReallocT(this->data, this->capacity); + std::vector<T>::shrink_to_fit(); } /** @@ -133,15 +109,8 @@ public: */ inline T *Append(uint to_add = 1) { - uint begin = this->items; - this->items += to_add; - - if (this->items > this->capacity) { - this->capacity = Align(this->items, S); - this->data = ReallocT(this->data, this->capacity); - } - - return &this->data[begin]; + std::vector<T>::resize(std::vector<T>::size() + to_add); + return this->End() - to_add; } /** @@ -150,12 +119,7 @@ public: */ inline void Resize(uint num_items) { - this->items = num_items; - - if (this->items > this->capacity) { - this->capacity = Align(this->items, S); - this->data = ReallocT(this->data, this->capacity); - } + std::vector<T>::resize(num_items); } /** @@ -167,11 +131,8 @@ public: { assert(item >= this->Begin() && item <= this->End()); - size_t to_move = this->End() - item; size_t start = item - this->Begin(); - - this->Append(); - if (to_move > 0) MemMoveT(this->Begin() + start + 1, this->Begin() + start, to_move); + std::vector<T>::insert(std::vector<T>::begin() + start); return this->Begin() + start; } @@ -211,14 +172,8 @@ public: */ inline int FindIndex(const T &item) const { - int index = 0; - const T *pos = this->Begin(); - const T *end = this->End(); - while (pos != end && *pos != item) { - pos++; - index++; - } - return pos == end ? -1 : index; + auto const it = this->Find(item); + return it == this->End() ? -1 : it - this->Begin(); } /** @@ -240,7 +195,8 @@ public: inline void Erase(T *item) { assert(item >= this->Begin() && item < this->End()); - *item = this->data[--this->items]; + *item = std::vector<T>::back(); + std::vector<T>::pop_back(); } /** @@ -250,7 +206,8 @@ public: */ void ErasePreservingOrder(uint pos, uint count = 1) { - ErasePreservingOrder(this->data + pos, count); + auto const it = std::vector<T>::begin() + pos; + std::vector<T>::erase(it, it + count); } /** @@ -260,13 +217,7 @@ public: */ inline void ErasePreservingOrder(T *item, uint count = 1) { - if (count == 0) return; - assert(item >= this->Begin()); - assert(item + count <= this->End()); - - this->items -= count; - ptrdiff_t to_move = this->End() - item; - if (to_move > 0) MemMoveT(item, item + count, to_move); + this->ErasePreservingOrder(item - this->Begin(), count); } /** @@ -289,7 +240,7 @@ public: */ inline uint Length() const { - return this->items; + return std::vector<T>::size(); } /** @@ -299,7 +250,7 @@ public: */ inline const T *Begin() const { - return this->data; + return std::vector<T>::data(); } /** @@ -309,7 +260,7 @@ public: */ inline T *Begin() { - return this->data; + return std::vector<T>::data(); } /** @@ -319,7 +270,7 @@ public: */ inline const T *End() const { - return &this->data[this->items]; + return std::vector<T>::data() + std::vector<T>::size(); } /** @@ -329,7 +280,7 @@ public: */ inline T *End() { - return &this->data[this->items]; + return std::vector<T>::data() + std::vector<T>::size(); } /** @@ -341,8 +292,8 @@ public: inline const T *Get(uint index) const { /* Allow access to the 'first invalid' item */ - assert(index <= this->items); - return &this->data[index]; + assert(index <= std::vector<T>::size()); + return this->Begin() + index; } /** @@ -354,8 +305,8 @@ public: inline T *Get(uint index) { /* Allow access to the 'first invalid' item */ - assert(index <= this->items); - return &this->data[index]; + assert(index <= std::vector<T>::size()); + return this->Begin() + index; } /** @@ -366,8 +317,8 @@ public: */ inline const T &operator[](uint index) const { - assert(index < this->items); - return this->data[index]; + assert(index < std::vector<T>::size()); + return std::vector<T>::operator[](index); } /** @@ -378,8 +329,8 @@ public: */ inline T &operator[](uint index) { - assert(index < this->items); - return this->data[index]; + assert(index < std::vector<T>::size()); + return std::vector<T>::operator[](index); } }; @@ -407,11 +358,11 @@ public: */ inline void Clear() { - for (uint i = 0; i < this->items; i++) { - free(this->data[i]); + for (uint i = 0; i < std::vector<T>::size(); i++) { + free(std::vector<T>::operator[](i)); } - this->items = 0; + std::vector<T>::clear(); } }; @@ -438,11 +389,11 @@ public: */ inline void Clear() { - for (uint i = 0; i < this->items; i++) { - delete this->data[i]; + for (uint i = 0; i < std::vector<T>::size(); i++) { + delete std::vector<T>::operator[](i); } - this->items = 0; + std::vector<T>::clear(); } }; |