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