Skip to content

Commit

Permalink
Allow SmallPtrSet to be used with a std::insert_iterator
Browse files Browse the repository at this point in the history
Currently, the SmallPtrSet type allows inserting elements but it does
not support inserting elements with a positional hint. The lack of this
signature means that you cannot use SmallPtrSet with
std::insert_iterator or std::inserter(), which makes some code
constructs more awkward. This adds an overload of insert() that can be
used in these scenarios.

The positional hint is unused by SmallPtrSet and the call is equivalent
to calling insert() without a hint.
  • Loading branch information
AaronBallman committed Feb 5, 2021
1 parent 9fd9b5a commit ec04e28
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
7 changes: 7 additions & 0 deletions llvm/include/llvm/ADT/SmallPtrSet.h
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,13 @@ class SmallPtrSetImpl : public SmallPtrSetImplBase {
return std::make_pair(makeIterator(p.first), p.second);
}

/// Insert the given pointer with an iterator hint that is ignored. This is
/// identical to calling insert(Ptr), but allows SmallPtrSet to be used by
/// std::insert_iterator and std::inserter().
iterator insert(iterator, PtrType Ptr) {
return insert(Ptr).first;
}

/// erase - If the set contains the specified pointer, remove it and return
/// true, otherwise return false.
bool erase(PtrType Ptr) {
Expand Down
13 changes: 13 additions & 0 deletions llvm/unittests/ADT/SmallPtrSetTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -395,3 +395,16 @@ TEST(SmallPtrSetTest, Contains) {
EXPECT_TRUE(Set.contains(&buf[1]));
EXPECT_TRUE(Set.contains(&buf[2]));
}

TEST(SmallPtrSetTest, InsertIterator) {
SmallPtrSet<int *, 5> Set;
int Vals[5] = {11, 22, 33, 44, 55};
int *Buf[5] = {&Vals[0], &Vals[1], &Vals[2], &Vals[3], &Vals[4]};

for (int *Ptr : Buf)
Set.insert(Set.begin(), Ptr);

// Ensure that all of the values were copied into the set.
for (const auto *Ptr : Buf)
EXPECT_TRUE(Set.contains(Ptr));
}

0 comments on commit ec04e28

Please sign in to comment.