diff options
-rw-r--r-- | common/archive.cpp | 13 | ||||
-rw-r--r-- | common/archive.h | 3 | ||||
-rw-r--r-- | common/list.h | 103 | ||||
-rw-r--r-- | common/list_intern.h | 172 | ||||
-rw-r--r-- | engines/kyra/resource_intern.cpp | 9 | ||||
-rw-r--r-- | engines/m4/viewmgr.h | 3 | ||||
-rw-r--r-- | engines/saga/render.cpp | 2 | ||||
-rw-r--r-- | engines/scumm/debugger.cpp | 2 | ||||
-rw-r--r-- | gui/ThemeEngine.cpp | 4 |
9 files changed, 206 insertions, 105 deletions
diff --git a/common/archive.cpp b/common/archive.cpp index 7f81ecc7fb..a39d78dd9e 100644 --- a/common/archive.cpp +++ b/common/archive.cpp @@ -67,7 +67,7 @@ int Archive::listMatchingMembers(ArchiveMemberList &list, const String &pattern) -SearchSet::ArchiveNodeList::iterator SearchSet::find(const String &name) const { +SearchSet::ArchiveNodeList::iterator SearchSet::find(const String &name) { ArchiveNodeList::iterator it = _list.begin(); for ( ; it != _list.end(); ++it) { if (it->_name == name) @@ -76,6 +76,15 @@ SearchSet::ArchiveNodeList::iterator SearchSet::find(const String &name) const { return it; } +SearchSet::ArchiveNodeList::const_iterator SearchSet::find(const String &name) const { + ArchiveNodeList::const_iterator it = _list.begin(); + for ( ; it != _list.end(); ++it) { + if (it->_name == name) + break; + } + return it; +} + /* Keep the nodes sorted according to descending priorities. In case two or node nodes have the same priority, insertion @@ -203,7 +212,7 @@ SeekableReadStream *SearchSet::createReadStreamForMember(const String &name) con if (name.empty()) return 0; - ArchiveNodeList::iterator it = _list.begin(); + ArchiveNodeList::const_iterator it = _list.begin(); for ( ; it != _list.end(); ++it) { SeekableReadStream *stream = it->_arc->createReadStreamForMember(name); if (stream) diff --git a/common/archive.h b/common/archive.h index ba3445cc16..69e29a73f2 100644 --- a/common/archive.h +++ b/common/archive.h @@ -144,7 +144,8 @@ class SearchSet : public Archive { typedef List<Node> ArchiveNodeList; ArchiveNodeList _list; - ArchiveNodeList::iterator find(const String &name) const; + ArchiveNodeList::iterator find(const String &name); + ArchiveNodeList::const_iterator find(const String &name) const; // Add an archive keeping the list sorted by ascending priorities. void insert(const Node& node); diff --git a/common/list.h b/common/list.h index 0372d217b7..325c8e8bd5 100644 --- a/common/list.h +++ b/common/list.h @@ -25,7 +25,7 @@ #ifndef COMMON_LIST_H #define COMMON_LIST_H -#include "common/scummsys.h" +#include "common/list_intern.h" namespace Common { @@ -33,100 +33,17 @@ namespace Common { * Simple double linked list, modeled after the list template of the standard * C++ library. */ -template<class t_T> +template<typename t_T> class List { protected: -#if defined (_WIN32_WCE) || defined (_MSC_VER) -//FIXME evc4 and msvc7 doesn't like it as protected member -public: -#endif - struct NodeBase { - NodeBase *_prev; - NodeBase *_next; - }; - - template <class t_T2> - struct Node : public NodeBase { - t_T2 _data; - - Node(const t_T2 &x) : _data(x) {} - }; - - template<class t_T2> - class Iterator { - template<class T> friend class Iterator; - friend class List<t_T>; - NodeBase *_node; - -#if !defined (__WINSCW__) - explicit Iterator(NodeBase *node) : _node(node) {} -#else - Iterator(NodeBase *node) : _node(node) {} -#endif - - public: - Iterator() : _node(0) {} - template<class T> - Iterator(const Iterator<T> &c) : _node(c._node) {} - - template<class T> - Iterator<t_T2> &operator=(const Iterator<T> &c) { - _node = c._node; - return *this; - } - - // Prefix inc - Iterator<t_T2> &operator++() { - if (_node) - _node = _node->_next; - return *this; - } - // Postfix inc - Iterator<t_T2> operator++(int) { - Iterator tmp(_node); - ++(*this); - return tmp; - } - // Prefix dec - Iterator<t_T2> &operator--() { - if (_node) - _node = _node->_prev; - return *this; - } - // Postfix dec - Iterator<t_T2> operator--(int) { - Iterator tmp(_node); - --(*this); - return tmp; - } - t_T2 &operator*() const { - assert(_node); -#if (__GNUC__ == 2) && (__GNUC_MINOR__ >= 95) - return static_cast<List<t_T>::Node<t_T2> *>(_node)->_data; -#else - return static_cast<Node<t_T2> *>(_node)->_data; -#endif - } - t_T2 *operator->() const { - return &(operator*()); - } - - template<class T> - bool operator==(const Iterator<T> &x) const { - return _node == x._node; - } - - template<class T> - bool operator!=(const Iterator<T> &x) const { - return _node != x._node; - } - }; + typedef ListInternal::NodeBase NodeBase; + typedef ListInternal::Node<t_T> Node; NodeBase _anchor; public: - typedef Iterator<t_T> iterator; - typedef Iterator<const t_T> const_iterator; + typedef ListInternal::Iterator<t_T> iterator; + typedef ListInternal::ConstIterator<t_T> const_iterator; typedef t_T value_type; @@ -155,7 +72,7 @@ public: } void insert(iterator pos, const t_T &element) { - NodeBase *newNode = new Node<t_T>(element); + ListInternal::NodeBase *newNode = new Node(element); newNode->_next = pos._node; newNode->_prev = pos._node->_prev; @@ -174,7 +91,7 @@ public: NodeBase *next = pos._node->_next; NodeBase *prev = pos._node->_prev; - Node<t_T> *node = static_cast<Node<t_T> *>(pos._node); + Node *node = static_cast<Node *>(pos._node); prev->_next = next; next->_prev = prev; delete node; @@ -186,7 +103,7 @@ public: NodeBase *next = pos._node->_next; NodeBase *prev = pos._node->_prev; - Node<t_T> *node = static_cast<Node<t_T> *>(pos._node); + Node *node = static_cast<Node *>(pos._node); prev->_next = next; next->_prev = prev; delete node; @@ -221,7 +138,7 @@ public: const_iterator j; for (i = begin(), j = list.begin(); (i != end()) && (j != list.end()) ; ++i, ++j) { - static_cast<Node<t_T> *>(i._node)->_data = static_cast<Node<t_T> *>(j._node)->_data; + static_cast<Node *>(i._node)->_data = static_cast<const Node *>(j._node)->_data; } if (i == end()) diff --git a/common/list_intern.h b/common/list_intern.h new file mode 100644 index 0000000000..79e2deb939 --- /dev/null +++ b/common/list_intern.h @@ -0,0 +1,172 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef COMMON_LIST_INTERN_H +#define COMMON_LIST_INTERN_H + +#include "common/scummsys.h" + +namespace Common { + +template<typename T> class List; + + +namespace ListInternal { + struct NodeBase { + NodeBase *_prev; + NodeBase *_next; + }; + + template <typename T> + struct Node : public NodeBase { + T _data; + + Node(const T &x) : _data(x) {} + }; + + template<typename T> class ConstIterator; + + template<typename T> + struct Iterator { + typedef Iterator<T> Self; + typedef Node<T> * NodePtr; + typedef T & ValueRef; + typedef T * ValuePtr; + + NodeBase *_node; + + Iterator() : _node(0) {} + Iterator(NodeBase *node) : _node(node) {} + + // Prefix inc + Self &operator++() { + if (_node) + _node = _node->_next; + return *this; + } + // Postfix inc + Self operator++(int) { + Self tmp(_node); + ++(*this); + return tmp; + } + // Prefix dec + Self &operator--() { + if (_node) + _node = _node->_prev; + return *this; + } + // Postfix dec + Self operator--(int) { + Self tmp(_node); + --(*this); + return tmp; + } + ValueRef operator*() const { + assert(_node); + return static_cast<NodePtr>(_node)->_data; + } + ValuePtr operator->() const { + return &(operator*()); + } + + bool operator==(const Self &x) const { + return _node == x._node; + } + + bool operator!=(const Self &x) const { + return _node != x._node; + } + }; + + template<typename T> + struct ConstIterator { + typedef ConstIterator<T> Self; + typedef const Node<T> * NodePtr; + typedef const T & ValueRef; + typedef const T * ValuePtr; + + const NodeBase *_node; + + ConstIterator() : _node(0) {} + ConstIterator(const NodeBase *node) : _node(node) {} + ConstIterator(const Iterator<T> &x) : _node(x._node) {} + + // Prefix inc + Self &operator++() { + if (_node) + _node = _node->_next; + return *this; + } + // Postfix inc + Self operator++(int) { + Self tmp(_node); + ++(*this); + return tmp; + } + // Prefix dec + Self &operator--() { + if (_node) + _node = _node->_prev; + return *this; + } + // Postfix dec + Self operator--(int) { + Self tmp(_node); + --(*this); + return tmp; + } + ValueRef operator*() const { + assert(_node); + return static_cast<NodePtr>(_node)->_data; + } + ValuePtr operator->() const { + return &(operator*()); + } + + bool operator==(const Self &x) const { + return _node == x._node; + } + + bool operator!=(const Self &x) const { + return _node != x._node; + } + }; + + + template<typename T> + bool operator==(const Iterator<T>& a, const ConstIterator<T>& b) { + return a._node == b._node; + } + + template<typename T> + bool operator!=(const Iterator<T>& a, const ConstIterator<T>& b) { + return a._node != b._node; + } +} + + +} // End of namespace Common + +#endif diff --git a/engines/kyra/resource_intern.cpp b/engines/kyra/resource_intern.cpp index 23fe2e530b..0c2cda893c 100644 --- a/engines/kyra/resource_intern.cpp +++ b/engines/kyra/resource_intern.cpp @@ -37,7 +37,7 @@ namespace Kyra { PlainArchive::PlainArchive(Common::SharedPtr<Common::ArchiveMember> file, const FileInputList &files) : _file(file), _files() { - for (FileInputList::iterator i = files.begin(); i != files.end(); ++i) { + for (FileInputList::const_iterator i = files.begin(); i != files.end(); ++i) { Entry entry; entry.offset = i->offset; @@ -85,14 +85,15 @@ Common::SeekableReadStream *PlainArchive::createReadStreamForMember(const Common CachedArchive::CachedArchive(const FileInputList &files) : _files() { - for (FileInputList::iterator i = files.begin(); i != files.end(); ++i) { + for (FileInputList::const_iterator i = files.begin(); i != files.end(); ++i) { Entry entry; entry.data = i->data; entry.size = i->size; - i->name.toLowercase(); - _files[i->name] = entry; + Common::String name = i->name; + name.toLowercase(); + _files[name] = entry; } } diff --git a/engines/m4/viewmgr.h b/engines/m4/viewmgr.h index 4c4f227c5c..38ed3635c4 100644 --- a/engines/m4/viewmgr.h +++ b/engines/m4/viewmgr.h @@ -26,6 +26,7 @@ #ifndef M4_VIEWMGR_H #define M4_VIEWMGR_H +#include "common/algorithm.h" #include "common/array.h" #include "common/list.h" #include "common/events.h" @@ -172,7 +173,7 @@ public: Common::List<View *> views() const { return _views; } bool contains(View *key) const { - return find(_views.begin(), _views.end(), key) != _views.end(); + return Common::find(_views.begin(), _views.end(), key) != _views.end(); } bool contains(int screenType) { return getView(screenType) != NULL; } View *getView(int screenType); diff --git a/engines/saga/render.cpp b/engines/saga/render.cpp index f432dbd304..370961a869 100644 --- a/engines/saga/render.cpp +++ b/engines/saga/render.cpp @@ -220,7 +220,7 @@ void Render::addDirtyRect(Common::Rect rect) { if (x2 > x1 && y2 > y1) { Common::Rect rectClipped(x1, y1, x2, y2); // Check if the new rectangle is contained within another in the list - Common::List<Common::Rect>::const_iterator it; + Common::List<Common::Rect>::iterator it; for (it = _dirtyRects.begin(); it != _dirtyRects.end(); ++it) { if (it->contains(rectClipped)) return; diff --git a/engines/scumm/debugger.cpp b/engines/scumm/debugger.cpp index d7648d07b0..297d0a0d12 100644 --- a/engines/scumm/debugger.cpp +++ b/engines/scumm/debugger.cpp @@ -507,7 +507,7 @@ bool ScummDebugger::Cmd_Debug(int argc, const char **argv) { // No parameters given: Print out a list of all channels and their status if (argc <= 1) { DebugPrintf("Available debug channels: "); - for (Common::DebugChannelList::iterator i = lvls.begin(); i != lvls.end(); ++i) { + for (Common::DebugChannelList::const_iterator i = lvls.begin(); i != lvls.end(); ++i) { DebugPrintf("%c%s - %s (%s)\n", i->enabled ? '+' : ' ', i->name.c_str(), i->description.c_str(), i->enabled ? "enabled" : "disabled"); diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index d895910988..5e160d6f1b 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -1107,7 +1107,7 @@ void ThemeEngine::renderDirtyScreen() { if (_dirtyScreen.empty()) return; - Common::List<Common::Rect>::const_iterator i, j; + Common::List<Common::Rect>::iterator i, j; for (i = _dirtyScreen.begin(); i != _dirtyScreen.end(); ++i) { for (j = i; j != _dirtyScreen.end(); ++j) if (j != i && i->contains(*j)) @@ -1411,7 +1411,7 @@ void ThemeEngine::listUsableThemes(Common::List<ThemeDescriptor> &list) { Common::List<ThemeDescriptor> output; for (Common::List<ThemeDescriptor>::const_iterator i = list.begin(); i != list.end(); ++i) { - if (find_if(output.begin(), output.end(), TDComparator(i->id)) == output.end()) + if (Common::find_if(output.begin(), output.end(), TDComparator(i->id)) == output.end()) output.push_back(*i); } |