Skip to content

Commit

Permalink
[ADT] Enable set_difference() to be used on StringSet
Browse files Browse the repository at this point in the history
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

llvm-svn: 362835
  • Loading branch information
Michael Pozulp committed Jun 7, 2019
1 parent 97204a6 commit 31650ea
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 15 deletions.
5 changes: 5 additions & 0 deletions llvm/include/llvm/ADT/StringMap.h
Expand Up @@ -359,6 +359,11 @@ class StringMap : public StringMapImpl {
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.
Expand Down
6 changes: 6 additions & 0 deletions llvm/include/llvm/ADT/StringSet.h
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions llvm/unittests/ADT/CMakeLists.txt
Expand Up @@ -65,6 +65,7 @@ add_llvm_unittest(ADTTests
StringExtrasTest.cpp
StringMapTest.cpp
StringRefTest.cpp
StringSetTest.cpp
StringSwitchTest.cpp
TinyPtrVectorTest.cpp
TripleTest.cpp
Expand Down
15 changes: 0 additions & 15 deletions llvm/unittests/ADT/StringMapTest.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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) {}
Expand Down
44 changes: 44 additions & 0 deletions llvm/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<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

0 comments on commit 31650ea

Please sign in to comment.