From 2f27b7da8dd0cab3d9ab89753c8fcf6036331aab Mon Sep 17 00:00:00 2001 From: Pavol Marko Date: Tue, 6 Sep 2005 09:34:13 +0000 Subject: [PATCH] zomg! updated teh vectorz codeses a bit! Hopefully didn't break anything --- amxmodx/CVector.h | 99 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 28 deletions(-) diff --git a/amxmodx/CVector.h b/amxmodx/CVector.h index d6b87eb5..45f0d548 100755 --- a/amxmodx/CVector.h +++ b/amxmodx/CVector.h @@ -70,32 +70,58 @@ template class CVector // change size if (size == m_Size) return true; + + if (!size) + { + if (m_Data) + { + delete [] m_Data; + m_Data = NULL; + m_Size = 0; + } + return true; + } + T *newData = new T[size]; if (!newData) return false; if (m_Data) { - size_t end = (m_Size < size) ? (m_Size) : size; + size_t end = (m_CurrentUsedSize < size) ? (m_CurrentUsedSize) : size; for (size_t i=0; i m_Size) + m_CurrentUsedSize = m_Size; + return true; } void FreeMemIfPossible() { + if (!m_Data) + return; + if (!m_CurrentUsedSize) + { + ChangeSize(0); + return; + } + + size_t newSize = m_Size; + while (m_CurrentUsedSize <= newSize / 2) + newSize /= 2; + + if (newSize != m_Size) + ChangeSize(newSize); } protected: T *m_Data; size_t m_Size; size_t m_CurrentUsedSize; - size_t m_CurrentSize; public: class iterator { @@ -189,7 +215,7 @@ public: iterator & operator-=(size_t offset) { - m_Ptr += offset; + m_Ptr -= offset; return (*this); } @@ -203,10 +229,10 @@ public: iterator operator-(size_t offset) const { iterator tmp(*this); - tmp.m_Ptr += offset; + tmp.m_Ptr -= offset; return tmp; } - + T & operator[](size_t offset) { return (*(*this + offset)); @@ -277,12 +303,12 @@ public: return m_Size; } - iterator begin() + iterator begin() const { return iterator(m_Data); } - iterator end() + iterator end() const { return iterator(m_Data + m_CurrentUsedSize); } @@ -296,7 +322,9 @@ public: bool reserve(size_t newSize) { - return ChangeSize(newSize); + if (newSize > m_Size) + return ChangeSize(newSize); + return true; } bool push_back(const T & elem) @@ -317,14 +345,15 @@ public: --m_CurrentUsedSize; if (m_CurrentUsedSize < 0) m_CurrentUsedSize = 0; - // :TODO: free memory sometimes + + FreeMemIfPossible(); } bool resize(size_t newSize) { if (!ChangeSize(newSize)) return false; - FreeMemIfPossible(); + m_CurrentUsedSize = newSize; return true; } @@ -397,15 +426,13 @@ public: return m_Data[m_CurrentUsedSize - 1]; } - bool insert(iterator where, const T & value) + iterator insert(iterator where, const T & value) { - // we have to insert before - // if it is begin, don't decrement - if (where != m_Data) - --where; // validate iter - if (where < m_Data || where >= (m_Data + m_CurrentUsedSize)) - return false; + if (where < m_Data || where > (m_Data + m_CurrentUsedSize)) + return iterator(0); + + size_t ofs = where - begin(); ++m_CurrentUsedSize; if (!GrowIfNeeded()) @@ -414,33 +441,49 @@ public: return false; } - memmove(where.base() + 1, where.base(), m_CurrentUsedSize - (where - m_Data)); - memcpy(where.base(), &value, sizeof(T)); - return true; + where = begin() + ofs; + + // Move subsequent entries + for (T *ptr = m_Data + m_CurrentUsedSize - 2; ptr >= where.base(); --ptr) + *(ptr + 1) = *ptr; + + *where.base() = value; + + return where; } - void erase(iterator where) + iterator erase(iterator where) { // validate iter if (where < m_Data || where >= (m_Data + m_CurrentUsedSize)) - return false; + return iterator(0); + + size_t ofs = where - begin(); if (m_CurrentUsedSize > 1) { // move - memmove(where.base(), where.base() + 1, m_CurrentUsedSize - 1); + T *theend = m_Data + m_CurrentUsedSize; + for (T *ptr = where.base() + 1; ptr < theend; ++ptr) + *(ptr - 1) = *ptr; } --m_CurrentUsedSize; - // :TODO: free memory sometimes + + FreeMemIfPossible(); + + return begin() + ofs; } void clear() { m_Size = 0; m_CurrentUsedSize = 0; - delete [] m_Data; - m_Data = NULL; + if (m_Data) + { + delete [] m_Data; + m_Data = NULL; + } } };