From 123d0b8e821375638150275c9cd83794250323ad Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Tue, 21 Mar 2017 21:23:57 +0000 Subject: [PATCH] Revert "Improve StringMap iterator support." This is causing crashes in clang, so reverting until the problem is figured out. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298440 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/STLExtras.h | 3 +- include/llvm/ADT/StringMap.h | 110 +++++++++----------------------- unittests/ADT/StringMapTest.cpp | 29 --------- 3 files changed, 32 insertions(+), 110 deletions(-) diff --git a/include/llvm/ADT/STLExtras.h b/include/llvm/ADT/STLExtras.h index 2d475e10738..038f0717674 100644 --- a/include/llvm/ADT/STLExtras.h +++ b/include/llvm/ADT/STLExtras.h @@ -893,8 +893,7 @@ auto partition(R &&Range, UnaryPredicate P) -> decltype(std::begin(Range)) { /// SmallVector with elements of the vector. This is useful, for example, /// when you want to iterate a range and then sort the results. template -SmallVector>::type, Size> -to_vector(R &&Range) { +SmallVector, Size> to_vector(R &&Range) { return {std::begin(Range), std::end(Range)}; } diff --git a/include/llvm/ADT/StringMap.h b/include/llvm/ADT/StringMap.h index cfdf9e87255..24e3ecf71b1 100644 --- a/include/llvm/ADT/StringMap.h +++ b/include/llvm/ADT/StringMap.h @@ -15,13 +15,13 @@ #define LLVM_ADT_STRINGMAP_H #include "llvm/ADT/StringRef.h" -#include "llvm/ADT/iterator.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/PointerLikeTypeTraits.h" #include #include #include #include +#include #include #include #include @@ -32,7 +32,6 @@ namespace llvm { class StringMapConstIterator; template class StringMapIterator; - template class StringMapKeyIterator; template class StringMapEntry; @@ -313,11 +312,6 @@ public: return const_iterator(TheTable+NumBuckets, true); } - llvm::iterator_range> keys() const { - return make_range(StringMapKeyIterator(begin()), - StringMapKeyIterator(end())); - } - iterator find(StringRef Key) { int Bucket = FindKey(Key); if (Bucket == -1) return end(); @@ -450,39 +444,42 @@ public: } }; -template -class StringMapIterBase - : public iterator_facade_base { +template class StringMapConstIterator { protected: StringMapEntryBase **Ptr = nullptr; public: - StringMapIterBase() = default; + typedef StringMapEntry value_type; - explicit StringMapIterBase(StringMapEntryBase **Bucket, - bool NoAdvance = false) - : Ptr(Bucket) { + StringMapConstIterator() = default; + + explicit StringMapConstIterator(StringMapEntryBase **Bucket, + bool NoAdvance = false) + : Ptr(Bucket) { if (!NoAdvance) AdvancePastEmptyBuckets(); } - DerivedTy &operator=(const DerivedTy &Other) { - Ptr = Other.Ptr; - return static_cast(*this); + const value_type &operator*() const { + return *static_cast*>(*Ptr); + } + const value_type *operator->() const { + return static_cast*>(*Ptr); } - bool operator==(const DerivedTy &RHS) const { return Ptr == RHS.Ptr; } + bool operator==(const StringMapConstIterator &RHS) const { + return Ptr == RHS.Ptr; + } + bool operator!=(const StringMapConstIterator &RHS) const { + return Ptr != RHS.Ptr; + } - DerivedTy &operator++() { // Preincrement + inline StringMapConstIterator& operator++() { // Preincrement ++Ptr; AdvancePastEmptyBuckets(); - return static_cast(*this); + return *this; } - - DerivedTy operator++(int) { // Post-increment - DerivedTy Tmp(Ptr); - ++*this; - return Tmp; + StringMapConstIterator operator++(int) { // Postincrement + StringMapConstIterator tmp = *this; ++*this; return tmp; } private: @@ -492,67 +489,22 @@ private: } }; -template -class StringMapConstIterator - : public StringMapIterBase, - const StringMapEntry> { - using base = StringMapIterBase, - const StringMapEntry>; - -public: - StringMapConstIterator() = default; - explicit StringMapConstIterator(StringMapEntryBase **Bucket, - bool NoAdvance = false) - : base(Bucket, NoAdvance) {} - - const StringMapEntry &operator*() const { - return *static_cast *>(*this->Ptr); - } -}; - -template -class StringMapIterator : public StringMapIterBase, - StringMapEntry> { - using base = - StringMapIterBase, StringMapEntry>; - +template +class StringMapIterator : public StringMapConstIterator { public: StringMapIterator() = default; + explicit StringMapIterator(StringMapEntryBase **Bucket, bool NoAdvance = false) - : base(Bucket, NoAdvance) {} - - StringMapEntry &operator*() const { - return *static_cast *>(*this->Ptr); + : StringMapConstIterator(Bucket, NoAdvance) { } - operator StringMapConstIterator() const { - return StringMapConstIterator(this->Ptr, false); + StringMapEntry &operator*() const { + return *static_cast*>(*this->Ptr); } -}; - -template -class StringMapKeyIterator - : public iterator_adaptor_base, - StringMapConstIterator, - std::forward_iterator_tag, StringRef> { - using base = iterator_adaptor_base, - StringMapConstIterator, - std::forward_iterator_tag, StringRef>; - -public: - StringMapKeyIterator() = default; - - explicit StringMapKeyIterator(StringMapConstIterator Iter) - : base(std::move(Iter)) {} - - StringRef &operator*() { - Key = this->wrapped()->getKey(); - return Key; + StringMapEntry *operator->() const { + return static_cast*>(*this->Ptr); } - -private: - StringRef Key; }; } // end namespace llvm diff --git a/unittests/ADT/StringMapTest.cpp b/unittests/ADT/StringMapTest.cpp index d2b1c31805e..911c72d7496 100644 --- a/unittests/ADT/StringMapTest.cpp +++ b/unittests/ADT/StringMapTest.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/StringMap.h" -#include "llvm/ADT/StringSet.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/DataTypes.h" #include "gtest/gtest.h" @@ -270,34 +269,6 @@ TEST_F(StringMapTest, InsertRehashingPairTest) { EXPECT_EQ(42u, It->second); } -TEST_F(StringMapTest, IterMapKeys) { - StringMap Map; - Map["A"] = 1; - Map["B"] = 2; - Map["C"] = 3; - Map["D"] = 3; - - auto Keys = to_vector<4>(Map.keys()); - std::sort(Keys.begin(), Keys.end()); - - SmallVector Expected = {"A", "B", "C", "D"}; - EXPECT_EQ(Expected, Keys); -} - -TEST_F(StringMapTest, IterSetKeys) { - StringSet<> Set; - Set.insert("A"); - Set.insert("B"); - Set.insert("C"); - Set.insert("D"); - - auto Keys = to_vector<4>(Set.keys()); - std::sort(Keys.begin(), Keys.end()); - - SmallVector Expected = {"A", "B", "C", "D"}; - EXPECT_EQ(Expected, Keys); -} - // Create a non-default constructable value struct StringMapTestStruct { StringMapTestStruct(int i) : i(i) {} -- 2.40.0