]> granicus.if.org Git - llvm/commitdiff
[ADT] Enable set_difference() to be used on StringSet
authorMichael Pozulp <pozulp.llvm@gmail.com>
Fri, 7 Jun 2019 20:23:03 +0000 (20:23 +0000)
committerMichael Pozulp <pozulp.llvm@gmail.com>
Fri, 7 Jun 2019 20:23:03 +0000 (20:23 +0000)
Summary: Re-land r362766 after it was reverted in r362823.

Reviewers: jhenderson, dsanders, aaron.ballman, MatzeB, lhames, dblaikie

Reviewed By: dblaikie

Subscribers: smeenai, mgrang, mgorny, dexonsmith, kristina, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D62369

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362835 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/StringMap.h
include/llvm/ADT/StringSet.h
unittests/ADT/CMakeLists.txt
unittests/ADT/StringMapTest.cpp
unittests/ADT/StringSetTest.cpp [new file with mode: 0644]

index d94e4836877da66938c86ad8cb222a32adda1d8c..8a586fc267096bad065ecd28cfd01689fe178ef7 100644 (file)
@@ -359,6 +359,11 @@ public:
     return find(Key) == end() ? 0 : 1;
   }
 
+  template <typename InputTy>
+  size_type count(const StringMapEntry<InputTy> &MapEntry) const {
+    return count(MapEntry.getKey());
+  }
+
   /// insert - Insert the specified key/value pair into the map.  If the key
   /// already exists in the map, return false and ignore the request, otherwise
   /// insert it and return true.
index 25ad359b0355a50602a98e6a95aeab5749b0fb4d..af3a44a7b32c40a6ddf6b56f81013360a085bd3b 100644 (file)
@@ -45,6 +45,12 @@ namespace llvm {
       for (auto It = Begin; It != End; ++It)
         base::insert(std::make_pair(*It, '\0'));
     }
+
+    template <typename ValueTy>
+    std::pair<typename base::iterator, bool>
+    insert(const StringMapEntry<ValueTy> &MapEntry) {
+      return insert(MapEntry.getKey());
+    }
   };
 
 } // end namespace llvm
index d2a35273389fa18805635b34cb42063c00ebaf93..676ce181871da4ac87f68ef7f2b493b8ee198c86 100644 (file)
@@ -65,6 +65,7 @@ add_llvm_unittest(ADTTests
   StringExtrasTest.cpp
   StringMapTest.cpp
   StringRefTest.cpp
+  StringSetTest.cpp
   StringSwitchTest.cpp
   TinyPtrVectorTest.cpp
   TripleTest.cpp
index 841b515393543b3d607aa1fc5a72430a3c705bfc..4038d4d3d2f7cf6625a41535fe9fd1dbea2f3e31 100644 (file)
@@ -7,7 +7,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"
@@ -284,20 +283,6 @@ TEST_F(StringMapTest, IterMapKeys) {
   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());
-  llvm::sort(Keys);
-
-  SmallVector<StringRef, 4> Expected = {"A", "B", "C", "D"};
-  EXPECT_EQ(Expected, Keys);
-}
-
 // Create a non-default constructable value
 struct StringMapTestStruct {
   StringMapTestStruct(int i) : i(i) {}
diff --git a/unittests/ADT/StringSetTest.cpp b/unittests/ADT/StringSetTest.cpp
new file mode 100644 (file)
index 0000000..17bfa1d
--- /dev/null
@@ -0,0 +1,44 @@
+//===- llvm/unittest/ADT/StringSetTest.cpp - StringSet unit tests ----------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ADT/StringSet.h"
+#include "gtest/gtest.h"
+using namespace llvm;
+
+namespace {
+
+// Test fixture
+class StringSetTest : public testing::Test {};
+
+TEST_F(StringSetTest, IterSetKeys) {
+  StringSet<> Set;
+  Set.insert("A");
+  Set.insert("B");
+  Set.insert("C");
+  Set.insert("D");
+
+  auto Keys = to_vector<4>(Set.keys());
+  llvm::sort(Keys);
+
+  SmallVector<StringRef, 4> Expected = {"A", "B", "C", "D"};
+  EXPECT_EQ(Expected, Keys);
+}
+
+TEST_F(StringSetTest, InsertAndCountStringMapEntry) {
+  // Test insert(StringMapEntry) and count(StringMapEntry)
+  // which are required for set_difference(StringSet, StringSet).
+  StringSet<> Set;
+  StringMapEntry<StringRef> *Element = StringMapEntry<StringRef>::Create("A");
+  Set.insert(*Element);
+  size_t Count = Set.count(*Element);
+  size_t Expected = 1;
+  EXPECT_EQ(Expected, Count);
+  Element->Destroy();
+}
+
+} // end anonymous namespace