187a98b57SDale Johannesen //===- llvm/unittest/ADT/FoldingSetTest.cpp -------------------------------===//
287a98b57SDale Johannesen //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
687a98b57SDale Johannesen //
787a98b57SDale Johannesen //===----------------------------------------------------------------------===//
887a98b57SDale Johannesen //
987a98b57SDale Johannesen // FoldingSet unit tests.
1087a98b57SDale Johannesen //
1187a98b57SDale Johannesen //===----------------------------------------------------------------------===//
1287a98b57SDale Johannesen
1387a98b57SDale Johannesen #include "llvm/ADT/FoldingSet.h"
149a67b073SChandler Carruth #include "gtest/gtest.h"
1587a98b57SDale Johannesen #include <string>
1687a98b57SDale Johannesen
1787a98b57SDale Johannesen using namespace llvm;
1887a98b57SDale Johannesen
1987a98b57SDale Johannesen namespace {
2087a98b57SDale Johannesen
2187a98b57SDale Johannesen // Unaligned string test.
TEST(FoldingSetTest,UnalignedStringTest)2287a98b57SDale Johannesen TEST(FoldingSetTest, UnalignedStringTest) {
2387a98b57SDale Johannesen SCOPED_TRACE("UnalignedStringTest");
2487a98b57SDale Johannesen
2587a98b57SDale Johannesen FoldingSetNodeID a, b;
26dfe3d56dSBen Craig // An aligned string.
2787a98b57SDale Johannesen std::string str1= "a test string";
2887a98b57SDale Johannesen a.AddString(str1);
2987a98b57SDale Johannesen
30dfe3d56dSBen Craig // An unaligned string.
3187a98b57SDale Johannesen std::string str2 = ">" + str1;
3287a98b57SDale Johannesen b.AddString(str2.c_str() + 1);
3387a98b57SDale Johannesen
3487a98b57SDale Johannesen EXPECT_EQ(a.ComputeHash(), b.ComputeHash());
3587a98b57SDale Johannesen }
3687a98b57SDale Johannesen
TEST(FoldingSetTest,LongLongComparison)37e3a9a676SRichard Smith TEST(FoldingSetTest, LongLongComparison) {
38e3a9a676SRichard Smith struct LongLongContainer : FoldingSetNode {
39e3a9a676SRichard Smith unsigned long long A, B;
40e3a9a676SRichard Smith LongLongContainer(unsigned long long A, unsigned long long B)
41e3a9a676SRichard Smith : A(A), B(B) {}
42e3a9a676SRichard Smith void Profile(FoldingSetNodeID &ID) const {
43e3a9a676SRichard Smith ID.AddInteger(A);
44e3a9a676SRichard Smith ID.AddInteger(B);
45e3a9a676SRichard Smith }
46e3a9a676SRichard Smith };
47e3a9a676SRichard Smith
48e3a9a676SRichard Smith LongLongContainer C1((1ULL << 32) + 1, 1ULL);
49e3a9a676SRichard Smith LongLongContainer C2(1ULL, (1ULL << 32) + 1);
50e3a9a676SRichard Smith
51e3a9a676SRichard Smith FoldingSet<LongLongContainer> Set;
52e3a9a676SRichard Smith
53e3a9a676SRichard Smith EXPECT_EQ(&C1, Set.GetOrInsertNode(&C1));
54e3a9a676SRichard Smith EXPECT_EQ(&C2, Set.GetOrInsertNode(&C2));
55e3a9a676SRichard Smith EXPECT_EQ(2U, Set.size());
56e3a9a676SRichard Smith }
57e3a9a676SRichard Smith
5860adb922SBen Craig struct TrivialPair : public FoldingSetNode {
5960adb922SBen Craig unsigned Key = 0;
6060adb922SBen Craig unsigned Value = 0;
TrivialPair__anon7b4463960111::TrivialPair6160adb922SBen Craig TrivialPair(unsigned K, unsigned V) : FoldingSetNode(), Key(K), Value(V) {}
6260adb922SBen Craig
Profile__anon7b4463960111::TrivialPair6360adb922SBen Craig void Profile(FoldingSetNodeID &ID) const {
6460adb922SBen Craig ID.AddInteger(Key);
6560adb922SBen Craig ID.AddInteger(Value);
6660adb922SBen Craig }
6760adb922SBen Craig };
6860adb922SBen Craig
TEST(FoldingSetTest,IDComparison)6960adb922SBen Craig TEST(FoldingSetTest, IDComparison) {
7060adb922SBen Craig FoldingSet<TrivialPair> Trivial;
7160adb922SBen Craig
7260adb922SBen Craig TrivialPair T(99, 42);
7360adb922SBen Craig Trivial.InsertNode(&T);
7460adb922SBen Craig
7560adb922SBen Craig void *InsertPos = nullptr;
7660adb922SBen Craig FoldingSetNodeID ID;
7760adb922SBen Craig T.Profile(ID);
7860adb922SBen Craig TrivialPair *N = Trivial.FindNodeOrInsertPos(ID, InsertPos);
7960adb922SBen Craig EXPECT_EQ(&T, N);
8060adb922SBen Craig EXPECT_EQ(nullptr, InsertPos);
8160adb922SBen Craig }
8260adb922SBen Craig
TEST(FoldingSetTest,MissedIDComparison)8360adb922SBen Craig TEST(FoldingSetTest, MissedIDComparison) {
8460adb922SBen Craig FoldingSet<TrivialPair> Trivial;
8560adb922SBen Craig
8660adb922SBen Craig TrivialPair S(100, 42);
8760adb922SBen Craig TrivialPair T(99, 42);
8860adb922SBen Craig Trivial.InsertNode(&T);
8960adb922SBen Craig
9060adb922SBen Craig void *InsertPos = nullptr;
9160adb922SBen Craig FoldingSetNodeID ID;
9260adb922SBen Craig S.Profile(ID);
9360adb922SBen Craig TrivialPair *N = Trivial.FindNodeOrInsertPos(ID, InsertPos);
9460adb922SBen Craig EXPECT_EQ(nullptr, N);
9560adb922SBen Craig EXPECT_NE(nullptr, InsertPos);
9660adb922SBen Craig }
9760adb922SBen Craig
TEST(FoldingSetTest,RemoveNodeThatIsPresent)9860adb922SBen Craig TEST(FoldingSetTest, RemoveNodeThatIsPresent) {
9960adb922SBen Craig FoldingSet<TrivialPair> Trivial;
10060adb922SBen Craig
10160adb922SBen Craig TrivialPair T(99, 42);
10260adb922SBen Craig Trivial.InsertNode(&T);
10360adb922SBen Craig EXPECT_EQ(Trivial.size(), 1U);
10460adb922SBen Craig
10560adb922SBen Craig bool WasThere = Trivial.RemoveNode(&T);
10660adb922SBen Craig EXPECT_TRUE(WasThere);
10760adb922SBen Craig EXPECT_EQ(0U, Trivial.size());
10860adb922SBen Craig }
10960adb922SBen Craig
TEST(FoldingSetTest,RemoveNodeThatIsAbsent)11060adb922SBen Craig TEST(FoldingSetTest, RemoveNodeThatIsAbsent) {
11160adb922SBen Craig FoldingSet<TrivialPair> Trivial;
11260adb922SBen Craig
11360adb922SBen Craig TrivialPair T(99, 42);
11460adb922SBen Craig bool WasThere = Trivial.RemoveNode(&T);
11560adb922SBen Craig EXPECT_FALSE(WasThere);
11660adb922SBen Craig EXPECT_EQ(0U, Trivial.size());
11760adb922SBen Craig }
11860adb922SBen Craig
TEST(FoldingSetTest,GetOrInsertInserting)11960adb922SBen Craig TEST(FoldingSetTest, GetOrInsertInserting) {
12060adb922SBen Craig FoldingSet<TrivialPair> Trivial;
12160adb922SBen Craig
12260adb922SBen Craig TrivialPair T(99, 42);
12360adb922SBen Craig TrivialPair *N = Trivial.GetOrInsertNode(&T);
12460adb922SBen Craig EXPECT_EQ(&T, N);
12560adb922SBen Craig }
12660adb922SBen Craig
TEST(FoldingSetTest,GetOrInsertGetting)12760adb922SBen Craig TEST(FoldingSetTest, GetOrInsertGetting) {
12860adb922SBen Craig FoldingSet<TrivialPair> Trivial;
12960adb922SBen Craig
13060adb922SBen Craig TrivialPair T(99, 42);
13160adb922SBen Craig TrivialPair T2(99, 42);
13260adb922SBen Craig Trivial.InsertNode(&T);
13360adb922SBen Craig TrivialPair *N = Trivial.GetOrInsertNode(&T2);
13460adb922SBen Craig EXPECT_EQ(&T, N);
13560adb922SBen Craig }
13660adb922SBen Craig
TEST(FoldingSetTest,InsertAtPos)13760adb922SBen Craig TEST(FoldingSetTest, InsertAtPos) {
13860adb922SBen Craig FoldingSet<TrivialPair> Trivial;
13960adb922SBen Craig
14060adb922SBen Craig void *InsertPos = nullptr;
14160adb922SBen Craig TrivialPair Finder(99, 42);
14260adb922SBen Craig FoldingSetNodeID ID;
14360adb922SBen Craig Finder.Profile(ID);
14460adb922SBen Craig Trivial.FindNodeOrInsertPos(ID, InsertPos);
14560adb922SBen Craig
14660adb922SBen Craig TrivialPair T(99, 42);
14760adb922SBen Craig Trivial.InsertNode(&T, InsertPos);
14860adb922SBen Craig EXPECT_EQ(1U, Trivial.size());
14960adb922SBen Craig }
15060adb922SBen Craig
TEST(FoldingSetTest,EmptyIsTrue)15160adb922SBen Craig TEST(FoldingSetTest, EmptyIsTrue) {
15260adb922SBen Craig FoldingSet<TrivialPair> Trivial;
15360adb922SBen Craig EXPECT_TRUE(Trivial.empty());
15460adb922SBen Craig }
15560adb922SBen Craig
TEST(FoldingSetTest,EmptyIsFalse)15660adb922SBen Craig TEST(FoldingSetTest, EmptyIsFalse) {
15760adb922SBen Craig FoldingSet<TrivialPair> Trivial;
15860adb922SBen Craig TrivialPair T(99, 42);
15960adb922SBen Craig Trivial.InsertNode(&T);
16060adb922SBen Craig EXPECT_FALSE(Trivial.empty());
16160adb922SBen Craig }
16260adb922SBen Craig
TEST(FoldingSetTest,ClearOnEmpty)16360adb922SBen Craig TEST(FoldingSetTest, ClearOnEmpty) {
16460adb922SBen Craig FoldingSet<TrivialPair> Trivial;
16560adb922SBen Craig Trivial.clear();
16660adb922SBen Craig EXPECT_TRUE(Trivial.empty());
16760adb922SBen Craig }
16860adb922SBen Craig
TEST(FoldingSetTest,ClearOnNonEmpty)16960adb922SBen Craig TEST(FoldingSetTest, ClearOnNonEmpty) {
17060adb922SBen Craig FoldingSet<TrivialPair> Trivial;
17160adb922SBen Craig TrivialPair T(99, 42);
17260adb922SBen Craig Trivial.InsertNode(&T);
17360adb922SBen Craig Trivial.clear();
17460adb922SBen Craig EXPECT_TRUE(Trivial.empty());
17560adb922SBen Craig }
17660adb922SBen Craig
TEST(FoldingSetTest,CapacityLargerThanReserve)17760adb922SBen Craig TEST(FoldingSetTest, CapacityLargerThanReserve) {
17860adb922SBen Craig FoldingSet<TrivialPair> Trivial;
17960adb922SBen Craig auto OldCapacity = Trivial.capacity();
18060adb922SBen Craig Trivial.reserve(OldCapacity + 1);
18160adb922SBen Craig EXPECT_GE(Trivial.capacity(), OldCapacity + 1);
18260adb922SBen Craig }
18360adb922SBen Craig
TEST(FoldingSetTest,SmallReserveChangesNothing)18460adb922SBen Craig TEST(FoldingSetTest, SmallReserveChangesNothing) {
18560adb922SBen Craig FoldingSet<TrivialPair> Trivial;
18660adb922SBen Craig auto OldCapacity = Trivial.capacity();
18760adb922SBen Craig Trivial.reserve(OldCapacity - 1);
18860adb922SBen Craig EXPECT_EQ(Trivial.capacity(), OldCapacity);
18960adb922SBen Craig }
19060adb922SBen Craig
19187a98b57SDale Johannesen }
19287a98b57SDale Johannesen
193