diff options
author | Marcelina KoĆcielnicka <mwk@0x04.net> | 2020-04-16 21:48:03 +0200 |
---|---|---|
committer | Marcelina KoĆcielnicka <mwk@0x04.net> | 2020-04-21 19:09:00 +0200 |
commit | 79efaa65ad73520e4354bdc33622216bf29892fc (patch) | |
tree | ece651cb3c08e328663eeaed85fb25a100c84018 /kernel | |
parent | a6f9e28680c2700f903ffdaa837525b71708aa16 (diff) | |
download | yosys-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.h | 24 |
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> |