xref: /aosp_15_r20/external/llvm/unittests/ADT/FoldingSet.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/ADT/FoldingSetTest.cpp -------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // FoldingSet unit tests.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/FoldingSet.h"
16*9880d681SAndroid Build Coastguard Worker #include <string>
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker using namespace llvm;
19*9880d681SAndroid Build Coastguard Worker 
20*9880d681SAndroid Build Coastguard Worker namespace {
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker // Unaligned string test.
TEST(FoldingSetTest,UnalignedStringTest)23*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, UnalignedStringTest) {
24*9880d681SAndroid Build Coastguard Worker   SCOPED_TRACE("UnalignedStringTest");
25*9880d681SAndroid Build Coastguard Worker 
26*9880d681SAndroid Build Coastguard Worker   FoldingSetNodeID a, b;
27*9880d681SAndroid Build Coastguard Worker   // An aligned string.
28*9880d681SAndroid Build Coastguard Worker   std::string str1= "a test string";
29*9880d681SAndroid Build Coastguard Worker   a.AddString(str1);
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker   // An unaligned string.
32*9880d681SAndroid Build Coastguard Worker   std::string str2 = ">" + str1;
33*9880d681SAndroid Build Coastguard Worker   b.AddString(str2.c_str() + 1);
34*9880d681SAndroid Build Coastguard Worker 
35*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(a.ComputeHash(), b.ComputeHash());
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker struct TrivialPair : public FoldingSetNode {
39*9880d681SAndroid Build Coastguard Worker   unsigned Key = 0;
40*9880d681SAndroid Build Coastguard Worker   unsigned Value = 0;
TrivialPair__anon4d6c627b0111::TrivialPair41*9880d681SAndroid Build Coastguard Worker   TrivialPair(unsigned K, unsigned V) : FoldingSetNode(), Key(K), Value(V) {}
42*9880d681SAndroid Build Coastguard Worker 
Profile__anon4d6c627b0111::TrivialPair43*9880d681SAndroid Build Coastguard Worker   void Profile(FoldingSetNodeID &ID) const {
44*9880d681SAndroid Build Coastguard Worker     ID.AddInteger(Key);
45*9880d681SAndroid Build Coastguard Worker     ID.AddInteger(Value);
46*9880d681SAndroid Build Coastguard Worker   }
47*9880d681SAndroid Build Coastguard Worker };
48*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,IDComparison)49*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, IDComparison) {
50*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
51*9880d681SAndroid Build Coastguard Worker 
52*9880d681SAndroid Build Coastguard Worker   TrivialPair T(99, 42);
53*9880d681SAndroid Build Coastguard Worker   Trivial.InsertNode(&T);
54*9880d681SAndroid Build Coastguard Worker 
55*9880d681SAndroid Build Coastguard Worker   void *InsertPos = nullptr;
56*9880d681SAndroid Build Coastguard Worker   FoldingSetNodeID ID;
57*9880d681SAndroid Build Coastguard Worker   T.Profile(ID);
58*9880d681SAndroid Build Coastguard Worker   TrivialPair *N = Trivial.FindNodeOrInsertPos(ID, InsertPos);
59*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(&T, N);
60*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, InsertPos);
61*9880d681SAndroid Build Coastguard Worker }
62*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,MissedIDComparison)63*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, MissedIDComparison) {
64*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker   TrivialPair S(100, 42);
67*9880d681SAndroid Build Coastguard Worker   TrivialPair T(99, 42);
68*9880d681SAndroid Build Coastguard Worker   Trivial.InsertNode(&T);
69*9880d681SAndroid Build Coastguard Worker 
70*9880d681SAndroid Build Coastguard Worker   void *InsertPos = nullptr;
71*9880d681SAndroid Build Coastguard Worker   FoldingSetNodeID ID;
72*9880d681SAndroid Build Coastguard Worker   S.Profile(ID);
73*9880d681SAndroid Build Coastguard Worker   TrivialPair *N = Trivial.FindNodeOrInsertPos(ID, InsertPos);
74*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N);
75*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, InsertPos);
76*9880d681SAndroid Build Coastguard Worker }
77*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,RemoveNodeThatIsPresent)78*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, RemoveNodeThatIsPresent) {
79*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
80*9880d681SAndroid Build Coastguard Worker 
81*9880d681SAndroid Build Coastguard Worker   TrivialPair T(99, 42);
82*9880d681SAndroid Build Coastguard Worker   Trivial.InsertNode(&T);
83*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Trivial.size(), 1U);
84*9880d681SAndroid Build Coastguard Worker 
85*9880d681SAndroid Build Coastguard Worker   bool WasThere = Trivial.RemoveNode(&T);
86*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(WasThere);
87*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0U, Trivial.size());
88*9880d681SAndroid Build Coastguard Worker }
89*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,RemoveNodeThatIsAbsent)90*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, RemoveNodeThatIsAbsent) {
91*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
92*9880d681SAndroid Build Coastguard Worker 
93*9880d681SAndroid Build Coastguard Worker   TrivialPair T(99, 42);
94*9880d681SAndroid Build Coastguard Worker   bool WasThere = Trivial.RemoveNode(&T);
95*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(WasThere);
96*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0U, Trivial.size());
97*9880d681SAndroid Build Coastguard Worker }
98*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,GetOrInsertInserting)99*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, GetOrInsertInserting) {
100*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
101*9880d681SAndroid Build Coastguard Worker 
102*9880d681SAndroid Build Coastguard Worker   TrivialPair T(99, 42);
103*9880d681SAndroid Build Coastguard Worker   TrivialPair *N = Trivial.GetOrInsertNode(&T);
104*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(&T, N);
105*9880d681SAndroid Build Coastguard Worker }
106*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,GetOrInsertGetting)107*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, GetOrInsertGetting) {
108*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
109*9880d681SAndroid Build Coastguard Worker 
110*9880d681SAndroid Build Coastguard Worker   TrivialPair T(99, 42);
111*9880d681SAndroid Build Coastguard Worker   TrivialPair T2(99, 42);
112*9880d681SAndroid Build Coastguard Worker   Trivial.InsertNode(&T);
113*9880d681SAndroid Build Coastguard Worker   TrivialPair *N = Trivial.GetOrInsertNode(&T2);
114*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(&T, N);
115*9880d681SAndroid Build Coastguard Worker }
116*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,InsertAtPos)117*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, InsertAtPos) {
118*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
119*9880d681SAndroid Build Coastguard Worker 
120*9880d681SAndroid Build Coastguard Worker   void *InsertPos = nullptr;
121*9880d681SAndroid Build Coastguard Worker   TrivialPair Finder(99, 42);
122*9880d681SAndroid Build Coastguard Worker   FoldingSetNodeID ID;
123*9880d681SAndroid Build Coastguard Worker   Finder.Profile(ID);
124*9880d681SAndroid Build Coastguard Worker   Trivial.FindNodeOrInsertPos(ID, InsertPos);
125*9880d681SAndroid Build Coastguard Worker 
126*9880d681SAndroid Build Coastguard Worker   TrivialPair T(99, 42);
127*9880d681SAndroid Build Coastguard Worker   Trivial.InsertNode(&T, InsertPos);
128*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(1U, Trivial.size());
129*9880d681SAndroid Build Coastguard Worker }
130*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,EmptyIsTrue)131*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, EmptyIsTrue) {
132*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
133*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Trivial.empty());
134*9880d681SAndroid Build Coastguard Worker }
135*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,EmptyIsFalse)136*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, EmptyIsFalse) {
137*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
138*9880d681SAndroid Build Coastguard Worker   TrivialPair T(99, 42);
139*9880d681SAndroid Build Coastguard Worker   Trivial.InsertNode(&T);
140*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Trivial.empty());
141*9880d681SAndroid Build Coastguard Worker }
142*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,ClearOnEmpty)143*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, ClearOnEmpty) {
144*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
145*9880d681SAndroid Build Coastguard Worker   Trivial.clear();
146*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Trivial.empty());
147*9880d681SAndroid Build Coastguard Worker }
148*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,ClearOnNonEmpty)149*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, ClearOnNonEmpty) {
150*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
151*9880d681SAndroid Build Coastguard Worker   TrivialPair T(99, 42);
152*9880d681SAndroid Build Coastguard Worker   Trivial.InsertNode(&T);
153*9880d681SAndroid Build Coastguard Worker   Trivial.clear();
154*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Trivial.empty());
155*9880d681SAndroid Build Coastguard Worker }
156*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,CapacityLargerThanReserve)157*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, CapacityLargerThanReserve) {
158*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
159*9880d681SAndroid Build Coastguard Worker   auto OldCapacity = Trivial.capacity();
160*9880d681SAndroid Build Coastguard Worker   Trivial.reserve(OldCapacity + 1);
161*9880d681SAndroid Build Coastguard Worker   EXPECT_GE(Trivial.capacity(), OldCapacity + 1);
162*9880d681SAndroid Build Coastguard Worker }
163*9880d681SAndroid Build Coastguard Worker 
TEST(FoldingSetTest,SmallReserveChangesNothing)164*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, SmallReserveChangesNothing) {
165*9880d681SAndroid Build Coastguard Worker   FoldingSet<TrivialPair> Trivial;
166*9880d681SAndroid Build Coastguard Worker   auto OldCapacity = Trivial.capacity();
167*9880d681SAndroid Build Coastguard Worker   Trivial.reserve(OldCapacity - 1);
168*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Trivial.capacity(), OldCapacity);
169*9880d681SAndroid Build Coastguard Worker }
170*9880d681SAndroid Build Coastguard Worker 
171*9880d681SAndroid Build Coastguard Worker }
172*9880d681SAndroid Build Coastguard Worker 
173