|
@@ -1,7 +1,7 @@ |
|
|
// |
|
|
// |
|
|
// Lol Engine |
|
|
// Lol Engine |
|
|
// |
|
|
// |
|
|
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> |
|
|
|
|
|
|
|
|
// Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> |
|
|
// (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com> |
|
|
// (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com> |
|
|
// This program is free software; you can redistribute it and/or |
|
|
// This program is free software; you can redistribute it and/or |
|
|
// modify it under the terms of the Do What The Fuck You Want To |
|
|
// modify it under the terms of the Do What The Fuck You Want To |
|
@@ -133,15 +133,17 @@ public: |
|
|
{ |
|
|
{ |
|
|
/* Allow array[0] even if size is zero so that people can |
|
|
/* Allow array[0] even if size is zero so that people can |
|
|
* always use &array[0] to get a pointer to the data. */ |
|
|
* always use &array[0] to get a pointer to the data. */ |
|
|
ASSERT(n >= 0); |
|
|
|
|
|
ASSERT(n < m_count || (!n && !m_count)); |
|
|
|
|
|
|
|
|
ASSERT(n >= 0 && (n < m_count || (!n && !m_count)), |
|
|
|
|
|
"cannot access index %lld in array of size %lld", |
|
|
|
|
|
(long long int)n, (long long int)m_count); |
|
|
return m_data[n]; |
|
|
return m_data[n]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
inline element_t const& operator[](ptrdiff_t n) const |
|
|
inline element_t const& operator[](ptrdiff_t n) const |
|
|
{ |
|
|
{ |
|
|
ASSERT(n >= 0); |
|
|
|
|
|
ASSERT(n < m_count || (!n && !m_count)); |
|
|
|
|
|
|
|
|
ASSERT(n >= 0 && (n < m_count || (!n && !m_count)), |
|
|
|
|
|
"cannot access index %lld in array of size %lld", |
|
|
|
|
|
(long long int)n, (long long int)m_count); |
|
|
return m_data[n]; |
|
|
return m_data[n]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@@ -205,8 +207,9 @@ public: |
|
|
|
|
|
|
|
|
inline void Insert(T const &x, ptrdiff_t pos) |
|
|
inline void Insert(T const &x, ptrdiff_t pos) |
|
|
{ |
|
|
{ |
|
|
ASSERT(pos >= 0); |
|
|
|
|
|
ASSERT(pos <= m_count); |
|
|
|
|
|
|
|
|
ASSERT(pos >= 0 && pos <= m_count, |
|
|
|
|
|
"cannot insert at index %lld in array of size %lld", |
|
|
|
|
|
(long long int)pos, (long long int)m_count); |
|
|
|
|
|
|
|
|
if (m_count >= m_reserved) |
|
|
if (m_count >= m_reserved) |
|
|
Grow(); |
|
|
Grow(); |
|
@@ -222,8 +225,9 @@ public: |
|
|
|
|
|
|
|
|
inline bool InsertUnique(T const &x, ptrdiff_t pos) |
|
|
inline bool InsertUnique(T const &x, ptrdiff_t pos) |
|
|
{ |
|
|
{ |
|
|
ASSERT(pos >= 0); |
|
|
|
|
|
ASSERT(pos <= m_count); |
|
|
|
|
|
|
|
|
ASSERT(pos >= 0 && pos <= m_count, |
|
|
|
|
|
"cannot insert at index %lld in array of size %lld", |
|
|
|
|
|
(long long int)pos, (long long int)m_count); |
|
|
|
|
|
|
|
|
if (Find(x) != INDEX_NONE) |
|
|
if (Find(x) != INDEX_NONE) |
|
|
return false; |
|
|
return false; |
|
@@ -284,10 +288,12 @@ public: |
|
|
|
|
|
|
|
|
void Swap(ptrdiff_t pos1, ptrdiff_t pos2) |
|
|
void Swap(ptrdiff_t pos1, ptrdiff_t pos2) |
|
|
{ |
|
|
{ |
|
|
ASSERT(pos1 >= 0); |
|
|
|
|
|
ASSERT(pos2 >= 0); |
|
|
|
|
|
ASSERT(pos1 < m_count); |
|
|
|
|
|
ASSERT(pos2 < m_count); |
|
|
|
|
|
|
|
|
ASSERT(pos1 >= 0 && pos1 <= m_count, |
|
|
|
|
|
"cannot swap index %lld in array of size %lld", |
|
|
|
|
|
(long long int)pos1, (long long int)m_count); |
|
|
|
|
|
ASSERT(pos2 >= 0 && pos2 <= m_count, |
|
|
|
|
|
"cannot swap index %lld in array of size %lld", |
|
|
|
|
|
(long long int)pos2, (long long int)m_count); |
|
|
|
|
|
|
|
|
if (pos1 != pos2) |
|
|
if (pos1 != pos2) |
|
|
std::swap((*this)[pos1], (*this)[pos2]); |
|
|
std::swap((*this)[pos1], (*this)[pos2]); |
|
@@ -296,8 +302,11 @@ public: |
|
|
void Remove(ptrdiff_t pos, ptrdiff_t todelete = 1) |
|
|
void Remove(ptrdiff_t pos, ptrdiff_t todelete = 1) |
|
|
{ |
|
|
{ |
|
|
ASSERT(todelete >= 0); |
|
|
ASSERT(todelete >= 0); |
|
|
ASSERT(pos - todelete >= -m_count - 1); |
|
|
|
|
|
ASSERT(pos + todelete <= m_count); |
|
|
|
|
|
|
|
|
ASSERT(pos - todelete >= -m_count - 1 && pos + todelete <= m_count, |
|
|
|
|
|
"cannot remove %lld elements at %lld in array of size %lld", |
|
|
|
|
|
(long long int)todelete, (long long int)pos, |
|
|
|
|
|
(long long int)m_count); |
|
|
|
|
|
|
|
|
if (pos < 0) |
|
|
if (pos < 0) |
|
|
pos = m_count + pos; |
|
|
pos = m_count + pos; |
|
|
|
|
|
|
|
@@ -311,8 +320,11 @@ public: |
|
|
void RemoveSwap(ptrdiff_t pos, ptrdiff_t todelete = 1) |
|
|
void RemoveSwap(ptrdiff_t pos, ptrdiff_t todelete = 1) |
|
|
{ |
|
|
{ |
|
|
ASSERT(todelete >= 0); |
|
|
ASSERT(todelete >= 0); |
|
|
ASSERT(pos - todelete >= -m_count - 1); |
|
|
|
|
|
ASSERT(pos + todelete <= m_count); |
|
|
|
|
|
|
|
|
ASSERT(pos - todelete >= -m_count - 1 && pos + todelete <= m_count, |
|
|
|
|
|
"cannot remove %lld elements at %lld in array of size %lld", |
|
|
|
|
|
(long long int)todelete, (long long int)pos, |
|
|
|
|
|
(long long int)m_count); |
|
|
|
|
|
|
|
|
if (pos < 0) |
|
|
if (pos < 0) |
|
|
pos = m_count + pos; |
|
|
pos = m_count + pos; |
|
|
|
|
|
|
|
@@ -485,8 +497,9 @@ public: |
|
|
|
|
|
|
|
|
inline void Insert(ptrdiff_t pos, T... args) |
|
|
inline void Insert(ptrdiff_t pos, T... args) |
|
|
{ |
|
|
{ |
|
|
ASSERT(pos >= 0); |
|
|
|
|
|
ASSERT(pos <= this->m_count); |
|
|
|
|
|
|
|
|
ASSERT(pos >= 0 && pos <= this->m_count, |
|
|
|
|
|
"cannot insert at index %lld in array of size %lld", |
|
|
|
|
|
(long long int)pos, (long long int)this->m_count); |
|
|
|
|
|
|
|
|
if (this->m_count >= this->m_reserved) |
|
|
if (this->m_count >= this->m_reserved) |
|
|
this->Grow(); |
|
|
this->Grow(); |
|
|