diff options
Diffstat (limited to 'engines/saga/list.h')
-rw-r--r-- | engines/saga/list.h | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/engines/saga/list.h b/engines/saga/list.h new file mode 100644 index 0000000000..d002f405de --- /dev/null +++ b/engines/saga/list.h @@ -0,0 +1,156 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2004-2006 The ScummVM project + * + * 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 SAGA_LIST_H__ +#define SAGA_LIST_H__ + +#include "common/list.h" + +namespace Saga { + +template <class T> +class SortedList : public Common::List<T> { +public: + typedef int (*CompareFunction) (const T& a, const T& b); + + typedef typename Common::List<T>::iterator iterator; + typedef typename Common::List<T>::const_iterator const_iterator; + typedef typename Common::List<T> Common_List; + +public: + + iterator pushFront(const T& element) { + return insert(Common::List<T>::begin(), element); + } + + iterator pushBack(const T& element) { + return insert(Common_List::end(), element); + } + + iterator insert(iterator pos, const T& element) { + Common_List::insert(pos, element); + return --pos; + } + + iterator pushFront() { + return insert(Common_List::begin()); + } + + iterator pushBack() { + return insert(Common_List::end()); + } + + iterator insert(iterator pos) { + T init; + return insert(pos, init); + } + + iterator pushFront(const T& element, CompareFunction compareFunction) { + return insert(Common::List<T>::begin(), element, compareFunction); + } + + iterator pushBack(const T& element, CompareFunction compareFunction) { + return insert(Common_List::end(), element, compareFunction); + } + + iterator insert(iterator pos, const T& element, CompareFunction compareFunction) { + int res; + + for (iterator i = Common_List::begin(); i != Common_List::end(); ++i) { + res = compareFunction(element, i.operator*()); + if (res < 0) { + return insert(i, element); + } + } + return pushBack(element); + } + + iterator reorderUp(iterator pos, CompareFunction compareFunction) { + iterator i(pos); + int res; + + --i; + while (i != Common::List<T>::end()) { + res = compareFunction(i.operator*(), pos.operator*()); + if (res <= 0) { + + T temp(*pos); + erase(pos); + ++i; + return insert(i, temp); + } + --i; + } + return pos; + } + + iterator reorderDown(iterator pos, CompareFunction compareFunction) { + iterator i(pos); + int res; + + ++i; + while (i != Common::List<T>::end()) { + res = compareFunction(i.operator*(), pos.operator*()); + if (res >= 0) { + + T temp(*pos); + erase(pos); + return insert(i, temp); + } + ++i; + } + return pos; + } + + iterator eraseAndPrev(iterator pos) { + assert(pos != Common_List::end()); + iterator res(pos); + + --res; + erase(pos); + return res; + } + + void remove(const T* val) { + for (iterator i = Common_List::begin(); i != Common_List::end(); ++i) + if (val == i.operator->()) { + erase(i); + return; + } + } + + bool locate(const T* val, iterator& foundedIterator) { + + for (iterator i = Common::List<T>::begin(); i != Common::List<T>::end(); ++i) + if (val == i.operator->()) + { + foundedIterator = i; + return true; + } + + return false; + } +}; + +} // End of namespace Saga + +#endif |