Ticket #8849: hashmap.patch

File hashmap.patch, 4.3 KB (added by lordhoto, 17 years ago)

patch against SVN before MemoryPool addition

  • hashmap.h

     
    124124        int lookupAndCreateIfMissing(const Key &key);
    125125        void expand_array(uint newsize);
    126126
    127         class Iterator;
    128         class ConstIterator;
    129         friend class Iterator;
    130         friend class ConstIterator;
     127        template<class T> friend class IteratorImpl;
    131128
    132129        /**
    133130         * Simple HashMap iterator implementation.
    134131         */
    135         class Iterator {
     132        template<class NodeType>
     133        class IteratorImpl {
     134                friend class HashMap;
     135                template<class T> friend class IteratorImpl;
    136136        protected:
    137137                typedef const HashMap hashmap_t;
    138                 friend class HashMap;
    139138
    140                 // Allow ConstIterator to read member vars, so that Iterators can be converted to ConstIterator
    141                 friend class HashMap::ConstIterator;
    142 
    143139                uint _idx;
    144140                hashmap_t *_hashmap;
    145141
    146142        protected:
    147                 Iterator(uint idx, hashmap_t *hashmap) : _idx(idx), _hashmap(hashmap) {}
     143                IteratorImpl(uint idx, hashmap_t *hashmap) : _idx(idx), _hashmap(hashmap) {}
    148144
    149                 Node *deref() const {
     145                NodeType *deref() const {
    150146                        assert(_hashmap != 0);
    151147                        assert(_idx < _hashmap->_arrsize);
    152148                        Node *node = _hashmap->_arr[_idx];
     
    155151                }
    156152
    157153        public:
    158                 Iterator() : _idx(0), _hashmap(0) {}
     154                IteratorImpl() : _idx(0), _hashmap(0) {}
     155                template<class T>
     156                IteratorImpl(const IteratorImpl<T> &c) : _idx(c._idx), _hashmap(c._hashmap) {}
    159157
    160                 Node &operator *() const { return *deref(); }
    161                 Node *operator->() const { return deref(); }
     158                NodeType &operator *() const { return *deref(); }
     159                NodeType *operator->() const { return deref(); }
    162160
    163                 bool operator ==(const Iterator &iter) const { return _idx == iter._idx && _hashmap == iter._hashmap; }
    164                 bool operator !=(const Iterator &iter) const { return !(*this == iter); }
     161                bool operator ==(const IteratorImpl &iter) const { return _idx == iter._idx && _hashmap == iter._hashmap; }
     162                bool operator !=(const IteratorImpl &iter) const { return !(*this == iter); }
    165163
    166                 Iterator &operator ++() {
     164                IteratorImpl &operator ++() {
    167165                        assert(_hashmap);
    168166                        do {
    169167                                _idx++;
     
    174172                        return *this;
    175173                }
    176174
    177                 Iterator operator ++(int) {
    178                         Iterator old = *this;
     175                IteratorImpl operator ++(int) {
     176                        IteratorImpl old = *this;
    179177                        operator ++();
    180178                        return old;
    181179                }
    182180        };
    183181
    184         /**
    185          * Simple HashMap const iterator implementation.
    186          * This is almost completely identical to the normal iterator class, only
    187          * with some const keywords added here and there, plus a conversion
    188          * operator which makes it possible to transparently convert iterators to
    189          * const iterators.
    190          * It is sadly not really possible to reduce this code duplication using
    191          * template, unless one is willing to accept various warnings on certain
    192          * compilers. Note that many (most? all?) implementations of the standard
    193          * C++ library use a similar approach for their implementations.
    194          */
    195         class ConstIterator {
    196         protected:
    197                 typedef const HashMap hashmap_t;
    198                 friend class HashMap;
    199 
    200                 uint _idx;
    201                 hashmap_t *_hashmap;
    202 
    203         protected:
    204                 ConstIterator(uint idx, hashmap_t *hashmap) : _idx(idx), _hashmap(hashmap) {}
    205 
    206                 const Node *deref() const {
    207                         assert(_hashmap != 0);
    208                         assert(_idx < _hashmap->_arrsize);
    209                         const Node *node = _hashmap->_arr[_idx];
    210                         assert(node != 0);
    211                         return node;
    212                 }
    213 
    214         public:
    215                 ConstIterator() : _idx(0), _hashmap(0) {}
    216 
    217                 // Converting a non-const iterator to a const one is allowed
    218                 ConstIterator(const Iterator &iter) : _idx(iter._idx), _hashmap(iter._hashmap) {}
    219 
    220                 const Node &operator *() const { return *deref(); }
    221                 const Node *operator->() const { return deref(); }
    222 
    223                 bool operator ==(const ConstIterator &iter) const { return _idx == iter._idx && _hashmap == iter._hashmap; }
    224                 bool operator !=(const ConstIterator &iter) const { return !(*this == iter); }
    225 
    226                 ConstIterator &operator ++() {
    227                         assert(_hashmap);
    228                         do {
    229                                 _idx++;
    230                         } while (_idx < _hashmap->_arrsize && _hashmap->_arr[_idx] == 0);
    231                         if (_idx >= _hashmap->_arrsize)
    232                                 _idx = (uint)-1;
    233 
    234                         return *this;
    235                 }
    236 
    237                 ConstIterator operator ++(int) {
    238                         ConstIterator old = *this;
    239                         operator ++();
    240                         return old;
    241                 }
    242         };
    243 
    244182public:
    245         typedef Iterator iterator;
    246         typedef ConstIterator const_iterator;
     183        typedef IteratorImpl<Node> iterator;
     184        typedef IteratorImpl<const Node> const_iterator;
    247185
    248186        HashMap();
    249187        HashMap(const HM_t& map);