aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorMarcelina Koƛcielnicka <mwk@0x04.net>2020-04-16 21:48:03 +0200
committerMarcelina Koƛcielnicka <mwk@0x04.net>2020-04-21 19:09:00 +0200
commit79efaa65ad73520e4354bdc33622216bf29892fc (patch)
treeece651cb3c08e328663eeaed85fb25a100c84018 /kernel
parenta6f9e28680c2700f903ffdaa837525b71708aa16 (diff)
downloadyosys-79efaa65ad73520e4354bdc33622216bf29892fc.tar.gz
yosys-79efaa65ad73520e4354bdc33622216bf29892fc.tar.bz2
yosys-79efaa65ad73520e4354bdc33622216bf29892fc.zip
idict: Make iterator go forward.
Previously, iterating over an idict returned its contents in reverse.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/hashlib.h24
1 files changed, 19 insertions, 5 deletions
diff --git a/kernel/hashlib.h b/kernel/hashlib.h
index 996bda38e..97fadea0e 100644
--- a/kernel/hashlib.h
+++ b/kernel/hashlib.h
@@ -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>