From a17e361b99c387eebec437d2787e4a8410642be7 Mon Sep 17 00:00:00 2001 From: Michael Pozulp Date: Fri, 7 Jun 2019 20:23:03 +0000 Subject: [PATCH] [ADT] Enable set_difference() to be used on StringSet 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 | 5 ++++ include/llvm/ADT/StringSet.h | 6 +++++ unittests/ADT/CMakeLists.txt | 1 + unittests/ADT/StringMapTest.cpp | 15 ----------- unittests/ADT/StringSetTest.cpp | 44 +++++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 unittests/ADT/StringSetTest.cpp diff --git a/include/llvm/ADT/StringMap.h b/include/llvm/ADT/StringMap.h index d94e4836877..8a586fc2670 100644 --- a/include/llvm/ADT/StringMap.h +++ b/include/llvm/ADT/StringMap.h @@ -359,6 +359,11 @@ public: return find(Key) == end() ? 0 : 1; } + template + size_type count(const StringMapEntry &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. diff --git a/include/llvm/ADT/StringSet.h b/include/llvm/ADT/StringSet.h index 25ad359b035..af3a44a7b32 100644 --- a/include/llvm/ADT/StringSet.h +++ b/include/llvm/ADT/StringSet.h @@ -45,6 +45,12 @@ namespace llvm { for (auto It = Begin; It != End; ++It) base::insert(std::make_pair(*It, '\0')); } + + template + std::pair + insert(const StringMapEntry &MapEntry) { + return insert(MapEntry.getKey()); + } }; } // end namespace llvm diff --git a/unittests/ADT/CMakeLists.txt b/unittests/ADT/CMakeLists.txt index d2a35273389..676ce181871 100644 --- a/unittests/ADT/CMakeLists.txt +++ b/unittests/ADT/CMakeLists.txt @@ -65,6 +65,7 @@ add_llvm_unittest(ADTTests StringExtrasTest.cpp StringMapTest.cpp StringRefTest.cpp + StringSetTest.cpp StringSwitchTest.cpp TinyPtrVectorTest.cpp TripleTest.cpp diff --git a/unittests/ADT/StringMapTest.cpp b/unittests/ADT/StringMapTest.cpp index 841b5153935..4038d4d3d2f 100644 --- a/unittests/ADT/StringMapTest.cpp +++ b/unittests/ADT/StringMapTest.cpp @@ -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 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 index 00000000000..17bfa1dd18d --- /dev/null +++ b/unittests/ADT/StringSetTest.cpp @@ -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 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 *Element = StringMapEntry::Create("A"); + Set.insert(*Element); + size_t Count = Set.count(*Element); + size_t Expected = 1; + EXPECT_EQ(Expected, Count); + Element->Destroy(); +} + +} // end anonymous namespace -- 2.50.1