xref: /llvm-project/llvm/unittests/ADT/SparseMultiSetTest.cpp (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
13e3194f4SMichael Ilseman //===------ ADT/SparseSetTest.cpp - SparseSet unit tests -  -----*- C++ -*-===//
23e3194f4SMichael Ilseman //
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
63e3194f4SMichael Ilseman //
73e3194f4SMichael Ilseman //===----------------------------------------------------------------------===//
83e3194f4SMichael Ilseman 
93e3194f4SMichael Ilseman #include "llvm/ADT/SparseMultiSet.h"
103e3194f4SMichael Ilseman #include "gtest/gtest.h"
113e3194f4SMichael Ilseman 
123e3194f4SMichael Ilseman using namespace llvm;
133e3194f4SMichael Ilseman 
143e3194f4SMichael Ilseman namespace {
153e3194f4SMichael Ilseman 
163e3194f4SMichael Ilseman typedef SparseMultiSet<unsigned> USet;
173e3194f4SMichael Ilseman 
183e3194f4SMichael Ilseman // Empty set tests.
TEST(SparseMultiSetTest,EmptySet)193e3194f4SMichael Ilseman TEST(SparseMultiSetTest, EmptySet) {
203e3194f4SMichael Ilseman   USet Set;
213e3194f4SMichael Ilseman   EXPECT_TRUE(Set.empty());
223e3194f4SMichael Ilseman   EXPECT_EQ(0u, Set.size());
233e3194f4SMichael Ilseman 
243e3194f4SMichael Ilseman   Set.setUniverse(10);
253e3194f4SMichael Ilseman 
263e3194f4SMichael Ilseman   // Lookups on empty set.
273e3194f4SMichael Ilseman   EXPECT_TRUE(Set.find(0) == Set.end());
283e3194f4SMichael Ilseman   EXPECT_TRUE(Set.find(9) == Set.end());
293e3194f4SMichael Ilseman 
303e3194f4SMichael Ilseman   // Same thing on a const reference.
313e3194f4SMichael Ilseman   const USet &CSet = Set;
323e3194f4SMichael Ilseman   EXPECT_TRUE(CSet.empty());
333e3194f4SMichael Ilseman   EXPECT_EQ(0u, CSet.size());
343e3194f4SMichael Ilseman   EXPECT_TRUE(CSet.find(0) == CSet.end());
353e3194f4SMichael Ilseman   USet::const_iterator I = CSet.find(5);
363e3194f4SMichael Ilseman   EXPECT_TRUE(I == CSet.end());
373e3194f4SMichael Ilseman }
383e3194f4SMichael Ilseman 
393e3194f4SMichael Ilseman // Single entry set tests.
TEST(SparseMultiSetTest,SingleEntrySet)403e3194f4SMichael Ilseman TEST(SparseMultiSetTest, SingleEntrySet) {
413e3194f4SMichael Ilseman   USet Set;
423e3194f4SMichael Ilseman   Set.setUniverse(10);
433e3194f4SMichael Ilseman   USet::iterator I = Set.insert(5);
443e3194f4SMichael Ilseman   EXPECT_TRUE(I != Set.end());
453e3194f4SMichael Ilseman   EXPECT_TRUE(*I == 5);
463e3194f4SMichael Ilseman 
473e3194f4SMichael Ilseman   EXPECT_FALSE(Set.empty());
483e3194f4SMichael Ilseman   EXPECT_EQ(1u, Set.size());
493e3194f4SMichael Ilseman 
503e3194f4SMichael Ilseman   EXPECT_TRUE(Set.find(0) == Set.end());
513e3194f4SMichael Ilseman   EXPECT_TRUE(Set.find(9) == Set.end());
523e3194f4SMichael Ilseman 
533e3194f4SMichael Ilseman   EXPECT_FALSE(Set.contains(0));
543e3194f4SMichael Ilseman   EXPECT_TRUE(Set.contains(5));
553e3194f4SMichael Ilseman 
563e3194f4SMichael Ilseman   // Extra insert.
573e3194f4SMichael Ilseman   I = Set.insert(5);
583e3194f4SMichael Ilseman   EXPECT_TRUE(I != Set.end());
593e3194f4SMichael Ilseman   EXPECT_TRUE(I == ++Set.find(5));
603e3194f4SMichael Ilseman   I--;
613e3194f4SMichael Ilseman   EXPECT_TRUE(I == Set.find(5));
623e3194f4SMichael Ilseman 
633e3194f4SMichael Ilseman   // Erase non-existent element.
643e3194f4SMichael Ilseman   I = Set.find(1);
653e3194f4SMichael Ilseman   EXPECT_TRUE(I == Set.end());
663e3194f4SMichael Ilseman   EXPECT_EQ(2u, Set.size());
673e3194f4SMichael Ilseman   EXPECT_EQ(5u, *Set.find(5));
683e3194f4SMichael Ilseman 
693e3194f4SMichael Ilseman   // Erase iterator.
703e3194f4SMichael Ilseman   I = Set.find(5);
713e3194f4SMichael Ilseman   EXPECT_TRUE(I != Set.end());
723e3194f4SMichael Ilseman   I = Set.erase(I);
733e3194f4SMichael Ilseman   EXPECT_TRUE(I != Set.end());
743e3194f4SMichael Ilseman   I = Set.erase(I);
753e3194f4SMichael Ilseman   EXPECT_TRUE(I == Set.end());
763e3194f4SMichael Ilseman   EXPECT_TRUE(Set.empty());
773e3194f4SMichael Ilseman }
783e3194f4SMichael Ilseman 
793e3194f4SMichael Ilseman // Multiple entry set tests.
TEST(SparseMultiSetTest,MultipleEntrySet)803e3194f4SMichael Ilseman TEST(SparseMultiSetTest, MultipleEntrySet) {
813e3194f4SMichael Ilseman   USet Set;
823e3194f4SMichael Ilseman   Set.setUniverse(10);
833e3194f4SMichael Ilseman 
843e3194f4SMichael Ilseman   Set.insert(5);
853e3194f4SMichael Ilseman   Set.insert(5);
863e3194f4SMichael Ilseman   Set.insert(5);
873e3194f4SMichael Ilseman   Set.insert(3);
883e3194f4SMichael Ilseman   Set.insert(2);
893e3194f4SMichael Ilseman   Set.insert(1);
903e3194f4SMichael Ilseman   Set.insert(4);
913e3194f4SMichael Ilseman   EXPECT_EQ(7u, Set.size());
923e3194f4SMichael Ilseman 
933e3194f4SMichael Ilseman   // Erase last element by key.
943e3194f4SMichael Ilseman   EXPECT_TRUE(Set.erase(Set.find(4)) == Set.end());
953e3194f4SMichael Ilseman   EXPECT_EQ(6u, Set.size());
963e3194f4SMichael Ilseman   EXPECT_FALSE(Set.contains(4));
973e3194f4SMichael Ilseman   EXPECT_TRUE(Set.find(4) == Set.end());
983e3194f4SMichael Ilseman 
993e3194f4SMichael Ilseman   // Erase first element by key.
1003e3194f4SMichael Ilseman   EXPECT_EQ(3u, Set.count(5));
1013e3194f4SMichael Ilseman   EXPECT_TRUE(Set.find(5) != Set.end());
1023e3194f4SMichael Ilseman   EXPECT_TRUE(Set.erase(Set.find(5)) != Set.end());
1033e3194f4SMichael Ilseman   EXPECT_EQ(5u, Set.size());
1043e3194f4SMichael Ilseman   EXPECT_EQ(2u, Set.count(5));
1053e3194f4SMichael Ilseman 
1063e3194f4SMichael Ilseman   Set.insert(6);
1073e3194f4SMichael Ilseman   Set.insert(7);
1083e3194f4SMichael Ilseman   EXPECT_EQ(7u, Set.size());
1093e3194f4SMichael Ilseman 
1103e3194f4SMichael Ilseman   // Erase tail by iterator.
1113e3194f4SMichael Ilseman   EXPECT_TRUE(Set.getTail(6) == Set.getHead(6));
1123e3194f4SMichael Ilseman   USet::iterator I = Set.erase(Set.find(6));
1133e3194f4SMichael Ilseman   EXPECT_TRUE(I == Set.end());
1143e3194f4SMichael Ilseman   EXPECT_EQ(6u, Set.size());
1153e3194f4SMichael Ilseman 
1163e3194f4SMichael Ilseman   // Erase tails by iterator.
1173e3194f4SMichael Ilseman   EXPECT_EQ(2u, Set.count(5));
1183e3194f4SMichael Ilseman   I = Set.getTail(5);
1193e3194f4SMichael Ilseman   I = Set.erase(I);
1203e3194f4SMichael Ilseman   EXPECT_TRUE(I == Set.end());
1213e3194f4SMichael Ilseman   --I;
1223e3194f4SMichael Ilseman   EXPECT_EQ(1u, Set.count(5));
1233e3194f4SMichael Ilseman   EXPECT_EQ(5u, *I);
1243e3194f4SMichael Ilseman   I = Set.erase(I);
1253e3194f4SMichael Ilseman   EXPECT_TRUE(I == Set.end());
1263e3194f4SMichael Ilseman   EXPECT_EQ(0u, Set.count(5));
1273e3194f4SMichael Ilseman 
1283e3194f4SMichael Ilseman   Set.insert(8);
1293e3194f4SMichael Ilseman   Set.insert(8);
1303e3194f4SMichael Ilseman   Set.insert(8);
1313e3194f4SMichael Ilseman   Set.insert(8);
1323e3194f4SMichael Ilseman   Set.insert(8);
1333e3194f4SMichael Ilseman 
1343e3194f4SMichael Ilseman   // Erase all the 8s
13590c45fcaSNAKAMURA Takumi   EXPECT_EQ(5, std::distance(Set.getHead(8), Set.end()));
1363e3194f4SMichael Ilseman   Set.eraseAll(8);
13790c45fcaSNAKAMURA Takumi   EXPECT_EQ(0, std::distance(Set.getHead(8), Set.end()));
1383e3194f4SMichael Ilseman 
1393e3194f4SMichael Ilseman   // Clear and resize the universe.
1403e3194f4SMichael Ilseman   Set.clear();
1413e3194f4SMichael Ilseman   EXPECT_EQ(0u, Set.size());
1423e3194f4SMichael Ilseman   EXPECT_FALSE(Set.contains(3));
1433e3194f4SMichael Ilseman   Set.setUniverse(1000);
1443e3194f4SMichael Ilseman 
1453e3194f4SMichael Ilseman   // Add more than 256 elements.
1463e3194f4SMichael Ilseman   for (unsigned i = 100; i != 800; ++i)
1473e3194f4SMichael Ilseman     Set.insert(i);
1483e3194f4SMichael Ilseman 
1493e3194f4SMichael Ilseman   for (unsigned i = 0; i != 10; ++i)
1503e3194f4SMichael Ilseman     Set.eraseAll(i);
1513e3194f4SMichael Ilseman 
1523e3194f4SMichael Ilseman   for (unsigned i = 100; i != 800; ++i)
1533e3194f4SMichael Ilseman     EXPECT_EQ(1u, Set.count(i));
1543e3194f4SMichael Ilseman 
1553e3194f4SMichael Ilseman   EXPECT_FALSE(Set.contains(99));
1563e3194f4SMichael Ilseman   EXPECT_FALSE(Set.contains(800));
1573e3194f4SMichael Ilseman   EXPECT_EQ(700u, Set.size());
1583e3194f4SMichael Ilseman }
1593e3194f4SMichael Ilseman 
1603e3194f4SMichael Ilseman // Test out iterators
TEST(SparseMultiSetTest,Iterators)1613e3194f4SMichael Ilseman TEST(SparseMultiSetTest, Iterators) {
1623e3194f4SMichael Ilseman   USet Set;
1633e3194f4SMichael Ilseman   Set.setUniverse(100);
1643e3194f4SMichael Ilseman 
1653e3194f4SMichael Ilseman   Set.insert(0);
1663e3194f4SMichael Ilseman   Set.insert(1);
1673e3194f4SMichael Ilseman   Set.insert(2);
1683e3194f4SMichael Ilseman   Set.insert(0);
1693e3194f4SMichael Ilseman   Set.insert(1);
1703e3194f4SMichael Ilseman   Set.insert(0);
1713e3194f4SMichael Ilseman 
1723e3194f4SMichael Ilseman   USet::RangePair RangePair = Set.equal_range(0);
1733e3194f4SMichael Ilseman   USet::iterator B = RangePair.first;
1743e3194f4SMichael Ilseman   USet::iterator E = RangePair.second;
1753e3194f4SMichael Ilseman 
1763e3194f4SMichael Ilseman   // Move the iterators around, going to end and coming back.
1776c03b6d0SNAKAMURA Takumi   EXPECT_EQ(3, std::distance(B, E));
1783e3194f4SMichael Ilseman   EXPECT_EQ(B, --(--(--E)));
1793e3194f4SMichael Ilseman   EXPECT_EQ(++(++(++E)), Set.end());
1803e3194f4SMichael Ilseman   EXPECT_EQ(B, --(--(--E)));
1813e3194f4SMichael Ilseman   EXPECT_EQ(++(++(++E)), Set.end());
1823e3194f4SMichael Ilseman 
1833e3194f4SMichael Ilseman   // Insert into the tail, and move around again
1843e3194f4SMichael Ilseman   Set.insert(0);
1853e3194f4SMichael Ilseman   EXPECT_EQ(B, --(--(--(--E))));
1863e3194f4SMichael Ilseman   EXPECT_EQ(++(++(++(++E))), Set.end());
1873e3194f4SMichael Ilseman   EXPECT_EQ(B, --(--(--(--E))));
1883e3194f4SMichael Ilseman   EXPECT_EQ(++(++(++(++E))), Set.end());
1893e3194f4SMichael Ilseman 
1903e3194f4SMichael Ilseman   // Erase a tail, and move around again
1913e3194f4SMichael Ilseman   USet::iterator Erased = Set.erase(Set.getTail(0));
1923e3194f4SMichael Ilseman   EXPECT_EQ(Erased, E);
1933e3194f4SMichael Ilseman   EXPECT_EQ(B, --(--(--E)));
1943e3194f4SMichael Ilseman 
1953e3194f4SMichael Ilseman   USet Set2;
1963e3194f4SMichael Ilseman   Set2.setUniverse(11);
1973e3194f4SMichael Ilseman   Set2.insert(3);
1983e3194f4SMichael Ilseman   EXPECT_TRUE(!Set2.contains(0));
1993e3194f4SMichael Ilseman   EXPECT_TRUE(!Set.contains(3));
2003e3194f4SMichael Ilseman 
2013e3194f4SMichael Ilseman   EXPECT_EQ(Set2.getHead(3), Set2.getTail(3));
2023e3194f4SMichael Ilseman   EXPECT_EQ(Set2.getHead(0), Set2.getTail(0));
2033e3194f4SMichael Ilseman   B = Set2.find(3);
2043e3194f4SMichael Ilseman   EXPECT_EQ(Set2.find(3), --(++B));
2053e3194f4SMichael Ilseman }
2063e3194f4SMichael Ilseman 
2073e3194f4SMichael Ilseman struct Alt {
2083e3194f4SMichael Ilseman   unsigned Value;
Alt__anonaea97c2c0111::Alt2093e3194f4SMichael Ilseman   explicit Alt(unsigned x) : Value(x) {}
getSparseSetIndex__anonaea97c2c0111::Alt2103e3194f4SMichael Ilseman   unsigned getSparseSetIndex() const { return Value - 1000; }
2113e3194f4SMichael Ilseman };
2123e3194f4SMichael Ilseman 
TEST(SparseMultiSetTest,AltStructSet)2133e3194f4SMichael Ilseman TEST(SparseMultiSetTest, AltStructSet) {
2143e3194f4SMichael Ilseman   typedef SparseMultiSet<Alt> ASet;
2153e3194f4SMichael Ilseman   ASet Set;
2163e3194f4SMichael Ilseman   Set.setUniverse(10);
2173e3194f4SMichael Ilseman   Set.insert(Alt(1005));
2183e3194f4SMichael Ilseman 
2193e3194f4SMichael Ilseman   ASet::iterator I = Set.find(5);
2203e3194f4SMichael Ilseman   ASSERT_TRUE(I != Set.end());
2213e3194f4SMichael Ilseman   EXPECT_EQ(1005u, I->Value);
2223e3194f4SMichael Ilseman 
2233e3194f4SMichael Ilseman   Set.insert(Alt(1006));
2243e3194f4SMichael Ilseman   Set.insert(Alt(1006));
2253e3194f4SMichael Ilseman   I = Set.erase(Set.find(6));
2263e3194f4SMichael Ilseman   ASSERT_TRUE(I != Set.end());
2273e3194f4SMichael Ilseman   EXPECT_EQ(1006u, I->Value);
2283e3194f4SMichael Ilseman   I = Set.erase(Set.find(6));
2293e3194f4SMichael Ilseman   ASSERT_TRUE(I == Set.end());
2303e3194f4SMichael Ilseman 
2313e3194f4SMichael Ilseman   EXPECT_TRUE(Set.contains(5));
2323e3194f4SMichael Ilseman   EXPECT_FALSE(Set.contains(6));
2333e3194f4SMichael Ilseman }
2343e3194f4SMichael Ilseman } // namespace
235