inlined_vector_test.cc revision c8b59c046895fa5b6d79f73e0b5817330fcfbfc1
1c8b59c046895fa5b6d79f73e0b5817330fcfbfc1A. Unique TensorFlower/* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
29c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur
39c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurLicensed under the Apache License, Version 2.0 (the "License");
49c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudluryou may not use this file except in compliance with the License.
59c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurYou may obtain a copy of the License at
69c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur
79c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur    http://www.apache.org/licenses/LICENSE-2.0
89c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur
99c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurUnless required by applicable law or agreed to in writing, software
109c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlurdistributed under the License is distributed on an "AS IS" BASIS,
119c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurSee the License for the specific language governing permissions and
139c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlurlimitations under the License.
149c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur==============================================================================*/
159c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur
16f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/lib/gtl/inlined_vector.h"
17f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
18f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <list>
19f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <memory>
20f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <string>
21f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <vector>
22f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
23f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/platform/logging.h"
243ffa307e49e5b150934a71386194d7ed621e3e98Josh Levenberg#include "tensorflow/core/platform/macros.h"
25c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg#include "tensorflow/core/platform/test.h"
26f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/platform/test_benchmark.h"
275a24d3a2514698b0ae11563b2ea21e368de48a4fJosh Levenberg#include "tensorflow/core/platform/types.h"
28f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
29f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace tensorflow {
30f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
31f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtypedef tensorflow::gtl::InlinedVector<int, 8> IntVec;
32f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
33f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// A type that counts number of live occurrences of the type
34f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic int64 instances = 0;
35f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass Instance {
36f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public:
37f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  int value_;
38f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  explicit Instance(int x) : value_(x) { instances++; }
39f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  Instance(const Instance& x) : value_(x.value_) { instances++; }
40f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  ~Instance() { instances--; }
41f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
42f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  friend inline void swap(Instance& a, Instance& b) {
43f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    using std::swap;
44f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(a.value_, b.value_);
45f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
46f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
47f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  friend std::ostream& operator<<(std::ostream& o, const Instance& v) {
48f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    return o << "[value:" << v.value_ << "]";
49f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
50f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
51f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
52f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtypedef tensorflow::gtl::InlinedVector<Instance, 8> InstanceVec;
53f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
54f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// A simple reference counted class to make sure that the proper elements are
55f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// destroyed in the erase(begin, end) test.
56f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass RefCounted {
57f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public:
58f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  RefCounted(int value, int* count) : value_(value), count_(count) { Ref(); }
59f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
60f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  RefCounted(const RefCounted& v) : value_(v.value_), count_(v.count_) {
61f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    VLOG(5) << "[RefCounted: copy"
62f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur            << " from count @" << v.count_ << "]";
63f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Ref();
64f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
65f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
66f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  ~RefCounted() {
67f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Unref();
68f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    count_ = NULL;
69f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
70f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
71f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  friend void swap(RefCounted& a, RefCounted& b) {
72f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    using std::swap;
73f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(a.value_, b.value_);
74f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(a.count_, b.count_);
75f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
76f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
77f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  RefCounted& operator=(RefCounted v) {
78f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    using std::swap;
79f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(*this, v);
80f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    return *this;
81f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
82f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
83f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  void Ref() const {
84f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    CHECK(count_ != NULL);
85f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ++(*count_);
86f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    VLOG(5) << "[Ref: refcount " << *count_ << " on count @" << count_ << "]";
87f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
88f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
89f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  void Unref() const {
90f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    --(*count_);
91f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    CHECK_GE(*count_, 0);
92f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    VLOG(5) << "[Unref: refcount " << *count_ << " on count @" << count_ << "]";
93f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
94f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
95f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  int count() const { return *count_; }
96f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
97f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  friend std::ostream& operator<<(std::ostream& o, const RefCounted& v) {
98f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    return o << "[value:" << v.value_ << ", count:" << *v.count_ << "]";
99f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
100f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
101f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  int value_;
102f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  int* count_;
103f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
104f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
105f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtypedef tensorflow::gtl::InlinedVector<RefCounted, 8> RefCountedVec;
106f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
107f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// A class with a vtable pointer
108f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass Dynamic {
109f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public:
110f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  virtual ~Dynamic() {}
111f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
112f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  friend std::ostream& operator<<(std::ostream& o, const Dynamic& v) {
113f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    return o << "[Dynamic]";
114f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
115f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
116f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
117f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtypedef tensorflow::gtl::InlinedVector<Dynamic, 8> DynamicVec;
118f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
119f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// Append 0..len-1 to *v
120f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void Fill(IntVec* v, int len, int offset = 0) {
121f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < len; i++) {
122f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v->push_back(i + offset);
123f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
124f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
125f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
126f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic IntVec Fill(int len, int offset = 0) {
127f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  IntVec v;
128f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  Fill(&v, len, offset);
129f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  return v;
130f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
131f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
132f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, SimpleOps) {
133f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
134f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
135f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    const IntVec& cv = v;  // const alias
136f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
137f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Fill(&v, len);
138f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(len, v.size());
139f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_LE(len, v.capacity());
140f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
141f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int i = 0; i < len; i++) {
142f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(i, v[i]);
143f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
144f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(v.begin(), v.data());
145f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(cv.begin(), cv.data());
146f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
147f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    int counter = 0;
148f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (IntVec::iterator iter = v.begin(); iter != v.end(); ++iter) {
149f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(counter, *iter);
150f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      counter++;
151f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
152f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(counter, len);
153f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
154f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    counter = 0;
155f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (IntVec::const_iterator iter = v.begin(); iter != v.end(); ++iter) {
156f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(counter, *iter);
157f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      counter++;
158f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
159f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(counter, len);
160f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
161f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    if (len > 0) {
162f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(0, v.front());
163f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(len - 1, v.back());
164f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.pop_back();
165f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(len - 1, v.size());
166f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (size_t i = 0; i < v.size(); ++i) {
167f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(i, v[i]);
168f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
169f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
170f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
171f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
172f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
173f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Erase) {
174f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 1; len < 20; len++) {
175f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int i = 0; i < len; ++i) {
176f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      IntVec v;
177f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      Fill(&v, len);
178f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.erase(v.begin() + i);
179f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(len - 1, v.size());
180f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int j = 0; j < i; ++j) {
181f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(j, v[j]);
182f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
183f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int j = i; j < len - 1; ++j) {
184f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(j + 1, v[j]);
185f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
186f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
187f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
188f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
189f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
190f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// At the end of this test loop, the elements between [erase_begin, erase_end)
191f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// should have reference counts == 0, and all others elements should have
192f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// reference counts == 1.
193f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(RefCountedVec, EraseBeginEnd) {
194f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 1; len < 20; ++len) {
195f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int erase_begin = 0; erase_begin < len; ++erase_begin) {
196f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int erase_end = erase_begin; erase_end <= len; ++erase_end) {
197f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        std::vector<int> counts(len, 0);
198f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        RefCountedVec v;
199f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        for (int i = 0; i < len; ++i) {
200f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          v.push_back(RefCounted(i, &counts[i]));
201f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        }
202f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
203f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        int erase_len = erase_end - erase_begin;
204f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
205f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        v.erase(v.begin() + erase_begin, v.begin() + erase_end);
206f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
207f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(len - erase_len, v.size());
208f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
209f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        // Check the elements before the first element erased.
210f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        for (int i = 0; i < erase_begin; ++i) {
211f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          EXPECT_EQ(i, v[i].value_);
212f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        }
213f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
214f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        // Check the elements after the first element erased.
215f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        for (size_t i = erase_begin; i < v.size(); ++i) {
216f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          EXPECT_EQ(i + erase_len, v[i].value_);
217f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        }
218f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
219f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        // Check that the elements at the beginning are preserved.
220f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        for (int i = 0; i < erase_begin; ++i) {
221f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          EXPECT_EQ(1, counts[i]);
222f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        }
223f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
224f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        // Check that the erased elements are destroyed
225f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        for (int i = erase_begin; i < erase_end; ++i) {
226f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          EXPECT_EQ(0, counts[i]);
227f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        }
228f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
229f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        // Check that the elements at the end are preserved.
230f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        for (int i = erase_end; i < len; ++i) {
231f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          EXPECT_EQ(1, counts[i]);
232f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        }
233f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
234f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
235f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
236f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
237f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
238f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct NoDefaultCtor {
239f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  explicit NoDefaultCtor(int /* x */) {}
240f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
241f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct NoCopy {
242f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  NoCopy() {}
243f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  NoCopy(const NoCopy& /* x */) = delete;
244f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
245f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct NoAssign {
246f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  NoAssign() {}
247f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  NoAssign& operator=(const NoAssign& /* x */) = delete;
248f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
249f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InlinedVectorTest, NoDefaultCtor) {
250f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<NoDefaultCtor, 1> v(10, NoDefaultCtor(2));
251f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  (void)v;
252f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
253f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InlinedVectorTest, NoCopy) {
254f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<NoCopy, 1> v(10);
255f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  (void)v;
256f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
257f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InlinedVectorTest, NoAssign) {
258f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<NoAssign, 1> v(10);
259f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  (void)v;
260f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
261f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
262f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Insert) {
263f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
264f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int pos = 0; pos <= len; pos++) {
265f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      IntVec v;
266f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      Fill(&v, len);
267f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.insert(v.begin() + pos, 9999);
268f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(v.size(), len + 1);
269f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < pos; i++) {
270f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(v[i], i);
271f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
272f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(v[pos], 9999);
273f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (size_t i = pos + 1; i < v.size(); i++) {
274f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(v[i], i - 1);
275f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
276f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
277f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
278f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
279f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
280f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(RefCountedVec, InsertConstructorDestructor) {
281f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Make sure the proper construction/destruction happen during insert
282f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // operations.
283f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
284f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    SCOPED_TRACE(len);
285f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int pos = 0; pos <= len; pos++) {
286f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      SCOPED_TRACE(pos);
287f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      std::vector<int> counts(len, 0);
288f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      RefCountedVec v;
289f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < len; ++i) {
290f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        SCOPED_TRACE(i);
291f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        v.push_back(RefCounted(i, &counts[i]));
292f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
293f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
294f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (auto elem : counts) {
295f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(1, elem);
296f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
297f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
298f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      int inserted_count = 0;
299f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      RefCounted insert_element(9999, &inserted_count);
300f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(1, inserted_count);
301f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.insert(v.begin() + pos, insert_element);
302f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(2, inserted_count);
303f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      // Check that the elements at the end are preserved.
304f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (auto elem : counts) {
305f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(1, elem);
306f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
307f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(2, inserted_count);
308f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
309f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
310f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
311f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
312f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Resize) {
313f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
314f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
315f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Fill(&v, len);
316f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
317f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // Try resizing up and down by k elements
318f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    static const int kResizeElem = 1000000;
319f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int k = 0; k < 10; k++) {
320f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      // Enlarging resize
321f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.resize(len + k, kResizeElem);
322f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(len + k, v.size());
323f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_LE(len + k, v.capacity());
324f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < len + k; i++) {
325f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        if (i < len) {
326f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          EXPECT_EQ(i, v[i]);
327f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        } else {
328f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          EXPECT_EQ(kResizeElem, v[i]);
329f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        }
330f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
331f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
332f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      // Shrinking resize
333f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.resize(len, kResizeElem);
334f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(len, v.size());
335f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_LE(len, v.capacity());
336f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < len; i++) {
337f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(i, v[i]);
338f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
339f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
340f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
341f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
342f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
343f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, InitWithLength) {
344f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
345f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v(len, 7);
346f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(len, v.size());
347f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_LE(len, v.capacity());
348f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int i = 0; i < len; i++) {
349f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(7, v[i]);
350f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
351f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
352f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
353f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
354f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, CopyConstructorAndAssignment) {
355f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
356f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
357f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Fill(&v, len);
358f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(len, v.size());
359f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_LE(len, v.capacity());
360f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
361f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v2(v);
362f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(v, v2);
363f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
364f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int start_len = 0; start_len < 20; start_len++) {
365f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      IntVec v3;
366f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      Fill(&v3, start_len, 99);  // Add dummy elements that should go away
367f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v3 = v;
368f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(v, v3);
369f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
370f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
371f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
372f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
373f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(OverheadTest, Storage) {
374f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Check for size overhead.
375f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  using tensorflow::gtl::InlinedVector;
376422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(int*), sizeof(InlinedVector<int*, 1>));
377422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4 * sizeof(int*), sizeof(InlinedVector<int*, 2>));
378422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4 * sizeof(int*), sizeof(InlinedVector<int*, 3>));
379422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(6 * sizeof(int*), sizeof(InlinedVector<int*, 4>));
380422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower
381422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(char*), sizeof(InlinedVector<char, 1>));
382422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(char*), sizeof(InlinedVector<char, 2>));
383422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(char*), sizeof(InlinedVector<char, 3>));
384422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(char*),
385422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower            sizeof(InlinedVector<char, 2 * sizeof(char*) - 1>));
386422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4 * sizeof(char*), sizeof(InlinedVector<char, 2 * sizeof(char*)>));
387f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
388f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
389f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Clear) {
390f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
391f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    SCOPED_TRACE(len);
392f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
393f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Fill(&v, len);
394f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.clear();
395f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(0, v.size());
396f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(v.begin(), v.end());
397f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
398f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
399f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
400f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Reserve) {
401f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (size_t len = 0; len < 20; len++) {
402f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
403f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Fill(&v, len);
404f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
405f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (size_t newlen = 0; newlen < 100; newlen++) {
406422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower      const int* start_rep = v.data();
407f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.reserve(newlen);
408422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower      const int* final_rep = v.data();
409f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      if (newlen <= len) {
410f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(start_rep, final_rep);
411f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
412f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_LE(newlen, v.capacity());
413f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
414f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      // Filling up to newlen should not change rep
415f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      while (v.size() < newlen) {
416f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        v.push_back(0);
417f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
418422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower      EXPECT_EQ(final_rep, v.data());
419f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
420f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
421f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
422f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
423f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtemplate <typename T>
424f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic std::vector<typename T::value_type> Vec(const T& src) {
425f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::vector<typename T::value_type> result;
426f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (const auto& elem : src) {
427f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    result.push_back(elem);
428f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
429f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  return result;
430f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
431f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
432f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, SelfRefPushBack) {
433f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::vector<string> std_v;
434f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<string, 4> v;
435f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  const string s = "A very long string to ensure heap.";
436f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std_v.push_back(s);
437f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  v.push_back(s);
438f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < 20; ++i) {
439f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(std_v, Vec(v));
440f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
441f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.push_back(v.back());
442f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    std_v.push_back(std_v.back());
443f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
444f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(std_v, Vec(v));
445f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
446f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
447f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Swap) {
448f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int l1 = 0; l1 < 20; l1++) {
449f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    SCOPED_TRACE(l1);
450f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int l2 = 0; l2 < 20; l2++) {
451f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      SCOPED_TRACE(l2);
452f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      IntVec a = Fill(l1, 0);
453f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      IntVec b = Fill(l2, 100);
454f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      {
455f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        using std::swap;
456f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        swap(a, b);
457f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
458f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l1, b.size());
459f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l2, a.size());
460f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l1; i++) {
461f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        SCOPED_TRACE(i);
462f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(i, b[i]);
463f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
464f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l2; i++) {
465f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        SCOPED_TRACE(i);
466f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(100 + i, a[i]);
467f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
468f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
469f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
470f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
471f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
472f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InstanceVec, Swap) {
473f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int l1 = 0; l1 < 20; l1++) {
474f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int l2 = 0; l2 < 20; l2++) {
475f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      InstanceVec a, b;
476f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l1; i++) a.push_back(Instance(i));
477f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l2; i++) b.push_back(Instance(100 + i));
478f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l1 + l2, instances);
479f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      {
480f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        using std::swap;
481f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        swap(a, b);
482f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
483f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l1 + l2, instances);
484f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l1, b.size());
485f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l2, a.size());
486f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l1; i++) {
487f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(i, b[i].value_);
488f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
489f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l2; i++) {
490f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(100 + i, a[i].value_);
491f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
492f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
493f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
494f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
495f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
496f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, EqualAndNotEqual) {
497f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  IntVec a, b;
498f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a == b);
499f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a != b);
500f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
501f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  a.push_back(3);
502f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a == b);
503f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a != b);
504f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
505f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  b.push_back(3);
506f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a == b);
507f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a != b);
508f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
509f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  b.push_back(7);
510f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a == b);
511f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a != b);
512f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
513f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  a.push_back(6);
514f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a == b);
515f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a != b);
516f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
517f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  a.clear();
518f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  b.clear();
519f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < 100; i++) {
520f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    a.push_back(i);
521f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    b.push_back(i);
522f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_TRUE(a == b);
523f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_FALSE(a != b);
524f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
525f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    b[i] = b[i] + 1;
526f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_FALSE(a == b);
527f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_TRUE(a != b);
528f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
529f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    b[i] = b[i] - 1;  // Back to before
530f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_TRUE(a == b);
531f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_FALSE(a != b);
532f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
533f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
534f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
535f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, RelationalOps) {
536f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  IntVec a, b;
537f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a < b);
538f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(b < a);
539f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a > b);
540f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(b > a);
541f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a <= b);
542f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(b <= a);
543f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a >= b);
544f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(b >= a);
545f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  b.push_back(3);
546f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a < b);
547f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(b < a);
548f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a > b);
549f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(b > a);
550f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a <= b);
551f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(b <= a);
552f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a >= b);
553f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(b >= a);
554f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
555f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
556f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InstanceVec, CountConstructorsDestructors) {
557f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  const int start = instances;
558f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
559f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    InstanceVec v;
560f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int i = 0; i < len; i++) {
561f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.push_back(Instance(i));
562f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
563f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len, instances);
564f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
565f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    {  // Copy constructor should create 'len' more instances.
566f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      InstanceVec v_copy(v);
567f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(start + len + len, instances);
568f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
569f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len, instances);
570f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
571f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // Enlarging resize() must construct some objects
572f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.resize(len + 10, Instance(100));
573f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len + 10, instances);
574f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
575f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // Shrinking resize() must destroy some objects
576f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.resize(len, Instance(100));
577f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len, instances);
578f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
579f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // reserve() must not increase the number of initialized objects
580f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.reserve(len + 1000);
581f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len, instances);
582f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
583f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // pop_back() and erase() must destroy one object
584f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    if (len > 0) {
585f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.pop_back();
586f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(start + len - 1, instances);
587f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      if (!v.empty()) {
588f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        v.erase(v.begin());
589f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(start + len - 2, instances);
590f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
591f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
592f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
593f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(start, instances);
594f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
595f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
596f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InstanceVec, CountConstructorsDestructorsOnAssignment) {
597f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  const int start = instances;
598f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
599f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int longorshort = 0; longorshort <= 1; ++longorshort) {
600f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      InstanceVec longer, shorter;
601f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < len; i++) {
602f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        longer.push_back(Instance(i));
603f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        shorter.push_back(Instance(i));
604f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
605f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      longer.push_back(Instance(len));
606f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(start + len + len + 1, instances);
607f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
608f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      if (longorshort) {
609f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        shorter = longer;
610f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(start + (len + 1) + (len + 1), instances);
611f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      } else {
612f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        longer = shorter;
613f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(start + len + len, instances);
614f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
615f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
616f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
617f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(start, instances);
618f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
619f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
620f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(RangedConstructor, SimpleType) {
621422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  std::vector<int> source_v = {4, 5, 6, 7};
622f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // First try to fit in inline backing
623f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<int, 4> v(source_v.begin(), source_v.end());
624422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  tensorflow::gtl::InlinedVector<int, 4> empty4;
625422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4, v.size());
626422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(empty4.capacity(), v.capacity());  // Must still be inline
627f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(4, v[0]);
628f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(5, v[1]);
629f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(6, v[2]);
630422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(7, v[3]);
631f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
632f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Now, force a re-allocate
633f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<int, 2> realloc_v(source_v.begin(),
634f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur                                                   source_v.end());
635422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  tensorflow::gtl::InlinedVector<int, 2> empty2;
636422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4, realloc_v.size());
637422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_LT(empty2.capacity(), realloc_v.capacity());
638f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(4, realloc_v[0]);
639f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(5, realloc_v[1]);
640f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(6, realloc_v[2]);
641422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(7, realloc_v[3]);
642f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
643f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
644f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(RangedConstructor, ComplexType) {
645f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // We also use a list here to pass a different flavor of iterator (e.g. not
646f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // random-access).
647f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::list<Instance> source_v = {Instance(0)};
648f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
649f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // First try to fit in inline backing
650f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<Instance, 1> v(source_v.begin(),
651f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur                                                source_v.end());
652422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  tensorflow::gtl::InlinedVector<Instance, 1> empty1;
653f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(1, v.size());
654422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(empty1.capacity(), v.capacity());  // Must still be inline
655f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(0, v[0].value_);
656f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
657422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  std::list<Instance> source_v2 = {Instance(0), Instance(1), Instance(2),
658422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower                                   Instance(3)};
659f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Now, force a re-allocate
660f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<Instance, 1> realloc_v(source_v2.begin(),
661f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur                                                        source_v2.end());
662422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4, realloc_v.size());
663422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_LT(empty1.capacity(), realloc_v.capacity());
664f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(0, realloc_v[0].value_);
665f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(1, realloc_v[1].value_);
666422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2, realloc_v[2].value_);
667422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(3, realloc_v[3].value_);
668f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
669f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
670f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(RangedConstructor, ElementsAreConstructed) {
671f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::vector<string> source_v = {"cat", "dog"};
672f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
673f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Force expansion and re-allocation of v.  Ensures that when the vector is
674f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // expanded that new elements are constructed.
675f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<string, 1> v(source_v.begin(), source_v.end());
676f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ("cat", v[0]);
677f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ("dog", v[1]);
678f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
679f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
680f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, SimpleTypeWithInlineBacking) {
681422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  auto vec = tensorflow::gtl::InlinedVector<int, 3>{4, 5, 6};
682f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(3, vec.size());
683422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(3, vec.capacity());
684f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(4, vec[0]);
685f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(5, vec[1]);
686f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(6, vec[2]);
687f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
688f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
689f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, SimpleTypeWithReallocationRequired) {
690f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  auto vec = tensorflow::gtl::InlinedVector<int, 2>{4, 5, 6};
691f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(3, vec.size());
692f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_LE(3, vec.capacity());
693f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(4, vec[0]);
694f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(5, vec[1]);
695f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(6, vec[2]);
696f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
697f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
698f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, DisparateTypesInList) {
699f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ((std::vector<int>{-7, 8}),
700f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur            Vec(tensorflow::gtl::InlinedVector<int, 2>{-7, 8ULL}));
701f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
702f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(
703f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      (std::vector<string>{"foo", "bar"}),
704f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      Vec(tensorflow::gtl::InlinedVector<string, 2>{"foo", string("bar")}));
705f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
706f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
707f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, ComplexTypeWithInlineBacking) {
708422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  tensorflow::gtl::InlinedVector<Instance, 1> empty;
709f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  auto vec = tensorflow::gtl::InlinedVector<Instance, 1>{Instance(0)};
710f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(1, vec.size());
711422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(empty.capacity(), vec.capacity());
712f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(0, vec[0].value_);
713f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
714f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
715f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, ComplexTypeWithReallocationRequired) {
716f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  auto vec =
717f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      tensorflow::gtl::InlinedVector<Instance, 1>{Instance(0), Instance(1)};
718f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(2, vec.size());
719f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_LE(2, vec.capacity());
720f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(0, vec[0].value_);
721f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(1, vec[1].value_);
722f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
723f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
724f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(DynamicVec, DynamicVecCompiles) {
725f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  DynamicVec v;
726f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  (void)v;
727f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
728f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
729f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_InlinedVectorFill(int iters, int len) {
730f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < iters; i++) {
731f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
732f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int j = 0; j < len; j++) {
733f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.push_back(j);
734f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
735f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
736f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  testing::BytesProcessed((static_cast<int64>(iters) * len) * sizeof(int));
737f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
738f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_InlinedVectorFill)->Range(0, 1024);
739f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
740f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_InlinedVectorFillRange(int iters, int len) {
741f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::unique_ptr<int[]> ia(new int[len]);
742f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int j = 0; j < len; j++) {
743f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ia[j] = j;
744f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
745f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < iters; i++) {
746f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec TF_ATTRIBUTE_UNUSED v(ia.get(), ia.get() + len);
747f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
748f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  testing::BytesProcessed((static_cast<int64>(iters) * len) * sizeof(int));
749f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
750f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_InlinedVectorFillRange)->Range(0, 1024);
751f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
752f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_StdVectorFill(int iters, int len) {
753f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < iters; i++) {
754f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    std::vector<int> v;
755f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int j = 0; j < len; j++) {
756f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.push_back(j);
757f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
758f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
759f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  testing::BytesProcessed((static_cast<int64>(iters) * len) * sizeof(int));
760f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
761f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_StdVectorFill)->Range(0, 1024);
762f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
763f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace {
764f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct Buffer {  // some arbitrary structure for benchmarking.
765f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  char* base;
766f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  int length;
767f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  int capacity;
768f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  void* user_data;
769f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
770f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}  // anonymous namespace
771f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
772f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_InlinedVectorTenAssignments(int iters, int len) {
773f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  typedef tensorflow::gtl::InlinedVector<Buffer, 2> BufferVec;
774f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
775f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  BufferVec src;
776f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  src.resize(len);
777f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
778f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  iters *= 10;
779f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  BufferVec dst;
780f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < iters; i++) {
781f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    dst = src;
782f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
783f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
784f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_InlinedVectorTenAssignments)
785f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(0)
786f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(1)
787f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(2)
788f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(3)
789f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(4)
790f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(20);
791f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
792f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_CreateFromInitializerList(int iters) {
793f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (; iters > 0; iters--) {
794f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    tensorflow::gtl::InlinedVector<int, 4> x{1, 2, 3};
795f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    (void)x[0];
796f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
797f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
798f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_CreateFromInitializerList);
799f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
800f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace {
801f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
802f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct LargeSwappable {
803f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  LargeSwappable() : d_(1024, 17) {}
804f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  ~LargeSwappable() {}
805f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  LargeSwappable(const LargeSwappable& o) : d_(o.d_) {}
806f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
807f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  friend void swap(LargeSwappable& a, LargeSwappable& b) {
808f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    using std::swap;
809f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(a.d_, b.d_);
810f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
811f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
812f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  LargeSwappable& operator=(LargeSwappable o) {
813f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    using std::swap;
814f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(*this, o);
815f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    return *this;
816f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
817f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
818f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::vector<int> d_;
819f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
820f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
821f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}  // namespace
822f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
823f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_LargeSwappableElements(int iters, int len) {
824f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  typedef tensorflow::gtl::InlinedVector<LargeSwappable, 32> Vec;
825f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  Vec a(len);
826f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  Vec b;
827f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  while (--iters >= 0) {
828f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    using std::swap;
829f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(a, b);
830f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
831f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
832f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_LargeSwappableElements)->Range(0, 1024);
833f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
834f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}  // namespace tensorflow
835