1aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar//===- llvm/unittest/ADT/APInt.cpp - APInt unit tests ---------------------===// 2aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar// 3aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar// The LLVM Compiler Infrastructure 4aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar// 5aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar// This file is distributed under the University of Illinois Open Source 6aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar// License. See LICENSE.TXT for details. 7aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar// 8aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar//===----------------------------------------------------------------------===// 9aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar 10aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar#include "llvm/ADT/ilist.h" 117f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen#include "llvm/ADT/STLExtras.h" 127f00f87767036e74445aad0164eea13cf2642610Chandler Carruth#include "llvm/ADT/ilist_node.h" 135a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "gtest/gtest.h" 145a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include <ostream> 15aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar 16aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbarusing namespace llvm; 17aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar 18aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbarnamespace { 19aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar 20aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbarstruct Node : ilist_node<Node> { 21aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar int Value; 22aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar 23aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar Node() {} 24aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar Node(int _Value) : Value(_Value) {} 257c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen ~Node() { Value = -1; } 26aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar}; 27aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar 28aa81380353a27d9d216cafdd88df08a5eef43b74Daniel DunbarTEST(ilistTest, Basic) { 29aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar ilist<Node> List; 30aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar List.push_back(Node(1)); 31aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar EXPECT_EQ(1, List.back().Value); 32aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar EXPECT_EQ(0, List.back().getPrevNode()); 33aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar EXPECT_EQ(0, List.back().getNextNode()); 34aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar 35aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar List.push_back(Node(2)); 36aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar EXPECT_EQ(2, List.back().Value); 37aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar EXPECT_EQ(2, List.front().getNextNode()->Value); 38aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar EXPECT_EQ(1, List.back().getPrevNode()->Value); 39f1fd2288f36b58b8979761ba09e2a398c6afd110Daniel Dunbar 40f1fd2288f36b58b8979761ba09e2a398c6afd110Daniel Dunbar const ilist<Node> &ConstList = List; 41f1fd2288f36b58b8979761ba09e2a398c6afd110Daniel Dunbar EXPECT_EQ(2, ConstList.back().Value); 42f1fd2288f36b58b8979761ba09e2a398c6afd110Daniel Dunbar EXPECT_EQ(2, ConstList.front().getNextNode()->Value); 43f1fd2288f36b58b8979761ba09e2a398c6afd110Daniel Dunbar EXPECT_EQ(1, ConstList.back().getPrevNode()->Value); 44aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar} 45aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar 467f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund OlesenTEST(ilistTest, SpliceOne) { 477f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen ilist<Node> List; 487f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen List.push_back(1); 497f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen 507f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen // The single-element splice operation supports noops. 517f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen List.splice(List.begin(), List, List.begin()); 527f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen EXPECT_EQ(1u, List.size()); 537f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen EXPECT_EQ(1, List.front().Value); 547f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen EXPECT_TRUE(llvm::next(List.begin()) == List.end()); 557f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen 567f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen // Altenative noop. Move the first element behind itself. 577f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen List.push_back(2); 587f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen List.push_back(3); 597f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen List.splice(llvm::next(List.begin()), List, List.begin()); 607f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen EXPECT_EQ(3u, List.size()); 617f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen EXPECT_EQ(1, List.front().Value); 627f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen EXPECT_EQ(2, llvm::next(List.begin())->Value); 637f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen EXPECT_EQ(3, List.back().Value); 647f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen} 657f1d6d688f6ae288a16a4151e8a27b518d97f6f7Jakob Stoklund Olesen 667c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund OlesenTEST(ilistTest, UnsafeClear) { 677c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen ilist<Node> List; 687c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen 697c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen // Before even allocating a sentinel. 707c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen List.clearAndLeakNodesUnsafely(); 717c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen EXPECT_EQ(0u, List.size()); 727c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen 737c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen // Empty list with sentinel. 747c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen ilist<Node>::iterator E = List.end(); 757c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen List.clearAndLeakNodesUnsafely(); 767c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen EXPECT_EQ(0u, List.size()); 777c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen // The sentinel shouldn't change. 787c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen EXPECT_TRUE(E == List.end()); 797c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen 807c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen // List with contents. 817c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen List.push_back(1); 827c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen ASSERT_EQ(1u, List.size()); 837c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen Node *N = List.begin(); 847c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen EXPECT_EQ(1, N->Value); 857c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen List.clearAndLeakNodesUnsafely(); 867c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen EXPECT_EQ(0u, List.size()); 877c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen ASSERT_EQ(1, N->Value); 887c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen delete N; 897c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen 907c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen // List is still functional. 917c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen List.push_back(5); 927c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen List.push_back(6); 937c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen ASSERT_EQ(2u, List.size()); 947c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen EXPECT_EQ(5, List.front().Value); 957c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen EXPECT_EQ(6, List.back().Value); 967c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen} 977c5c12bd4d60070c90161df9f6ae078c1f7b1ce5Jakob Stoklund Olesen 98aa81380353a27d9d216cafdd88df08a5eef43b74Daniel Dunbar} 99