13d9fbee0df683ade125b1cbed98df1e561fec83aBill Wendling//===- llvm/unittest/ADT/SmallVectorTest.cpp ------------------------------===// 2f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// 3f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// The LLVM Compiler Infrastructure 4f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// 5f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// This file is distributed under the University of Illinois Open Source 6f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// License. See LICENSE.TXT for details. 7f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// 8f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling//===----------------------------------------------------------------------===// 9f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// 10f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// SmallVector unit tests. 11f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// 12f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling//===----------------------------------------------------------------------===// 13f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 14f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling#include "llvm/ADT/SmallVector.h" 15d400850101b304376b21b053a8445100715ebc10Bill Wendling#include "llvm/Support/Compiler.h" 165a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "gtest/gtest.h" 17a7a33fd95f15428b7030ef1b764fcf924d5199c8Dan Gohman#include <list> 185a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include <stdarg.h> 19f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 20f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingusing namespace llvm; 21f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 22f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingnamespace { 23f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 24f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling/// A helper class that counts the total number of constructor and 25f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling/// destructor calls. 26f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingclass Constructable { 27f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingprivate: 28f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling static int numConstructorCalls; 29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static int numMoveConstructorCalls; 30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static int numCopyConstructorCalls; 31f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling static int numDestructorCalls; 32f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling static int numAssignmentCalls; 33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static int numMoveAssignmentCalls; 34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static int numCopyAssignmentCalls; 35f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool constructed; 37f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling int value; 38f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 39f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingpublic: 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Constructable() : constructed(true), value(0) { 41f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ++numConstructorCalls; 42f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 439cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Constructable(int val) : constructed(true), value(val) { 45f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ++numConstructorCalls; 46f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 479cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Constructable(const Constructable & src) : constructed(true) { 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines value = src.value; 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ++numConstructorCalls; 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ++numCopyConstructorCalls; 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Constructable(Constructable && src) : constructed(true) { 55f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling value = src.value; 56f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ++numConstructorCalls; 57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ++numMoveConstructorCalls; 58f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 599cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 60f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ~Constructable() { 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EXPECT_TRUE(constructed); 62f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ++numDestructorCalls; 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines constructed = false; 64f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 659cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 66f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling Constructable & operator=(const Constructable & src) { 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EXPECT_TRUE(constructed); 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines value = src.value; 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ++numAssignmentCalls; 70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ++numCopyAssignmentCalls; 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return *this; 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Constructable & operator=(Constructable && src) { 75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EXPECT_TRUE(constructed); 76f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling value = src.value; 77f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ++numAssignmentCalls; 78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ++numMoveAssignmentCalls; 79f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling return *this; 80f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 819cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 82f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling int getValue() const { 83f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling return abs(value); 84f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 85f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 86f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling static void reset() { 87f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling numConstructorCalls = 0; 88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines numMoveConstructorCalls = 0; 89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines numCopyConstructorCalls = 0; 90f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling numDestructorCalls = 0; 91f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling numAssignmentCalls = 0; 92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines numMoveAssignmentCalls = 0; 93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines numCopyAssignmentCalls = 0; 94f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 959cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 96f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling static int getNumConstructorCalls() { 97f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling return numConstructorCalls; 98f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 99f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static int getNumMoveConstructorCalls() { 101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return numMoveConstructorCalls; 102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static int getNumCopyConstructorCalls() { 105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return numCopyConstructorCalls; 106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 108f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling static int getNumDestructorCalls() { 109f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling return numDestructorCalls; 110f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 111f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 112cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static int getNumAssignmentCalls() { 113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return numAssignmentCalls; 114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static int getNumMoveAssignmentCalls() { 117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return numMoveAssignmentCalls; 118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static int getNumCopyAssignmentCalls() { 121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return numCopyAssignmentCalls; 122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 124f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling friend bool operator==(const Constructable & c0, const Constructable & c1) { 125f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling return c0.getValue() == c1.getValue(); 126f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 127f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 128100c267249d1d03c4f96eede9877a4f9f54f2247Chandler Carruth friend bool LLVM_ATTRIBUTE_UNUSED 129d400850101b304376b21b053a8445100715ebc10Bill Wendling operator!=(const Constructable & c0, const Constructable & c1) { 130f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling return c0.getValue() != c1.getValue(); 131f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 132f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling}; 133f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 134f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingint Constructable::numConstructorCalls; 135cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesint Constructable::numCopyConstructorCalls; 136cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesint Constructable::numMoveConstructorCalls; 137f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingint Constructable::numDestructorCalls; 138f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingint Constructable::numAssignmentCalls; 139cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesint Constructable::numCopyAssignmentCalls; 140cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesint Constructable::numMoveAssignmentCalls; 141cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 142cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstruct NonCopyable { 143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NonCopyable() {} 144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NonCopyable(NonCopyable &&) {} 145cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NonCopyable &operator=(NonCopyable &&) { return *this; } 146cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesprivate: 147cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NonCopyable(const NonCopyable &) LLVM_DELETED_FUNCTION; 148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NonCopyable &operator=(const NonCopyable &) LLVM_DELETED_FUNCTION; 149cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}; 150cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 151cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesLLVM_ATTRIBUTE_USED void CompileTest() { 152cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SmallVector<NonCopyable, 0> V; 153cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines V.resize(42); 154cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 155f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 156f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Test fixture class 157ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruthtemplate <typename VectorT> 158f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingclass SmallVectorTest : public testing::Test { 159f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendlingprotected: 160ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth VectorT theVector; 161ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth VectorT otherVector; 1629cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 163f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling void SetUp() { 164f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling Constructable::reset(); 165f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 166f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 167ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth void assertEmpty(VectorT & v) { 168f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Size tests 169f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(0u, v.size()); 170f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_TRUE(v.empty()); 171f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 172f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Iterator tests 173f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_TRUE(v.begin() == v.end()); 174f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 175f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 176f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Assert that theVector contains the specified values, in order. 177ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth void assertValuesInOrder(VectorT & v, size_t size, ...) { 178f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(size, v.size()); 1799cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 180f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling va_list ap; 181f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling va_start(ap, size); 182f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling for (size_t i = 0; i < size; ++i) { 183f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling int value = va_arg(ap, int); 184f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(value, v[i].getValue()); 185f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 186f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 187f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling va_end(ap); 188f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 1899cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 190f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Generate a sequence of values to initialize the vector. 191ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth void makeSequence(VectorT & v, int start, int end) { 192f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling for (int i = start; i <= end; ++i) { 193f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling v.push_back(Constructable(i)); 194f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 195f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 196f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling}; 197f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 198ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruthtypedef ::testing::Types<SmallVector<Constructable, 0>, 199ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth SmallVector<Constructable, 1>, 200ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth SmallVector<Constructable, 2>, 201cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SmallVector<Constructable, 4>, 202cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SmallVector<Constructable, 5> 203ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth > SmallVectorTestTypes; 204ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST_CASE(SmallVectorTest, SmallVectorTestTypes); 205ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth 206f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// New vector test. 207ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, EmptyVectorTest) { 208f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("EmptyVectorTest"); 209ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertEmpty(this->theVector); 210ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(this->theVector.rbegin() == this->theVector.rend()); 211f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(0, Constructable::getNumConstructorCalls()); 212f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(0, Constructable::getNumDestructorCalls()); 213f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 214f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 215f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Simple insertions and deletions. 216ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, PushPopTest) { 217f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("PushPopTest"); 218f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 219ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth // Track whether the vector will potentially have to grow. 220ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth bool RequiresGrowth = this->theVector.capacity() < 3; 221ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth 222f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Push an element 223ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.push_back(Constructable(1)); 224f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 225f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Size tests 226ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 1u, 1); 227ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_FALSE(this->theVector.begin() == this->theVector.end()); 228ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_FALSE(this->theVector.empty()); 229f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 230f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Push another element 231ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.push_back(Constructable(2)); 232ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 2u, 1, 2); 233f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 2349cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson // Insert at beginning 235ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.insert(this->theVector.begin(), this->theVector[1]); 236ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 3u, 2, 1, 2); 2379cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 238f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Pop one element 239ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.pop_back(); 240ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 2u, 2, 1); 241f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 2429cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson // Pop remaining elements 243ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.pop_back(); 244ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.pop_back(); 245ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertEmpty(this->theVector); 2469cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 247f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Check number of constructor calls. Should be 2 for each list element, 2489cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson // one for the argument to push_back, one for the argument to insert, 2499cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson // and one for the list element itself. 250ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth if (!RequiresGrowth) { 251ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(5, Constructable::getNumConstructorCalls()); 252ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(5, Constructable::getNumDestructorCalls()); 253ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth } else { 254ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth // If we had to grow the vector, these only have a lower bound, but should 255ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth // always be equal. 256ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_LE(5, Constructable::getNumConstructorCalls()); 257ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(Constructable::getNumConstructorCalls(), 258ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth Constructable::getNumDestructorCalls()); 259ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth } 260f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 261f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 262f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Clear test. 263ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, ClearTest) { 264f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("ClearTest"); 265f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 266ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.reserve(2); 267ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 2); 268ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.clear(); 269f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 270ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertEmpty(this->theVector); 271f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(4, Constructable::getNumConstructorCalls()); 272f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(4, Constructable::getNumDestructorCalls()); 273f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 274f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 275f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Resize smaller test. 276ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, ResizeShrinkTest) { 277f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("ResizeShrinkTest"); 278f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 279ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.reserve(3); 280ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 3); 281ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.resize(1); 282f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 283ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 1u, 1); 284f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(6, Constructable::getNumConstructorCalls()); 285f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(5, Constructable::getNumDestructorCalls()); 286f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 287f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 288f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Resize bigger test. 289ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, ResizeGrowTest) { 290f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("ResizeGrowTest"); 291f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 292ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.resize(2); 2939cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 294cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(2, Constructable::getNumConstructorCalls()); 295cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(0, Constructable::getNumDestructorCalls()); 296ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(2u, this->theVector.size()); 297f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 298f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 299cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTYPED_TEST(SmallVectorTest, ResizeWithElementsTest) { 300cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->theVector.resize(2); 301cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 302cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable::reset(); 303cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 304cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->theVector.resize(4); 305cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 306cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines size_t Ctors = Constructable::getNumConstructorCalls(); 307cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(Ctors == 2 || Ctors == 4); 308cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines size_t MoveCtors = Constructable::getNumMoveConstructorCalls(); 309cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(MoveCtors == 0 || MoveCtors == 2); 310cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines size_t Dtors = Constructable::getNumDestructorCalls(); 311cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(Dtors == 0 || Dtors == 2); 312cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 313cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 314f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Resize with fill value. 315ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, ResizeFillTest) { 316f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("ResizeFillTest"); 317f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 318ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.resize(3, Constructable(77)); 319ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 3u, 77, 77, 77); 320f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 321f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 322f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Overflow past fixed size. 323ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, OverflowTest) { 324f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("OverflowTest"); 325f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 326614be08dd6ae0755d8a4c32ad49f5f580602cc78Daniel Dunbar // Push more elements than the fixed size. 327ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 10); 328f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 329614be08dd6ae0755d8a4c32ad49f5f580602cc78Daniel Dunbar // Test size and values. 330ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(10u, this->theVector.size()); 331f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling for (int i = 0; i < 10; ++i) { 332ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(i+1, this->theVector[i].getValue()); 333f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling } 3349cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 335614be08dd6ae0755d8a4c32ad49f5f580602cc78Daniel Dunbar // Now resize back to fixed size. 336ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.resize(1); 3379cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 338ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 1u, 1); 339f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 340f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 341f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Iteration tests. 342ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, IterationTest) { 343ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 2); 344f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 345f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Forward Iteration 346ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth typename TypeParam::iterator it = this->theVector.begin(); 347ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*it == this->theVector.front()); 348ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*it == this->theVector[0]); 349f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(1, it->getValue()); 350f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ++it; 351ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*it == this->theVector[1]); 352ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*it == this->theVector.back()); 353f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(2, it->getValue()); 354f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ++it; 355ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(it == this->theVector.end()); 356f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling --it; 357ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*it == this->theVector[1]); 358f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(2, it->getValue()); 359f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling --it; 360ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*it == this->theVector[0]); 361f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(1, it->getValue()); 362f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 363f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling // Reverse Iteration 364ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth typename TypeParam::reverse_iterator rit = this->theVector.rbegin(); 365ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*rit == this->theVector[1]); 366f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(2, rit->getValue()); 367f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ++rit; 368ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*rit == this->theVector[0]); 369f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(1, rit->getValue()); 370f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling ++rit; 371ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(rit == this->theVector.rend()); 372f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling --rit; 373ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*rit == this->theVector[0]); 374f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(1, rit->getValue()); 375f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling --rit; 376ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(*rit == this->theVector[1]); 377f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(2, rit->getValue()); 378f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 379f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 380f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Swap test. 381ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, SwapTest) { 382f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("SwapTest"); 383f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 384ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 2); 385ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth std::swap(this->theVector, this->otherVector); 386f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 387ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertEmpty(this->theVector); 388ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->otherVector, 2u, 1, 2); 389f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 390f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 391f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Append test 392ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, AppendTest) { 393f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("AppendTest"); 394f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 395ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->otherVector, 2, 3); 396f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 397ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.push_back(Constructable(1)); 398ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.append(this->otherVector.begin(), this->otherVector.end()); 399f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 400ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3); 401f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 402f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 403f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Append repeated test 404ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, AppendRepeatedTest) { 405f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("AppendRepeatedTest"); 406f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 407ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.push_back(Constructable(1)); 408ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.append(2, Constructable(77)); 409ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 3u, 1, 77, 77); 410f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 411f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 412f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Assign test 413ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, AssignTest) { 414f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("AssignTest"); 415f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 416ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.push_back(Constructable(1)); 417ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.assign(2, Constructable(77)); 418ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 2u, 77, 77); 419f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 420f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 421dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Move-assign test 422dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesTYPED_TEST(SmallVectorTest, MoveAssignTest) { 423dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SCOPED_TRACE("MoveAssignTest"); 424dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 425dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Set up our vector with a single element, but enough capacity for 4. 426dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->theVector.reserve(4); 427dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->theVector.push_back(Constructable(1)); 428dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 429dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Set up the other vector with 2 elements. 430dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->otherVector.push_back(Constructable(2)); 431dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->otherVector.push_back(Constructable(3)); 432dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 433dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Move-assign from the other vector. 434dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->theVector = std::move(this->otherVector); 435dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 436dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Make sure we have the right result. 437dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->assertValuesInOrder(this->theVector, 2u, 2, 3); 438dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 439dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Make sure the # of constructor/destructor calls line up. There 440dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // are two live objects after clearing the other vector. 441dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->otherVector.clear(); 442dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EXPECT_EQ(Constructable::getNumConstructorCalls()-2, 443dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Constructable::getNumDestructorCalls()); 444dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 445dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // There shouldn't be any live objects any more. 446dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->theVector.clear(); 447dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EXPECT_EQ(Constructable::getNumConstructorCalls(), 448dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Constructable::getNumDestructorCalls()); 449dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 450dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 451f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Erase a single element 452ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, EraseTest) { 453f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("EraseTest"); 454f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 455ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 3); 456ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.erase(this->theVector.begin()); 457ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 2u, 2, 3); 458f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 459f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 460f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Erase a range of elements 461ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, EraseRangeTest) { 462f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("EraseRangeTest"); 463f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 464ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 3); 465ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.erase(this->theVector.begin(), this->theVector.begin() + 2); 466ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 1u, 3); 467f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 468f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 469f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Insert a single element. 470ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, InsertTest) { 471f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("InsertTest"); 472f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 473ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 3); 474ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth typename TypeParam::iterator I = 475ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.insert(this->theVector.begin() + 1, Constructable(77)); 476ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(this->theVector.begin() + 1, I); 477ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 4u, 1, 77, 2, 3); 478f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 479f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 480cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// Insert a copy of a single element. 481cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTYPED_TEST(SmallVectorTest, InsertCopy) { 482cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SCOPED_TRACE("InsertTest"); 483cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 484cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->makeSequence(this->theVector, 1, 3); 485cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable C(77); 486cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines typename TypeParam::iterator I = 487cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->theVector.insert(this->theVector.begin() + 1, C); 488cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(this->theVector.begin() + 1, I); 489cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->assertValuesInOrder(this->theVector, 4u, 1, 77, 2, 3); 490cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 491cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 492f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Insert repeated elements. 493ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, InsertRepeatedTest) { 494f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("InsertRepeatedTest"); 495f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 496cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->makeSequence(this->theVector, 1, 4); 497cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable::reset(); 498cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto I = 499cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->theVector.insert(this->theVector.begin() + 1, 2, Constructable(16)); 500cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Move construct the top element into newly allocated space, and optionally 501cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // reallocate the whole buffer, move constructing into it. 502cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // FIXME: This is inefficient, we shouldn't move things into newly allocated 503cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // space, then move them up/around, there should only be 2 or 4 move 504cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // constructions here. 505cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(Constructable::getNumMoveConstructorCalls() == 2 || 506cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable::getNumMoveConstructorCalls() == 6); 507cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Move assign the next two to shift them up and make a gap. 508cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(1, Constructable::getNumMoveAssignmentCalls()); 509cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Copy construct the two new elements from the parameter. 510cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(2, Constructable::getNumCopyAssignmentCalls()); 511cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // All without any copy construction. 512cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(0, Constructable::getNumCopyConstructorCalls()); 513ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(this->theVector.begin() + 1, I); 514cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->assertValuesInOrder(this->theVector, 6u, 1, 16, 16, 2, 3, 4); 515cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 5165f6c7cfa931a9f9a154c67927f5dec7e928c23d6Benjamin Kramer 517cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 518cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTYPED_TEST(SmallVectorTest, InsertRepeatedAtEndTest) { 519cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SCOPED_TRACE("InsertRepeatedTest"); 520cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 521cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->makeSequence(this->theVector, 1, 4); 522cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable::reset(); 523cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto I = this->theVector.insert(this->theVector.end(), 2, Constructable(16)); 524cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Just copy construct them into newly allocated space 525cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(2, Constructable::getNumCopyConstructorCalls()); 526cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Move everything across if reallocation is needed. 527cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(Constructable::getNumMoveConstructorCalls() == 0 || 528cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable::getNumMoveConstructorCalls() == 4); 529cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Without ever moving or copying anything else. 530cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(0, Constructable::getNumCopyAssignmentCalls()); 531cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(0, Constructable::getNumMoveAssignmentCalls()); 532cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 533cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(this->theVector.begin() + 4, I); 534cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->assertValuesInOrder(this->theVector, 6u, 1, 2, 3, 4, 16, 16); 535cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 536cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 537cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTYPED_TEST(SmallVectorTest, InsertRepeatedEmptyTest) { 538cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SCOPED_TRACE("InsertRepeatedTest"); 539cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 540cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->makeSequence(this->theVector, 10, 15); 541d45f7b6b5dd36b4732dff82ab7c8a856a7b36ae0Benjamin Kramer 542d45f7b6b5dd36b4732dff82ab7c8a856a7b36ae0Benjamin Kramer // Empty insert. 543ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(this->theVector.end(), 544ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.insert(this->theVector.end(), 545ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth 0, Constructable(42))); 546ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(this->theVector.begin() + 1, 547ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.insert(this->theVector.begin() + 1, 548ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth 0, Constructable(42))); 549f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 550f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 551f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Insert range. 552ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, InsertRangeTest) { 553d45f7b6b5dd36b4732dff82ab7c8a856a7b36ae0Benjamin Kramer SCOPED_TRACE("InsertRangeTest"); 554d45f7b6b5dd36b4732dff82ab7c8a856a7b36ae0Benjamin Kramer 555d45f7b6b5dd36b4732dff82ab7c8a856a7b36ae0Benjamin Kramer Constructable Arr[3] = 556d45f7b6b5dd36b4732dff82ab7c8a856a7b36ae0Benjamin Kramer { Constructable(77), Constructable(77), Constructable(77) }; 557f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 558ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 3); 559cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable::reset(); 560cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto I = this->theVector.insert(this->theVector.begin() + 1, Arr, Arr + 3); 561cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Move construct the top 3 elements into newly allocated space. 562cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Possibly move the whole sequence into new space first. 563cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // FIXME: This is inefficient, we shouldn't move things into newly allocated 564cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // space, then move them up/around, there should only be 2 or 3 move 565cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // constructions here. 566cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(Constructable::getNumMoveConstructorCalls() == 2 || 567cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable::getNumMoveConstructorCalls() == 5); 568cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Copy assign the lower 2 new elements into existing space. 569cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(2, Constructable::getNumCopyAssignmentCalls()); 570cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Copy construct the third element into newly allocated space. 571cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(1, Constructable::getNumCopyConstructorCalls()); 572ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(this->theVector.begin() + 1, I); 573ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->assertValuesInOrder(this->theVector, 6u, 1, 77, 77, 77, 2, 3); 574cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 575cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 576cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 577cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTYPED_TEST(SmallVectorTest, InsertRangeAtEndTest) { 578cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SCOPED_TRACE("InsertRangeTest"); 579cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 580cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable Arr[3] = 581cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines { Constructable(77), Constructable(77), Constructable(77) }; 582cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 583cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->makeSequence(this->theVector, 1, 3); 5845f6c7cfa931a9f9a154c67927f5dec7e928c23d6Benjamin Kramer 585d45f7b6b5dd36b4732dff82ab7c8a856a7b36ae0Benjamin Kramer // Insert at end. 586cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable::reset(); 587cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto I = this->theVector.insert(this->theVector.end(), Arr, Arr+3); 588cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Copy construct the 3 elements into new space at the top. 589cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(3, Constructable::getNumCopyConstructorCalls()); 590cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Don't copy/move anything else. 591cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(0, Constructable::getNumCopyAssignmentCalls()); 592cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Reallocation might occur, causing all elements to be moved into the new 593cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // buffer. 594cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(Constructable::getNumMoveConstructorCalls() == 0 || 595cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Constructable::getNumMoveConstructorCalls() == 3); 596cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(0, Constructable::getNumMoveAssignmentCalls()); 597cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(this->theVector.begin() + 3, I); 598cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->assertValuesInOrder(this->theVector, 6u, 599cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 1, 2, 3, 77, 77, 77); 600cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 601cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 602cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTYPED_TEST(SmallVectorTest, InsertEmptyRangeTest) { 603cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SCOPED_TRACE("InsertRangeTest"); 604cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 605cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines this->makeSequence(this->theVector, 1, 3); 606d45f7b6b5dd36b4732dff82ab7c8a856a7b36ae0Benjamin Kramer 607d45f7b6b5dd36b4732dff82ab7c8a856a7b36ae0Benjamin Kramer // Empty insert. 608ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(this->theVector.end(), 609ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.insert(this->theVector.end(), 610ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.begin(), 611ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.begin())); 612ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(this->theVector.begin() + 1, 613ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.insert(this->theVector.begin() + 1, 614ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.begin(), 615ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.begin())); 616f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 617f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 618f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Comparison tests. 619ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, ComparisonTest) { 620f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling SCOPED_TRACE("ComparisonTest"); 621f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 622ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->theVector, 1, 3); 623ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->otherVector, 1, 3); 6249cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 625ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(this->theVector == this->otherVector); 626ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_FALSE(this->theVector != this->otherVector); 627f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 628ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->otherVector.clear(); 629ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->makeSequence(this->otherVector, 2, 4); 6309cbd7afb76f20ce874464c238764c54f86b3ce3bOwen Anderson 631ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_FALSE(this->theVector == this->otherVector); 632ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_TRUE(this->theVector != this->otherVector); 633f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 634f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 635f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling// Constant vector tests. 636ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, ConstVectorTest) { 637ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth const TypeParam constVector; 638f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 639f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_EQ(0u, constVector.size()); 640f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_TRUE(constVector.empty()); 641f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling EXPECT_TRUE(constVector.begin() == constVector.end()); 642f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 643f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling 644c2da6fb3e50902daf670fe83b8b017a2bcba05dfDaniel Dunbar// Direct array access. 645ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, DirectVectorTest) { 646ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(0u, this->theVector.size()); 647ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.reserve(4); 648ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_LE(4u, this->theVector.capacity()); 649c2da6fb3e50902daf670fe83b8b017a2bcba05dfDaniel Dunbar EXPECT_EQ(0, Constructable::getNumConstructorCalls()); 650dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->theVector.push_back(1); 651dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->theVector.push_back(2); 652dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->theVector.push_back(3); 653dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines this->theVector.push_back(4); 654ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(4u, this->theVector.size()); 655dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EXPECT_EQ(8, Constructable::getNumConstructorCalls()); 656ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(1, this->theVector[0].getValue()); 657ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(2, this->theVector[1].getValue()); 658ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(3, this->theVector[2].getValue()); 659ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth EXPECT_EQ(4, this->theVector[3].getValue()); 660c2da6fb3e50902daf670fe83b8b017a2bcba05dfDaniel Dunbar} 661c2da6fb3e50902daf670fe83b8b017a2bcba05dfDaniel Dunbar 662ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTYPED_TEST(SmallVectorTest, IteratorTest) { 663a7a33fd95f15428b7030ef1b764fcf924d5199c8Dan Gohman std::list<int> L; 664ba1f580f338e12c47a600050f7a77fae579acf93Chandler Carruth this->theVector.insert(this->theVector.end(), L.begin(), L.end()); 665a7a33fd95f15428b7030ef1b764fcf924d5199c8Dan Gohman} 666a7a33fd95f15428b7030ef1b764fcf924d5199c8Dan Gohman 6673703baacf5c17425a07d57583148086a746c5f98Benjamin Kramerstruct notassignable { 6683703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer int &x; 6693703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer notassignable(int &x) : x(x) {} 6703703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer}; 6713703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer 672ba1f580f338e12c47a600050f7a77fae579acf93Chandler CarruthTEST(SmallVectorCustomTest, NoAssignTest) { 6733703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer int x = 0; 6743703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer SmallVector<notassignable, 2> vec; 6753703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer vec.push_back(notassignable(x)); 6763703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer x = 42; 6773703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer EXPECT_EQ(42, vec.pop_back_val().x); 6783703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer} 6793703baacf5c17425a07d57583148086a746c5f98Benjamin Kramer 680cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstruct MovedFrom { 681cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool hasValue; 682cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MovedFrom() : hasValue(true) { 683cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 684cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MovedFrom(MovedFrom&& m) : hasValue(m.hasValue) { 685cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines m.hasValue = false; 686cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 687cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MovedFrom &operator=(MovedFrom&& m) { 688cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines hasValue = m.hasValue; 689cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines m.hasValue = false; 690cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return *this; 691cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 692cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}; 693cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 694cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST(SmallVectorTest, MidInsert) { 695cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SmallVector<MovedFrom, 3> v; 696cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines v.push_back(MovedFrom()); 697cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines v.insert(v.begin(), MovedFrom()); 698cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (MovedFrom &m : v) 699cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(m.hasValue); 700cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 701cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 702f2850d9e2785341e099da5f5f50e1673660da2b8Bill Wendling} 703