diff options
-rw-r--r-- | gui/util.cpp | 96 | ||||
-rw-r--r-- | gui/util.h | 93 | ||||
-rw-r--r-- | newgui.cpp | 2 | ||||
-rw-r--r-- | newgui.h | 23 |
4 files changed, 85 insertions, 129 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 diff --git a/newgui.cpp b/newgui.cpp index 0d9de41f8b..f5826884b9 100644 --- a/newgui.cpp +++ b/newgui.cpp @@ -110,7 +110,7 @@ void NewGui::loop() for (int i = 0; i < _eventList.size(); i++) { - t = _eventList.getEvent(i); + t = _eventList[i]; switch(t.event_code) { case OSystem::EVENT_KEYDOWN: @@ -24,6 +24,7 @@ #include "scummsys.h" #include "system.h" // For events #include "scumm.h" // For events +#include "gui/util.h" class Dialog; class Scumm; @@ -45,25 +46,7 @@ public: void pop() { if (_size > 0) _stack[--_size] = 0; } }; -class EventList { -protected: - OSystem::Event _stack[100]; - int _size; -public: - EventList() : _size(0) {} - - void addEvent(const OSystem::Event &d) { - if (_size<(100-1)) - _stack[_size++] = d; - else - error("EventList overflow."); - } - - const OSystem::Event &getEvent(int i) const { return _stack[i]; } - int size() const { return _size; } - void clear() { _size = 0; } -}; - +typedef List<OSystem::Event> EventList; // This class hopefully will replace the old Gui class completly one day class NewGui { @@ -86,7 +69,7 @@ public: NewGui(Scumm *s); - void handleEvent(const OSystem::Event &event) { _eventList.addEvent(event); } + void handleEvent(const OSystem::Event &event) { _eventList.push_back(event); } protected: Scumm *_s; |