From ce7e480d50bb175ea12b209953647c2c715ebcba Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 15 Jul 2002 20:11:39 +0000 Subject: replaced EventList and StringList by a universtal List template; remade EventList and StringList using that generic type svn-id: r4555 --- gui/util.cpp | 96 ++++++++---------------------------------------------------- gui/util.h | 93 +++++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 81 insertions(+), 108 deletions(-) (limited to 'gui') diff --git a/gui/util.cpp b/gui/util.cpp index 2bd3ee4fda..26475a8392 100644 --- a/gui/util.cpp +++ b/gui/util.cpp @@ -110,7 +110,8 @@ String& String::operator =(const char* str) ensureCapacity(len, false); _len = len; - memcpy(_str, str, _len + 1); + if (_str) + memcpy(_str, str, _len + 1); return *this; } @@ -121,7 +122,8 @@ String& String::operator =(const String& str) ensureCapacity(len, false); _len = len; - memcpy(_str, str._str, _len + 1); + if (_str) + memcpy(_str, str._str, _len + 1); return *this; } @@ -131,7 +133,8 @@ String& String::operator +=(const char* str) int len = strlen(str); ensureCapacity(_len + len, true); - memcpy(_str + _len, str, len + 1); + if (_str) + memcpy(_str + _len, str, len + 1); _len += len; return *this; @@ -142,7 +145,8 @@ String& String::operator +=(const String& str) int len = str._len; ensureCapacity(_len + len, true); - memcpy(_str + _len, str._str, len + 1); + if (_str && str._str) + memcpy(_str + _len, str._str, len + 1); _len += len; return *this; @@ -161,9 +165,11 @@ String& String::operator +=(char c) void String::clear() { - _len = 0; if (_str) - _str[0] = 0; + free(_str); + _capacity = 0; + _len = 0; + _str = 0; } void String::ensureCapacity(int new_len, bool keep_old) @@ -181,81 +187,3 @@ void String::ensureCapacity(int new_len, bool keep_old) free(old_str); } } - - -#pragma mark - - - -StringList::StringList(const StringList& list) - : _capacity(0), _size(0), _data(0) -{ - printf("EEEEK! StringList copy constructor called!\n"); - assert(0); -} - -StringList::~StringList() -{ - if (_data) { - for (int i = 0; i < _capacity; i++) - if (_data[_size]) - delete _data[_size]; - free(_data); - } -} - - -void StringList::push_back(const char* str) -{ - ensureCapacity(_size + 1); - - if (!_data[_size]) - _data[_size] = new String(str); - else - *_data[_size] = str; - - _size++; -} - -void StringList::push_back(const String& str) -{ - ensureCapacity(_size + 1); - - if (!_data[_size]) - _data[_size] = new String(str); - else - *_data[_size] = str; - - _size++; -} - -String& StringList::operator [](int idx) -{ - assert(idx >= 0 && idx < _size); - return *_data[idx]; -} - -const String& StringList::operator [](int idx) const -{ - assert(idx >= 0 && idx < _size); - return *_data[idx]; -} - -void StringList::clear() -{ - _size = 0; -} - -void StringList::ensureCapacity(int new_len) -{ - if (new_len <= _capacity) - return; - - String **old_data = _data; - _capacity = new_len + 32; - _data = (String **)calloc(sizeof(String*), _capacity); - - if (old_data) { - memcpy(_data, old_data, _size * sizeof(String*)); - free(old_data); - } -} diff --git a/gui/util.h b/gui/util.h index 0d2a9560d7..c1bd9bbc77 100644 --- a/gui/util.h +++ b/gui/util.h @@ -29,6 +29,69 @@ int Blend(int src, int dst, byte *palette); void ClearBlendCache(byte *palette, int weight); +template +class List { +protected: + int _capacity; + int _size; + T *_data; + +public: + List() : _capacity(0), _size(0), _data(0) {} + List(const List& list) : _capacity(0), _size(0), _data(0) + { + error("EEEEK! List copy constructor called"); + } + + ~List() + { + if (_data) + delete [] _data; + } + + void push_back(const T& str) + { + ensureCapacity(_size + 1); + _data[_size++] = str; + } + + // TODO: insert, remove, ... + + T& operator [](int idx) + { + assert(idx >= 0 && idx < _size); + return _data[idx]; + } + + const T& operator [](int idx) const + { + assert(idx >= 0 && idx < _size); + return _data[idx]; + } + + int size() const { return _size; } + + void clear() { _size = 0; } + +protected: + void ensureCapacity(int new_len) + { + if (new_len <= _capacity) + return; + + T *old_data = _data; + _capacity = new_len + 32; + _data = new T[_capacity]; + + if (old_data) { + // Copy old data + for (int i = 0; i < _size; i++) + _data[i] = old_data[i]; + delete [] old_data; + } + } +}; + class String { protected: int _capacity; @@ -57,31 +120,13 @@ protected: void ensureCapacity(int new_len, bool keep_old); }; -class StringList { -protected: - int _capacity; - int _size; - String **_data; +class StringList : public List { public: - StringList() : _capacity(0), _size(0), _data(0) {} - StringList(const StringList& list); - ~StringList(); - - void push_back(const char* str); - void push_back(const String& str); - - // TODO: insert, remove, ... - - String& operator [](int idx); - const String& operator [](int idx) const; - - int size() const { return _size; } - - void clear(); - -protected: - void ensureCapacity(int new_len); + void push_back(const char* str) + { + ensureCapacity(_size + 1); + _data[_size++] = str; + } }; - #endif -- cgit v1.2.3