|  | //===- llvm/unittest/ADT/SetVector.cpp ------------------------------===// | 
|  | // | 
|  | // 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 | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // SetVector unit tests. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm/ADT/SetVector.h" | 
|  | #include "llvm/ADT/SmallPtrSet.h" | 
|  | #include "gmock/gmock.h" | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | TEST(SetVector, EraseTest) { | 
|  | SetVector<int> S; | 
|  | S.insert(0); | 
|  | S.insert(1); | 
|  | S.insert(2); | 
|  |  | 
|  | auto I = S.erase(std::next(S.begin())); | 
|  |  | 
|  | // Test that the returned iterator is the expected one-after-erase | 
|  | // and the size/contents is the expected sequence {0, 2}. | 
|  | EXPECT_EQ(std::next(S.begin()), I); | 
|  | EXPECT_EQ(2u, S.size()); | 
|  | EXPECT_EQ(0, *S.begin()); | 
|  | EXPECT_EQ(2, *std::next(S.begin())); | 
|  | } | 
|  |  | 
|  | TEST(SetVector, ContainsTest) { | 
|  | SetVector<int> S; | 
|  | S.insert(0); | 
|  | S.insert(1); | 
|  | S.insert(2); | 
|  |  | 
|  | EXPECT_TRUE(S.contains(0)); | 
|  | EXPECT_TRUE(S.contains(1)); | 
|  | EXPECT_TRUE(S.contains(2)); | 
|  | EXPECT_FALSE(S.contains(-1)); | 
|  |  | 
|  | S.insert(2); | 
|  | EXPECT_TRUE(S.contains(2)); | 
|  |  | 
|  | S.remove(2); | 
|  | EXPECT_FALSE(S.contains(2)); | 
|  | } | 
|  |  | 
|  | TEST(SetVector, ConstPtrKeyTest) { | 
|  | SetVector<int *, SmallVector<int *, 8>, SmallPtrSet<const int *, 8>> S, T; | 
|  | int i, j, k, m, n; | 
|  |  | 
|  | S.insert(&i); | 
|  | S.insert(&j); | 
|  | S.insert(&k); | 
|  |  | 
|  | EXPECT_TRUE(S.contains(&i)); | 
|  | EXPECT_TRUE(S.contains(&j)); | 
|  | EXPECT_TRUE(S.contains(&k)); | 
|  |  | 
|  | EXPECT_TRUE(S.contains((const int *)&i)); | 
|  | EXPECT_TRUE(S.contains((const int *)&j)); | 
|  | EXPECT_TRUE(S.contains((const int *)&k)); | 
|  |  | 
|  | EXPECT_TRUE(S.contains(S[0])); | 
|  | EXPECT_TRUE(S.contains(S[1])); | 
|  | EXPECT_TRUE(S.contains(S[2])); | 
|  |  | 
|  | S.remove(&k); | 
|  | EXPECT_FALSE(S.contains(&k)); | 
|  | EXPECT_FALSE(S.contains((const int *)&k)); | 
|  |  | 
|  | T.insert(&j); | 
|  | T.insert(&m); | 
|  | T.insert(&n); | 
|  |  | 
|  | EXPECT_TRUE(S.set_union(T)); | 
|  | EXPECT_TRUE(S.contains(&m)); | 
|  | EXPECT_TRUE(S.contains((const int *)&m)); | 
|  |  | 
|  | S.set_subtract(T); | 
|  | EXPECT_FALSE(S.contains(&j)); | 
|  | EXPECT_FALSE(S.contains((const int *)&j)); | 
|  | } | 
|  |  | 
|  | TEST(SetVector, CtorRange) { | 
|  | constexpr unsigned Args[] = {3, 1, 2}; | 
|  | SetVector<unsigned> Set(llvm::from_range, Args); | 
|  | EXPECT_THAT(Set, ::testing::ElementsAre(3, 1, 2)); | 
|  | } | 
|  |  | 
|  | TEST(SetVector, InsertRange) { | 
|  | SetVector<unsigned> Set; | 
|  | constexpr unsigned Args[] = {3, 1, 2}; | 
|  | Set.insert_range(Args); | 
|  | EXPECT_THAT(Set, ::testing::ElementsAre(3, 1, 2)); | 
|  | } | 
|  |  | 
|  | TEST(SmallSetVector, CtorRange) { | 
|  | constexpr unsigned Args[] = {3, 1, 2}; | 
|  | SmallSetVector<unsigned, 4> Set(llvm::from_range, Args); | 
|  | EXPECT_THAT(Set, ::testing::ElementsAre(3, 1, 2)); | 
|  | } |