[llvm] r366060 - PDB HashTable: Make iterator key type const
Nico Weber via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 15 05:10:03 PDT 2019
Author: nico
Date: Mon Jul 15 05:10:02 2019
New Revision: 366060
URL: http://llvm.org/viewvc/llvm-project?rev=366060&view=rev
Log:
PDB HashTable: Make iterator key type const
Having the hash table key change during iteration is bad, so make it
impossible. Nothing relied on the key type not being const.
(This is also necessary to be able to call the const version of
iterator_facade_base::operator->(). Nothing calls this, and nothing
will, but I tried using it locally during development and it took me a
while to understand what was going wrong.)
Also rename the iterator typedef to const_iterator.
No behavior change.
Differential Revision: https://reviews.llvm.org/D64641
Modified:
llvm/trunk/include/llvm/DebugInfo/PDB/Native/HashTable.h
Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Native/HashTable.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Native/HashTable.h?rev=366060&r1=366059&r2=366060&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/PDB/Native/HashTable.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/HashTable.h Mon Jul 15 05:10:02 2019
@@ -37,7 +37,7 @@ template <typename ValueT>
class HashTableIterator
: public iterator_facade_base<HashTableIterator<ValueT>,
std::forward_iterator_tag,
- std::pair<uint32_t, ValueT>> {
+ const std::pair<uint32_t, ValueT>> {
friend HashTable<ValueT>;
HashTableIterator(const HashTable<ValueT> &Map, uint32_t Index,
@@ -94,8 +94,8 @@ private:
template <typename ValueT>
class HashTable {
- using iterator = HashTableIterator<ValueT>;
- friend iterator;
+ using const_iterator = HashTableIterator<ValueT>;
+ friend const_iterator;
struct Header {
support::ulittle32_t Size;
@@ -206,20 +206,20 @@ public:
uint32_t capacity() const { return Buckets.size(); }
uint32_t size() const { return Present.count(); }
- iterator begin() const { return iterator(*this); }
- iterator end() const { return iterator(*this, 0, true); }
+ const_iterator begin() const { return const_iterator(*this); }
+ const_iterator end() const { return const_iterator(*this, 0, true); }
/// Find the entry whose key has the specified hash value, using the specified
/// traits defining hash function and equality.
template <typename Key, typename TraitsT>
- iterator find_as(const Key &K, TraitsT &Traits) const {
+ const_iterator find_as(const Key &K, TraitsT &Traits) const {
uint32_t H = Traits.hashLookupKey(K) % capacity();
uint32_t I = H;
Optional<uint32_t> FirstUnused;
do {
if (isPresent(I)) {
if (Traits.storageKeyToLookupKey(Buckets[I].first) == K)
- return iterator(*this, I, false);
+ return const_iterator(*this, I, false);
} else {
if (!FirstUnused)
FirstUnused = I;
@@ -238,7 +238,7 @@ public:
// table were Present. But this would violate the load factor constraints
// that we impose, so it should never happen.
assert(FirstUnused);
- return iterator(*this, *FirstUnused, true);
+ return const_iterator(*this, *FirstUnused, true);
}
/// Set the entry using a key type that the specified Traits can convert
More information about the llvm-commits
mailing list