idict: Make iterator go forward.
authorMarcelina Kościelnicka <mwk@0x04.net>
Thu, 16 Apr 2020 19:48:03 +0000 (21:48 +0200)
committerMarcelina Kościelnicka <mwk@0x04.net>
Tue, 21 Apr 2020 17:09:00 +0000 (19:09 +0200)
Previously, iterating over an idict returned its contents in reverse.

kernel/hashlib.h

index 996bda38e560aeb496c826fb7410c345bf3e7972..97fadea0edb0ba099daa1f1b09673d73e078fb09 100644 (file)
@@ -569,7 +569,7 @@ public:
                return entries[i].udata.second;
        }
 
-       T at(const K &key, const T &defval) const
+       const T& at(const K &key, const T &defval) const
        {
                int hash = do_hash(key);
                int i = do_lookup(key, hash);
@@ -961,7 +961,21 @@ class idict
        pool<K, OPS> database;
 
 public:
-       typedef typename pool<K, OPS>::const_iterator const_iterator;
+       class const_iterator : public std::iterator<std::forward_iterator_tag, K>
+       {
+               friend class idict;
+       protected:
+               const idict &container;
+               int index;
+               const_iterator(const idict &container, int index) : container(container), index(index) { }
+       public:
+               const_iterator() { }
+               const_iterator operator++() { index++; return *this; }
+               bool operator==(const const_iterator &other) const { return index == other.index; }
+               bool operator!=(const const_iterator &other) const { return index != other.index; }
+               const K &operator*() const { return container[index]; }
+               const K *operator->() const { return &container[index]; }
+       };
 
        int operator()(const K &key)
        {
@@ -1019,9 +1033,9 @@ public:
        bool empty() const { return database.empty(); }
        void clear() { database.clear(); }
 
-       const_iterator begin() const { return database.begin(); }
-       const_iterator element(int n) const { return database.element(n); }
-       const_iterator end() const { return database.end(); }
+       const_iterator begin() const { return const_iterator(*this, offset); }
+       const_iterator element(int n) const { return const_iterator(*this, n); }
+       const_iterator end() const { return const_iterator(*this, offset + size()); }
 };
 
 template<typename K, typename OPS>