mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-27 14:45:50 +00:00
7c5c12bd4d
The iplist::clear() function can be quite expensive because it traverses the entire list, calling deleteNode() and removeNodeFromList() on each element. If node destruction and deallocation can be handled some other way, clearAndLeakNodesUnsafely() can be used to jettison all nodes without bringing them into cache. The function name is meant to be ominous. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171540 91177308-0d34-0410-b5e6-96231b3b80d8
99 lines
2.5 KiB
C++
99 lines
2.5 KiB
C++
//===- llvm/unittest/ADT/APInt.cpp - APInt unit tests ---------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/ilist.h"
|
|
#include "llvm/ADT/STLExtras.h"
|
|
#include "llvm/ADT/ilist_node.h"
|
|
#include "gtest/gtest.h"
|
|
#include <ostream>
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
|
|
struct Node : ilist_node<Node> {
|
|
int Value;
|
|
|
|
Node() {}
|
|
Node(int _Value) : Value(_Value) {}
|
|
~Node() { Value = -1; }
|
|
};
|
|
|
|
TEST(ilistTest, Basic) {
|
|
ilist<Node> List;
|
|
List.push_back(Node(1));
|
|
EXPECT_EQ(1, List.back().Value);
|
|
EXPECT_EQ(0, List.back().getPrevNode());
|
|
EXPECT_EQ(0, List.back().getNextNode());
|
|
|
|
List.push_back(Node(2));
|
|
EXPECT_EQ(2, List.back().Value);
|
|
EXPECT_EQ(2, List.front().getNextNode()->Value);
|
|
EXPECT_EQ(1, List.back().getPrevNode()->Value);
|
|
|
|
const ilist<Node> &ConstList = List;
|
|
EXPECT_EQ(2, ConstList.back().Value);
|
|
EXPECT_EQ(2, ConstList.front().getNextNode()->Value);
|
|
EXPECT_EQ(1, ConstList.back().getPrevNode()->Value);
|
|
}
|
|
|
|
TEST(ilistTest, SpliceOne) {
|
|
ilist<Node> List;
|
|
List.push_back(1);
|
|
|
|
// The single-element splice operation supports noops.
|
|
List.splice(List.begin(), List, List.begin());
|
|
EXPECT_EQ(1u, List.size());
|
|
EXPECT_EQ(1, List.front().Value);
|
|
EXPECT_TRUE(llvm::next(List.begin()) == List.end());
|
|
|
|
// Altenative noop. Move the first element behind itself.
|
|
List.push_back(2);
|
|
List.push_back(3);
|
|
List.splice(llvm::next(List.begin()), List, List.begin());
|
|
EXPECT_EQ(3u, List.size());
|
|
EXPECT_EQ(1, List.front().Value);
|
|
EXPECT_EQ(2, llvm::next(List.begin())->Value);
|
|
EXPECT_EQ(3, List.back().Value);
|
|
}
|
|
|
|
TEST(ilistTest, UnsafeClear) {
|
|
ilist<Node> List;
|
|
|
|
// Before even allocating a sentinel.
|
|
List.clearAndLeakNodesUnsafely();
|
|
EXPECT_EQ(0u, List.size());
|
|
|
|
// Empty list with sentinel.
|
|
ilist<Node>::iterator E = List.end();
|
|
List.clearAndLeakNodesUnsafely();
|
|
EXPECT_EQ(0u, List.size());
|
|
// The sentinel shouldn't change.
|
|
EXPECT_TRUE(E == List.end());
|
|
|
|
// List with contents.
|
|
List.push_back(1);
|
|
ASSERT_EQ(1u, List.size());
|
|
Node *N = List.begin();
|
|
EXPECT_EQ(1, N->Value);
|
|
List.clearAndLeakNodesUnsafely();
|
|
EXPECT_EQ(0u, List.size());
|
|
ASSERT_EQ(1, N->Value);
|
|
delete N;
|
|
|
|
// List is still functional.
|
|
List.push_back(5);
|
|
List.push_back(6);
|
|
ASSERT_EQ(2u, List.size());
|
|
EXPECT_EQ(5, List.front().Value);
|
|
EXPECT_EQ(6, List.back().Value);
|
|
}
|
|
|
|
}
|