浏览代码

base: add safety asserts to the Array and String classes.

legacy
Sam Hocevar sam 12 年前
父节点
当前提交
0ea4133bba
共有 2 个文件被更改,包括 25 次插入1 次删除
  1. +14
    -0
      src/lol/base/array.h
  2. +11
    -1
      src/lol/base/string.h

+ 14
- 0
src/lol/base/array.h 查看文件

@@ -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. */


+ 11
- 1
src/lol/base/string.h 查看文件

@@ -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';
}


正在加载...
取消
保存