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