1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00
llvm-mirror/unittests/ADT/PriorityWorklistTest.cpp
Chandler Carruth 69a27222d9 [ADT] Add a new data structure for managing a priority worklist where
re-insertion of entries into the worklist moves them to the end.

This is fairly similar to a SetVector, but helps in the case where in
addition to not inserting duplicates you want to adjust the sequence of
a pop-off-the-back worklist.

I'm not at all attached to the name of this data structure if others
have better suggestions, but this is one that David Majnemer brought up
in IRC discussions that seems plausible.

I've trimmed the interface down somewhat from SetVector's interface
because several things make less sense here IMO: iteration primarily.
I'd prefer to add these back as we have users that need them. My use
case doesn't even need all of what is provided here. =]

I've also included a basic unittest to make sure this functions
reasonably.

Differential Revision: http://reviews.llvm.org/D21866

llvm-svn: 274198
2016-06-30 02:32:20 +00:00

107 lines
2.6 KiB
C++

//===- llvm/unittest/ADT/PriorityWorklist.cpp -----------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// PriorityWorklist unit tests.
//
//===----------------------------------------------------------------------===//
#include "llvm/ADT/PriorityWorklist.h"
#include "gtest/gtest.h"
namespace {
using namespace llvm;
template <typename T> class PriorityWorklistTest : public ::testing::Test {};
typedef ::testing::Types<PriorityWorklist<int>, SmallPriorityWorklist<int, 2>>
TestTypes;
TYPED_TEST_CASE(PriorityWorklistTest, TestTypes);
TYPED_TEST(PriorityWorklistTest, Basic) {
TypeParam W;
EXPECT_TRUE(W.empty());
EXPECT_EQ(0u, W.size());
EXPECT_FALSE(W.count(42));
EXPECT_TRUE(W.insert(21));
EXPECT_TRUE(W.insert(42));
EXPECT_TRUE(W.insert(17));
EXPECT_FALSE(W.empty());
EXPECT_EQ(3u, W.size());
EXPECT_TRUE(W.count(42));
EXPECT_FALSE(W.erase(75));
EXPECT_EQ(3u, W.size());
EXPECT_EQ(17, W.back());
EXPECT_TRUE(W.erase(17));
EXPECT_FALSE(W.count(17));
EXPECT_EQ(2u, W.size());
EXPECT_EQ(42, W.back());
W.clear();
EXPECT_TRUE(W.empty());
EXPECT_EQ(0u, W.size());
EXPECT_TRUE(W.insert(21));
EXPECT_TRUE(W.insert(42));
EXPECT_TRUE(W.insert(12));
EXPECT_TRUE(W.insert(17));
EXPECT_TRUE(W.count(12));
EXPECT_TRUE(W.count(17));
EXPECT_EQ(4u, W.size());
EXPECT_EQ(17, W.back());
EXPECT_TRUE(W.erase(12));
EXPECT_FALSE(W.count(12));
EXPECT_TRUE(W.count(17));
EXPECT_EQ(3u, W.size());
EXPECT_EQ(17, W.back());
EXPECT_FALSE(W.insert(42));
EXPECT_EQ(3u, W.size());
EXPECT_EQ(42, W.pop_back_val());
EXPECT_EQ(17, W.pop_back_val());
EXPECT_EQ(21, W.pop_back_val());
EXPECT_TRUE(W.empty());
}
TYPED_TEST(PriorityWorklistTest, EraseIf) {
TypeParam W;
W.insert(23);
W.insert(10);
W.insert(47);
W.insert(42);
W.insert(23);
W.insert(13);
W.insert(26);
W.insert(42);
EXPECT_EQ(6u, W.size());
EXPECT_FALSE(W.erase_if([](int i) { return i > 100; }));
EXPECT_EQ(6u, W.size());
EXPECT_EQ(42, W.back());
EXPECT_TRUE(W.erase_if([](int i) {
assert(i != 0 && "Saw a null value!");
return (i & 1) == 0;
}));
EXPECT_EQ(3u, W.size());
EXPECT_FALSE(W.count(42));
EXPECT_FALSE(W.count(26));
EXPECT_FALSE(W.count(10));
EXPECT_FALSE(W.insert(47));
EXPECT_FALSE(W.insert(23));
EXPECT_EQ(23, W.pop_back_val());
EXPECT_EQ(47, W.pop_back_val());
EXPECT_EQ(13, W.pop_back_val());
}
}