1f4e1db17SJeffrey Yasskin //===- llvm/unittest/ADT/SparseBitVectorTest.cpp - SparseBitVector tests --===//
2f4e1db17SJeffrey Yasskin //
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
6f4e1db17SJeffrey Yasskin //
7f4e1db17SJeffrey Yasskin //===----------------------------------------------------------------------===//
8f4e1db17SJeffrey Yasskin
9f4e1db17SJeffrey Yasskin #include "llvm/ADT/SparseBitVector.h"
10f4e1db17SJeffrey Yasskin #include "gtest/gtest.h"
11f4e1db17SJeffrey Yasskin
12f4e1db17SJeffrey Yasskin using namespace llvm;
13f4e1db17SJeffrey Yasskin
14f4e1db17SJeffrey Yasskin namespace {
15f4e1db17SJeffrey Yasskin
TEST(SparseBitVectorTest,TrivialOperation)16f4e1db17SJeffrey Yasskin TEST(SparseBitVectorTest, TrivialOperation) {
17f4e1db17SJeffrey Yasskin SparseBitVector<> Vec;
18f4e1db17SJeffrey Yasskin EXPECT_EQ(0U, Vec.count());
19f4e1db17SJeffrey Yasskin EXPECT_FALSE(Vec.test(17));
20f4e1db17SJeffrey Yasskin Vec.set(5);
21f4e1db17SJeffrey Yasskin EXPECT_TRUE(Vec.test(5));
22f4e1db17SJeffrey Yasskin EXPECT_FALSE(Vec.test(17));
23f4e1db17SJeffrey Yasskin Vec.reset(6);
24f4e1db17SJeffrey Yasskin EXPECT_TRUE(Vec.test(5));
25f4e1db17SJeffrey Yasskin EXPECT_FALSE(Vec.test(6));
26f4e1db17SJeffrey Yasskin Vec.reset(5);
27f4e1db17SJeffrey Yasskin EXPECT_FALSE(Vec.test(5));
28f4e1db17SJeffrey Yasskin EXPECT_TRUE(Vec.test_and_set(17));
29f4e1db17SJeffrey Yasskin EXPECT_FALSE(Vec.test_and_set(17));
30f4e1db17SJeffrey Yasskin EXPECT_TRUE(Vec.test(17));
31f4e1db17SJeffrey Yasskin Vec.clear();
32f4e1db17SJeffrey Yasskin EXPECT_FALSE(Vec.test(17));
33f777e8b4SDaniel Sanders
34f777e8b4SDaniel Sanders Vec.set(5);
35f777e8b4SDaniel Sanders const SparseBitVector<> ConstVec = Vec;
36f777e8b4SDaniel Sanders EXPECT_TRUE(ConstVec.test(5));
37f777e8b4SDaniel Sanders EXPECT_FALSE(ConstVec.test(17));
385223624eSBenjamin Kramer
395223624eSBenjamin Kramer Vec.set(1337);
405223624eSBenjamin Kramer EXPECT_TRUE(Vec.test(1337));
415223624eSBenjamin Kramer Vec = ConstVec;
425223624eSBenjamin Kramer EXPECT_FALSE(Vec.test(1337));
435223624eSBenjamin Kramer
445223624eSBenjamin Kramer Vec.set(1337);
455223624eSBenjamin Kramer EXPECT_FALSE(Vec.empty());
465223624eSBenjamin Kramer SparseBitVector<> MovedVec(std::move(Vec));
475223624eSBenjamin Kramer EXPECT_TRUE(Vec.empty());
485223624eSBenjamin Kramer EXPECT_TRUE(MovedVec.test(5));
495223624eSBenjamin Kramer EXPECT_TRUE(MovedVec.test(1337));
505223624eSBenjamin Kramer
515223624eSBenjamin Kramer Vec = std::move(MovedVec);
525223624eSBenjamin Kramer EXPECT_TRUE(MovedVec.empty());
535223624eSBenjamin Kramer EXPECT_FALSE(Vec.empty());
54f4e1db17SJeffrey Yasskin }
55f4e1db17SJeffrey Yasskin
TEST(SparseBitVectorTest,IntersectWith)56fb8f8a29SDaniel Berlin TEST(SparseBitVectorTest, IntersectWith) {
57fb8f8a29SDaniel Berlin SparseBitVector<> Vec, Other;
58fb8f8a29SDaniel Berlin
59fb8f8a29SDaniel Berlin Vec.set(1);
60fb8f8a29SDaniel Berlin Other.set(1);
61fb8f8a29SDaniel Berlin EXPECT_FALSE(Vec &= Other);
62fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.test(1));
63fb8f8a29SDaniel Berlin
64fb8f8a29SDaniel Berlin Vec.clear();
65fb8f8a29SDaniel Berlin Vec.set(5);
66fb8f8a29SDaniel Berlin Other.clear();
67fb8f8a29SDaniel Berlin Other.set(6);
68fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec &= Other);
69fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.empty());
70fb8f8a29SDaniel Berlin
71fb8f8a29SDaniel Berlin Vec.clear();
72fb8f8a29SDaniel Berlin Vec.set(5);
73fb8f8a29SDaniel Berlin Other.clear();
74fb8f8a29SDaniel Berlin Other.set(225);
75fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec &= Other);
76fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.empty());
77fb8f8a29SDaniel Berlin
78fb8f8a29SDaniel Berlin Vec.clear();
79fb8f8a29SDaniel Berlin Vec.set(225);
80fb8f8a29SDaniel Berlin Other.clear();
81fb8f8a29SDaniel Berlin Other.set(5);
82fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec &= Other);
83fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.empty());
84fb8f8a29SDaniel Berlin }
85fb8f8a29SDaniel Berlin
TEST(SparseBitVectorTest,SelfAssignment)86fb8f8a29SDaniel Berlin TEST(SparseBitVectorTest, SelfAssignment) {
87fb8f8a29SDaniel Berlin SparseBitVector<> Vec, Other;
88fb8f8a29SDaniel Berlin
89fb8f8a29SDaniel Berlin Vec.set(23);
90fb8f8a29SDaniel Berlin Vec.set(234);
91429b0032SRoman Lebedev Vec = static_cast<SparseBitVector<> &>(Vec);
92fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.test(23));
93fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.test(234));
94fb8f8a29SDaniel Berlin
95fb8f8a29SDaniel Berlin Vec.clear();
96fb8f8a29SDaniel Berlin Vec.set(17);
97fb8f8a29SDaniel Berlin Vec.set(256);
98fb8f8a29SDaniel Berlin EXPECT_FALSE(Vec |= Vec);
99fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.test(17));
100fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.test(256));
101fb8f8a29SDaniel Berlin
102fb8f8a29SDaniel Berlin Vec.clear();
103fb8f8a29SDaniel Berlin Vec.set(56);
104fb8f8a29SDaniel Berlin Vec.set(517);
105fb8f8a29SDaniel Berlin EXPECT_FALSE(Vec &= Vec);
106fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.test(56));
107fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.test(517));
108fb8f8a29SDaniel Berlin
109fb8f8a29SDaniel Berlin Vec.clear();
110fb8f8a29SDaniel Berlin Vec.set(99);
111fb8f8a29SDaniel Berlin Vec.set(333);
112fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.intersectWithComplement(Vec));
113fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.empty());
114fb8f8a29SDaniel Berlin EXPECT_FALSE(Vec.intersectWithComplement(Vec));
115fb8f8a29SDaniel Berlin
116fb8f8a29SDaniel Berlin Vec.clear();
117fb8f8a29SDaniel Berlin Vec.set(28);
118fb8f8a29SDaniel Berlin Vec.set(43);
119fb8f8a29SDaniel Berlin Vec.intersectWithComplement(Vec, Vec);
120fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.empty());
121fb8f8a29SDaniel Berlin
122fb8f8a29SDaniel Berlin Vec.clear();
123fb8f8a29SDaniel Berlin Vec.set(42);
124fb8f8a29SDaniel Berlin Vec.set(567);
125fb8f8a29SDaniel Berlin Other.set(55);
126fb8f8a29SDaniel Berlin Other.set(567);
127fb8f8a29SDaniel Berlin Vec.intersectWithComplement(Vec, Other);
128fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.test(42));
129fb8f8a29SDaniel Berlin EXPECT_FALSE(Vec.test(567));
130fb8f8a29SDaniel Berlin
131fb8f8a29SDaniel Berlin Vec.clear();
132fb8f8a29SDaniel Berlin Vec.set(19);
133fb8f8a29SDaniel Berlin Vec.set(21);
134fb8f8a29SDaniel Berlin Other.clear();
135fb8f8a29SDaniel Berlin Other.set(19);
136fb8f8a29SDaniel Berlin Other.set(31);
137fb8f8a29SDaniel Berlin Vec.intersectWithComplement(Other, Vec);
138fb8f8a29SDaniel Berlin EXPECT_FALSE(Vec.test(19));
139fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.test(31));
140fb8f8a29SDaniel Berlin
141fb8f8a29SDaniel Berlin Vec.clear();
142fb8f8a29SDaniel Berlin Vec.set(1);
143fb8f8a29SDaniel Berlin Other.clear();
144fb8f8a29SDaniel Berlin Other.set(59);
145fb8f8a29SDaniel Berlin Other.set(75);
146fb8f8a29SDaniel Berlin Vec.intersectWithComplement(Other, Other);
147fb8f8a29SDaniel Berlin EXPECT_TRUE(Vec.empty());
148fb8f8a29SDaniel Berlin }
149fb8f8a29SDaniel Berlin
TEST(SparseBitVectorTest,Find)150c095f6a0SZachary Turner TEST(SparseBitVectorTest, Find) {
151c095f6a0SZachary Turner SparseBitVector<> Vec;
152c095f6a0SZachary Turner Vec.set(1);
153c095f6a0SZachary Turner EXPECT_EQ(1, Vec.find_first());
154c095f6a0SZachary Turner EXPECT_EQ(1, Vec.find_last());
155c095f6a0SZachary Turner
156c095f6a0SZachary Turner Vec.set(2);
157c095f6a0SZachary Turner EXPECT_EQ(1, Vec.find_first());
158c095f6a0SZachary Turner EXPECT_EQ(2, Vec.find_last());
159c095f6a0SZachary Turner
160c095f6a0SZachary Turner Vec.set(0);
161c095f6a0SZachary Turner Vec.set(3);
162c095f6a0SZachary Turner EXPECT_EQ(0, Vec.find_first());
163c095f6a0SZachary Turner EXPECT_EQ(3, Vec.find_last());
164c095f6a0SZachary Turner
165c095f6a0SZachary Turner Vec.reset(1);
166c095f6a0SZachary Turner Vec.reset(0);
167c095f6a0SZachary Turner Vec.reset(3);
168c095f6a0SZachary Turner EXPECT_EQ(2, Vec.find_first());
169c095f6a0SZachary Turner EXPECT_EQ(2, Vec.find_last());
170c095f6a0SZachary Turner
171c095f6a0SZachary Turner // Set some large bits to ensure we are pulling bits from more than just a
172c095f6a0SZachary Turner // single bitword.
173c095f6a0SZachary Turner Vec.set(500);
174c095f6a0SZachary Turner Vec.set(2000);
175c095f6a0SZachary Turner Vec.set(3000);
176c095f6a0SZachary Turner Vec.set(4000);
177c095f6a0SZachary Turner Vec.reset(2);
178c095f6a0SZachary Turner EXPECT_EQ(500, Vec.find_first());
179c095f6a0SZachary Turner EXPECT_EQ(4000, Vec.find_last());
180c095f6a0SZachary Turner
181c095f6a0SZachary Turner Vec.reset(500);
182c095f6a0SZachary Turner Vec.reset(3000);
183c095f6a0SZachary Turner Vec.reset(4000);
184c095f6a0SZachary Turner EXPECT_EQ(2000, Vec.find_first());
185c095f6a0SZachary Turner EXPECT_EQ(2000, Vec.find_last());
186c095f6a0SZachary Turner
187c095f6a0SZachary Turner Vec.clear();
188c095f6a0SZachary Turner }
189f4e1db17SJeffrey Yasskin }
190