Ticket #8839: list2.patch

File list2.patch, 1.5 KB (added by SF/next_ghost, 12 years ago)

Improved ManagedList

  • common/list.h

     
    2626#define COMMON_LIST_H
    2727
    2828#include "common/scummsys.h"
     29#include "common/noncopyable.h"
    2930
    3031namespace Common {
    3132
     
    133134                insert(begin(), list.begin(), list.end());
    134135        }
    135136
    136         ~List() {
     137        virtual ~List() {
    137138                clear();
    138139                delete _anchor;
    139140        }
     
    161162                        insert(pos, *first);
    162163        }
    163164
    164         iterator erase(iterator pos) {
     165        virtual iterator erase(iterator pos) {
    165166                assert(pos != end());
    166167
    167168                NodeBase *next = pos._node->_next;
     
    173174                return iterator(next);
    174175        }
    175176
    176         iterator reverse_erase(iterator pos) {
     177        virtual iterator reverse_erase(iterator pos) {
    177178                assert(pos != end());
    178179
    179180                NodeBase *next = pos._node->_next;
     
    261262        }
    262263};
    263264
     265template<class T>
     266class ManagedList : public List<T*>, public NonCopyable {
     267        typedef List<T*> Base;
     268public:
     269        typedef typename List<T*>::iterator iterator;
     270        typedef typename List<T*>::const_iterator const_iterator;
     271        typedef typename List<T*>::value_type value_type;
     272
     273        iterator erase(iterator pos) {
     274                if (pos != Base::end())
     275                        delete *pos;
     276                return Base::erase(pos);
     277        }
     278
     279        iterator extract(iterator pos) {
     280                return Base::erase(pos);
     281        }
     282
     283        iterator reverse_erase(iterator pos) {
     284                if (pos != Base::end())
     285                        delete *pos;
     286                return Base::reverse_erase(pos);
     287        }
     288
     289        iterator reverse_extract(iterator pos) {
     290                return Base::reverse_erase(pos);
     291        }
     292};
     293
    264294} // End of namespace Common
    265295
    266296#endif