| @@ -18,6 +18,8 @@ | |||
| #if !defined __LOL_BASE_ARRAY_H__ | |||
| #define __LOL_BASE_ARRAY_H__ | |||
| #include <lol/base/assert.h> | |||
| #include <new> | |||
| #include <stdint.h> | |||
| @@ -118,21 +120,29 @@ public: | |||
| inline Element& operator[](int n) | |||
| { | |||
| /* Allow array[0] even if size is zero so that people can | |||
| * always use &array[0] to get a pointer to the data. */ | |||
| ASSERT(n >= 0); | |||
| ASSERT(n < m_count || (!n && !m_count)); | |||
| return m_data[n]; | |||
| } | |||
| inline Element const& operator[](int n) const | |||
| { | |||
| ASSERT(n >= 0); | |||
| ASSERT(n < m_count || (!n && !m_count)); | |||
| return m_data[n]; | |||
| } | |||
| inline Element& Last() | |||
| { | |||
| ASSERT(m_count > 0); | |||
| return m_data[m_count - 1]; | |||
| } | |||
| inline Element const& Last() const | |||
| { | |||
| ASSERT(m_count > 0); | |||
| return m_data[m_count - 1]; | |||
| } | |||
| @@ -158,11 +168,14 @@ public: | |||
| inline void Pop() | |||
| { | |||
| ASSERT(m_count > 0); | |||
| Remove(m_count - 1, 1); | |||
| } | |||
| void Remove(int pos, int todelete = 1) | |||
| { | |||
| ASSERT(pos >= 0); | |||
| ASSERT(pos + todelete <= m_count); | |||
| for (int i = pos; i + todelete < m_count; i++) | |||
| m_data[i] = m_data[i + todelete]; | |||
| for (int i = m_count - todelete; i < m_count; i++) | |||
| @@ -172,6 +185,7 @@ public: | |||
| void Resize(int count, Element e = Element()) | |||
| { | |||
| ASSERT(count > 0); | |||
| Reserve(count); | |||
| /* Too many elements? Remove them. */ | |||
| @@ -17,6 +17,7 @@ | |||
| #if !defined __LOL_BASE_STRING_H__ | |||
| #define __LOL_BASE_STRING_H__ | |||
| #include <lol/base/assert.h> | |||
| #include <lol/base/array.h> | |||
| #include <cstring> | |||
| @@ -41,6 +42,7 @@ public: | |||
| : Super() | |||
| { | |||
| using namespace std; | |||
| ASSERT(str); | |||
| Resize((int)strlen(str)); | |||
| memcpy(&(*this)[0], str, Count() + 1); | |||
| } | |||
| @@ -49,9 +51,10 @@ public: | |||
| : Super() | |||
| { | |||
| using namespace std; | |||
| ASSERT(str); | |||
| Resize(count); | |||
| memcpy(&(*this)[0], str, count); | |||
| (*this)[count] = '\0'; | |||
| ((Super &)*this)[count] = '\0'; | |||
| } | |||
| inline String(String const &s) | |||
| @@ -61,21 +64,27 @@ public: | |||
| inline char &operator [](int n) | |||
| { | |||
| ASSERT(n >= 0); | |||
| ASSERT(n < Count() || (!n && !Count())); | |||
| return ((Super &)*this)[n]; | |||
| } | |||
| inline char const &operator [](int n) const | |||
| { | |||
| ASSERT(n >= 0); | |||
| ASSERT(n < Count() || (!n && !Count())); | |||
| return ((Super const &)*this)[n]; | |||
| } | |||
| inline char &Last() | |||
| { | |||
| ASSERT(Count() > 0); | |||
| return (*this)[Count() - 1]; | |||
| } | |||
| inline char const &Last() const | |||
| { | |||
| ASSERT(Count() > 0); | |||
| return (*this)[Count() - 1]; | |||
| } | |||
| @@ -86,6 +95,7 @@ public: | |||
| void Resize(int count) | |||
| { | |||
| ASSERT(count >= 0, "count = %d", count); | |||
| ((Super &)*this).Resize(count + 1); | |||
| ((Super &)*this).Last() = '\0'; | |||
| } | |||