aboutsummaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorMax Horn2002-07-15 20:11:39 +0000
committerMax Horn2002-07-15 20:11:39 +0000
commitce7e480d50bb175ea12b209953647c2c715ebcba (patch)
treecd912ae06c5033fbd610b308727b60cb28fdcf6b /gui
parent44c3cf058930530b0e2c00b907584ba8477f0dc3 (diff)
downloadscummvm-rg350-ce7e480d50bb175ea12b209953647c2c715ebcba.tar.gz
scummvm-rg350-ce7e480d50bb175ea12b209953647c2c715ebcba.tar.bz2
scummvm-rg350-ce7e480d50bb175ea12b209953647c2c715ebcba.zip
replaced EventList and StringList by a universtal List<T> template; remade EventList and StringList using that generic type
svn-id: r4555
Diffstat (limited to 'gui')
-rw-r--r--gui/util.cpp96
-rw-r--r--gui/util.h93
2 files changed, 81 insertions, 108 deletions
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 T>
+class List {
+protected:
+ int _capacity;
+ int _size;
+ T *_data;
+
+public:
+ List<T>() : _capacity(0), _size(0), _data(0) {}
+ List<T>(const List<T>& list) : _capacity(0), _size(0), _data(0)
+ {
+ error("EEEEK! List copy constructor called");
+ }
+
+ ~List<T>()
+ {
+ 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<String> {
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