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();
68d83074847ebfe8871188f1f9f1e84ab0451f59e6A. Unique TensorFlower    count_ = nullptr;
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 {
84d83074847ebfe8871188f1f9f1e84ab0451f59e6A. Unique TensorFlower    CHECK(count_ != nullptr);
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 {
2394e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  explicit NoDefaultCtor(int) {}
240f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
241f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct NoCopy {
242f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  NoCopy() {}
2434e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  NoCopy(const NoCopy&) = delete;
244f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
245f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct NoAssign {
246f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  NoAssign() {}
2474e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  NoAssign& operator=(const NoAssign&) = delete;
2484e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower};
2494e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlowerstruct MoveOnly {
2504e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  MoveOnly() {}
2514e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  MoveOnly(MoveOnly&&) = default;
2524e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  MoveOnly& operator=(MoveOnly&&) = default;
253f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
254f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InlinedVectorTest, NoDefaultCtor) {
255f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<NoDefaultCtor, 1> v(10, NoDefaultCtor(2));
256f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  (void)v;
257f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
258f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InlinedVectorTest, NoCopy) {
259f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<NoCopy, 1> v(10);
260f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  (void)v;
261f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
262f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InlinedVectorTest, NoAssign) {
263f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<NoAssign, 1> v(10);
264f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  (void)v;
265f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
2664e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlowerTEST(InlinedVectorTest, MoveOnly) {
2674e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  gtl::InlinedVector<MoveOnly, 2> v;
2684e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  v.push_back(MoveOnly{});
2694e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  v.push_back(MoveOnly{});
2704e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  v.push_back(MoveOnly{});
2714e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower}
272f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
273f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Insert) {
274f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
275f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int pos = 0; pos <= len; pos++) {
276f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      IntVec v;
277f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      Fill(&v, len);
278f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.insert(v.begin() + pos, 9999);
279f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(v.size(), len + 1);
280f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < pos; i++) {
281f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(v[i], i);
282f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
283f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(v[pos], 9999);
284f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (size_t i = pos + 1; i < v.size(); i++) {
285f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(v[i], i - 1);
286f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
287f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
288f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
289f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
290f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
291f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(RefCountedVec, InsertConstructorDestructor) {
292f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Make sure the proper construction/destruction happen during insert
293f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // operations.
294f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
295f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    SCOPED_TRACE(len);
296f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int pos = 0; pos <= len; pos++) {
297f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      SCOPED_TRACE(pos);
298f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      std::vector<int> counts(len, 0);
2991445e8054c65b776f63d43833da30dc3debdbc31A. Unique TensorFlower      int inserted_count = 0;
300f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      RefCountedVec v;
301f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < len; ++i) {
302f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        SCOPED_TRACE(i);
303f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        v.push_back(RefCounted(i, &counts[i]));
304f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
305f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
306f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (auto elem : counts) {
307f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(1, elem);
308f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
309f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
310f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      RefCounted insert_element(9999, &inserted_count);
311f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(1, inserted_count);
312f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.insert(v.begin() + pos, insert_element);
313f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(2, inserted_count);
314f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      // Check that the elements at the end are preserved.
315f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (auto elem : counts) {
316f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(1, elem);
317f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
318f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(2, inserted_count);
319f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
320f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
321f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
322f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
323f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Resize) {
324f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
325f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
326f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Fill(&v, len);
327f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
328f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // Try resizing up and down by k elements
329f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    static const int kResizeElem = 1000000;
330f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int k = 0; k < 10; k++) {
331f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      // Enlarging resize
332f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.resize(len + k, kResizeElem);
333f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(len + k, v.size());
334f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_LE(len + k, v.capacity());
335f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < len + k; i++) {
336f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        if (i < len) {
337f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          EXPECT_EQ(i, v[i]);
338f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        } else {
339f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur          EXPECT_EQ(kResizeElem, v[i]);
340f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        }
341f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
342f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
343f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      // Shrinking resize
344f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.resize(len, kResizeElem);
345f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(len, v.size());
346f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_LE(len, v.capacity());
347f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < len; i++) {
348f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(i, v[i]);
349f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
350f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
351f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
352f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
353f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
354f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, InitWithLength) {
355f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
356f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v(len, 7);
357f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(len, v.size());
358f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_LE(len, v.capacity());
359f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int i = 0; i < len; i++) {
360f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(7, v[i]);
361f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
362f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
363f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
364f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
365f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, CopyConstructorAndAssignment) {
366f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
367f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
368f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Fill(&v, len);
369f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(len, v.size());
370f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_LE(len, v.capacity());
371f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
372f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v2(v);
373f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(v, v2);
374f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
375f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int start_len = 0; start_len < 20; start_len++) {
376f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      IntVec v3;
377f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      Fill(&v3, start_len, 99);  // Add dummy elements that should go away
378f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v3 = v;
379f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(v, v3);
380f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
381f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
382f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
383f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
384f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(OverheadTest, Storage) {
385f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Check for size overhead.
386f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  using tensorflow::gtl::InlinedVector;
387422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(int*), sizeof(InlinedVector<int*, 1>));
388422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4 * sizeof(int*), sizeof(InlinedVector<int*, 2>));
389422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4 * sizeof(int*), sizeof(InlinedVector<int*, 3>));
390422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(6 * sizeof(int*), sizeof(InlinedVector<int*, 4>));
391422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower
392422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(char*), sizeof(InlinedVector<char, 1>));
393422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(char*), sizeof(InlinedVector<char, 2>));
394422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(char*), sizeof(InlinedVector<char, 3>));
395422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2 * sizeof(char*),
396422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower            sizeof(InlinedVector<char, 2 * sizeof(char*) - 1>));
397422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4 * sizeof(char*), sizeof(InlinedVector<char, 2 * sizeof(char*)>));
398f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
399f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
400f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Clear) {
401f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
402f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    SCOPED_TRACE(len);
403f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
404f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Fill(&v, len);
405f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.clear();
406f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(0, v.size());
407f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(v.begin(), v.end());
408f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
409f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
410f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
411f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Reserve) {
412f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (size_t len = 0; len < 20; len++) {
413f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
414f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    Fill(&v, len);
415f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
416f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (size_t newlen = 0; newlen < 100; newlen++) {
417422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower      const int* start_rep = v.data();
418f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.reserve(newlen);
419422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower      const int* final_rep = v.data();
420f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      if (newlen <= len) {
421f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(start_rep, final_rep);
422f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
423f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_LE(newlen, v.capacity());
424f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
425f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      // Filling up to newlen should not change rep
426f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      while (v.size() < newlen) {
427f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        v.push_back(0);
428f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
429422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower      EXPECT_EQ(final_rep, v.data());
430f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
431f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
432f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
433f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
434f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtemplate <typename T>
435f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic std::vector<typename T::value_type> Vec(const T& src) {
436f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::vector<typename T::value_type> result;
437f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (const auto& elem : src) {
438f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    result.push_back(elem);
439f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
440f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  return result;
441f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
442f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
443f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, SelfRefPushBack) {
444f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::vector<string> std_v;
445f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<string, 4> v;
4464e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  const string s = "A quite long string to ensure heap.";
447f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std_v.push_back(s);
448f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  v.push_back(s);
449f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < 20; ++i) {
450f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(std_v, Vec(v));
451f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
452f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.push_back(v.back());
453f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    std_v.push_back(std_v.back());
454f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
455f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(std_v, Vec(v));
456f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
457f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
4584e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlowerTEST(IntVec, SelfRefPushBackWithMove) {
4594e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  std::vector<string> std_v;
4604e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  gtl::InlinedVector<string, 4> v;
4614e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  const string s = "A quite long string to ensure heap.";
4624e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  std_v.push_back(s);
4634e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  v.push_back(s);
4644e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  for (int i = 0; i < 20; ++i) {
4654e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower    EXPECT_EQ(v.back(), std_v.back());
4664e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower
4674e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower    v.push_back(std::move(v.back()));
4684e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower    std_v.push_back(std::move(std_v.back()));
4694e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  }
4704e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  EXPECT_EQ(v.back(), std_v.back());
4714e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower}
4724e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower
473f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, Swap) {
474f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int l1 = 0; l1 < 20; l1++) {
475f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    SCOPED_TRACE(l1);
476f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int l2 = 0; l2 < 20; l2++) {
477f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      SCOPED_TRACE(l2);
478f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      IntVec a = Fill(l1, 0);
479f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      IntVec b = Fill(l2, 100);
480f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      {
481f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        using std::swap;
482f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        swap(a, b);
483f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
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        SCOPED_TRACE(i);
488f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(i, b[i]);
489f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
490f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l2; i++) {
491f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        SCOPED_TRACE(i);
492f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(100 + i, a[i]);
493f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
494f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
495f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
496f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
497f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
498f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InstanceVec, Swap) {
499f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int l1 = 0; l1 < 20; l1++) {
500f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int l2 = 0; l2 < 20; l2++) {
501f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      InstanceVec a, b;
502f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l1; i++) a.push_back(Instance(i));
503f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l2; i++) b.push_back(Instance(100 + i));
504f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l1 + l2, instances);
505f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      {
506f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        using std::swap;
507f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        swap(a, b);
508f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
509f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l1 + l2, instances);
510f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l1, b.size());
511f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(l2, a.size());
512f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l1; i++) {
513f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(i, b[i].value_);
514f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
515f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < l2; i++) {
516f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(100 + i, a[i].value_);
517f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
518f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
519f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
520f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
521f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
522f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, EqualAndNotEqual) {
523f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  IntVec a, b;
524f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a == b);
525f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a != b);
526f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
527f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  a.push_back(3);
528f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a == b);
529f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a != b);
530f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
531f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  b.push_back(3);
532f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a == b);
533f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a != b);
534f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
535f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  b.push_back(7);
536f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a == b);
537f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a != b);
538f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
539f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  a.push_back(6);
540f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a == b);
541f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a != b);
542f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
543f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  a.clear();
544f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  b.clear();
545f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < 100; i++) {
546f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    a.push_back(i);
547f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    b.push_back(i);
548f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_TRUE(a == b);
549f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_FALSE(a != b);
550f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
551f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    b[i] = b[i] + 1;
552f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_FALSE(a == b);
553f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_TRUE(a != b);
554f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
555f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    b[i] = b[i] - 1;  // Back to before
556f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_TRUE(a == b);
557f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_FALSE(a != b);
558f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
559f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
560f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
561f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntVec, RelationalOps) {
562f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  IntVec a, b;
563f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a < b);
564f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(b < a);
565f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a > b);
566f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(b > a);
567f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a <= b);
568f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(b <= a);
569f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a >= b);
570f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(b >= a);
571f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  b.push_back(3);
572f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a < b);
573f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(b < a);
574f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a > b);
575f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(b > a);
576f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(a <= b);
577f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(b <= a);
578f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_FALSE(a >= b);
579f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_TRUE(b >= a);
580f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
581f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
582f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InstanceVec, CountConstructorsDestructors) {
583f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  const int start = instances;
584f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
585f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    InstanceVec v;
586f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int i = 0; i < len; i++) {
587f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.push_back(Instance(i));
588f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
589f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len, instances);
590f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
591f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    {  // Copy constructor should create 'len' more instances.
592f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      InstanceVec v_copy(v);
593f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(start + len + len, instances);
594f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
595f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len, instances);
596f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
597f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // Enlarging resize() must construct some objects
598f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.resize(len + 10, Instance(100));
599f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len + 10, instances);
600f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
601f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // Shrinking resize() must destroy some objects
602f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.resize(len, Instance(100));
603f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len, instances);
604f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
605f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // reserve() must not increase the number of initialized objects
606f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    v.reserve(len + 1000);
607f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    EXPECT_EQ(start + len, instances);
608f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
609f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    // pop_back() and erase() must destroy one object
610f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    if (len > 0) {
611f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.pop_back();
612f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(start + len - 1, instances);
613f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      if (!v.empty()) {
614f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        v.erase(v.begin());
615f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(start + len - 2, instances);
616f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
617f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
618f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
619f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(start, instances);
620f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
621f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
622f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InstanceVec, CountConstructorsDestructorsOnAssignment) {
623f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  const int start = instances;
624f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int len = 0; len < 20; len++) {
625f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int longorshort = 0; longorshort <= 1; ++longorshort) {
626f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      InstanceVec longer, shorter;
627f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      for (int i = 0; i < len; i++) {
628f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        longer.push_back(Instance(i));
629f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        shorter.push_back(Instance(i));
630f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
631f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      longer.push_back(Instance(len));
632f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      EXPECT_EQ(start + len + len + 1, instances);
633f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
634f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      if (longorshort) {
635f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        shorter = longer;
636f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(start + (len + 1) + (len + 1), instances);
637f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      } else {
638f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        longer = shorter;
639f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur        EXPECT_EQ(start + len + len, instances);
640f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      }
641f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
642f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
643f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(start, instances);
644f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
645f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
646f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(RangedConstructor, SimpleType) {
647422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  std::vector<int> source_v = {4, 5, 6, 7};
648f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // First try to fit in inline backing
649f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<int, 4> v(source_v.begin(), source_v.end());
650422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  tensorflow::gtl::InlinedVector<int, 4> empty4;
651422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4, v.size());
652422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(empty4.capacity(), v.capacity());  // Must still be inline
653f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(4, v[0]);
654f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(5, v[1]);
655f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(6, v[2]);
656422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(7, v[3]);
657f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
658f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Now, force a re-allocate
659f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<int, 2> realloc_v(source_v.begin(),
660f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur                                                   source_v.end());
661422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  tensorflow::gtl::InlinedVector<int, 2> empty2;
662422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4, realloc_v.size());
663422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_LT(empty2.capacity(), realloc_v.capacity());
664f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(4, realloc_v[0]);
665f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(5, realloc_v[1]);
666f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(6, realloc_v[2]);
667422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(7, realloc_v[3]);
668f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
669f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
670f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(RangedConstructor, ComplexType) {
671f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // We also use a list here to pass a different flavor of iterator (e.g. not
672f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // random-access).
673f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::list<Instance> source_v = {Instance(0)};
674f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
675f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // First try to fit in inline backing
676f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<Instance, 1> v(source_v.begin(),
677f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur                                                source_v.end());
678422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  tensorflow::gtl::InlinedVector<Instance, 1> empty1;
679f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(1, v.size());
680422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(empty1.capacity(), v.capacity());  // Must still be inline
681f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(0, v[0].value_);
682f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
683422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  std::list<Instance> source_v2 = {Instance(0), Instance(1), Instance(2),
684422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower                                   Instance(3)};
685f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Now, force a re-allocate
686f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<Instance, 1> realloc_v(source_v2.begin(),
687f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur                                                        source_v2.end());
688422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(4, realloc_v.size());
689422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_LT(empty1.capacity(), realloc_v.capacity());
690f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(0, realloc_v[0].value_);
691f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(1, realloc_v[1].value_);
692422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(2, realloc_v[2].value_);
693422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(3, realloc_v[3].value_);
694f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
695f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
696f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(RangedConstructor, ElementsAreConstructed) {
697f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::vector<string> source_v = {"cat", "dog"};
698f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
699f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Force expansion and re-allocation of v.  Ensures that when the vector is
700f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // expanded that new elements are constructed.
701f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  tensorflow::gtl::InlinedVector<string, 1> v(source_v.begin(), source_v.end());
702f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ("cat", v[0]);
703f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ("dog", v[1]);
704f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
705f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
706f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, SimpleTypeWithInlineBacking) {
707422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  auto vec = tensorflow::gtl::InlinedVector<int, 3>{4, 5, 6};
708f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(3, vec.size());
709422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(3, vec.capacity());
710f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(4, vec[0]);
711f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(5, vec[1]);
712f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(6, vec[2]);
713f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
714f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
715f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, SimpleTypeWithReallocationRequired) {
716f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  auto vec = tensorflow::gtl::InlinedVector<int, 2>{4, 5, 6};
717f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(3, vec.size());
718f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_LE(3, vec.capacity());
719f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(4, vec[0]);
720f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(5, vec[1]);
721f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(6, vec[2]);
722f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
723f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
724f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, DisparateTypesInList) {
725f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ((std::vector<int>{-7, 8}),
726f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur            Vec(tensorflow::gtl::InlinedVector<int, 2>{-7, 8ULL}));
727f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
728f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(
729f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      (std::vector<string>{"foo", "bar"}),
730f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      Vec(tensorflow::gtl::InlinedVector<string, 2>{"foo", string("bar")}));
731f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
732f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
733f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, ComplexTypeWithInlineBacking) {
734422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  tensorflow::gtl::InlinedVector<Instance, 1> empty;
735f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  auto vec = tensorflow::gtl::InlinedVector<Instance, 1>{Instance(0)};
736f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(1, vec.size());
737422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower  EXPECT_EQ(empty.capacity(), vec.capacity());
738f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(0, vec[0].value_);
739f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
740f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
741f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(InitializerListConstructor, ComplexTypeWithReallocationRequired) {
742f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  auto vec =
743f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      tensorflow::gtl::InlinedVector<Instance, 1>{Instance(0), Instance(1)};
744f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(2, vec.size());
745f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_LE(2, vec.capacity());
746f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(0, vec[0].value_);
747f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  EXPECT_EQ(1, vec[1].value_);
748f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
749f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
750f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(DynamicVec, DynamicVecCompiles) {
751f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  DynamicVec v;
752f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  (void)v;
753f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
754f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
755f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_InlinedVectorFill(int iters, int len) {
756f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < iters; i++) {
757f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec v;
758f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int j = 0; j < len; j++) {
759f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.push_back(j);
760f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
761f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
7624e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  testing::BytesProcessed((int64{iters} * len) * sizeof(int));
763f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
764f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_InlinedVectorFill)->Range(0, 1024);
765f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
766f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_InlinedVectorFillRange(int iters, int len) {
767f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::unique_ptr<int[]> ia(new int[len]);
768f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int j = 0; j < len; j++) {
769f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ia[j] = j;
770f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
771f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < iters; i++) {
772f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    IntVec TF_ATTRIBUTE_UNUSED v(ia.get(), ia.get() + len);
773f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
7744e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  testing::BytesProcessed((int64{iters} * len) * sizeof(int));
775f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
776f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_InlinedVectorFillRange)->Range(0, 1024);
777f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
778f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_StdVectorFill(int iters, int len) {
779f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < iters; i++) {
780f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    std::vector<int> v;
781eb10a4c494d95e7c17ddc44ef35197d08f2f6b33A. Unique TensorFlower    v.reserve(len);
782f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    for (int j = 0; j < len; j++) {
783f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur      v.push_back(j);
784f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    }
785f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
7864e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  testing::BytesProcessed((int64{iters} * len) * sizeof(int));
787f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
788f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_StdVectorFill)->Range(0, 1024);
789f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
7904e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlowerbool StringRepresentedInline(string s) {
7914e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  const char* chars = s.data();
7924e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  string s1 = std::move(s);
7934e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  return s1.data() != chars;
7944e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower}
7954e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower
7964e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlowerstatic void BM_InlinedVectorFillString(int iters, int len) {
7974e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  string strings[4] = {"a quite long string", "another long string",
7984e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower                       "012345678901234567", "to cause allocation"};
7994e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  for (int i = 0; i < iters; i++) {
8004e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower    gtl::InlinedVector<string, 8> v;
8014e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower    for (int j = 0; j < len; j++) {
8024e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower      v.push_back(strings[j & 3]);
8034e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower    }
8044e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  }
8054e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  testing::ItemsProcessed(int64{iters} * len);
8064e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower}
8074e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlowerBENCHMARK(BM_InlinedVectorFillString)->Range(0, 1024);
8084e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower
8094e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlowerstatic void BM_StdVectorFillString(int iters, int len) {
8104e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  string strings[4] = {"a quite long string", "another long string",
8114e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower                       "012345678901234567", "to cause allocation"};
8124e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  for (int i = 0; i < iters; i++) {
8134e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower    std::vector<string> v;
814eb10a4c494d95e7c17ddc44ef35197d08f2f6b33A. Unique TensorFlower    v.reserve(len);
8154e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower    for (int j = 0; j < len; j++) {
8164e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower      v.push_back(strings[j & 3]);
8174e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower    }
8184e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  }
8194e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  testing::ItemsProcessed(int64{iters} * len);
8204e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  // The purpose of the benchmark is to verify that inlined vector is
82153cb26d05a5c2080d8022124178b1cc43a30ffe5A. Unique TensorFlower  // efficient when moving is more efficient than copying. To do so, we
8224e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  // use strings that are larger than the small string optimization.
8234e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower  CHECK(!StringRepresentedInline(strings[0]));
8244e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower}
8254e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlowerBENCHMARK(BM_StdVectorFillString)->Range(0, 1024);
8264e37b20f629ab00d66adc283b67b2b31cdadfdddA. Unique TensorFlower
827f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace {
828f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct Buffer {  // some arbitrary structure for benchmarking.
829f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  char* base;
830f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  int length;
831f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  int capacity;
832f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  void* user_data;
833f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
834f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}  // anonymous namespace
835f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
836f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_InlinedVectorTenAssignments(int iters, int len) {
837f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  typedef tensorflow::gtl::InlinedVector<Buffer, 2> BufferVec;
838f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
839f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  BufferVec src;
840f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  src.resize(len);
841f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
842f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  iters *= 10;
843f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  BufferVec dst;
844f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (int i = 0; i < iters; i++) {
845f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    dst = src;
846f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
847f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
848f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_InlinedVectorTenAssignments)
849f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(0)
850f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(1)
851f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(2)
852f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(3)
853f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(4)
854f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    ->Arg(20);
855f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
856f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_CreateFromInitializerList(int iters) {
857f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  for (; iters > 0; iters--) {
858f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    tensorflow::gtl::InlinedVector<int, 4> x{1, 2, 3};
859f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    (void)x[0];
860f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
861f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
862f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_CreateFromInitializerList);
863f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
864f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace {
865f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
866f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct LargeSwappable {
867f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  LargeSwappable() : d_(1024, 17) {}
868f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  ~LargeSwappable() {}
869f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  LargeSwappable(const LargeSwappable& o) : d_(o.d_) {}
870f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
871f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  friend void swap(LargeSwappable& a, LargeSwappable& b) {
872f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    using std::swap;
873f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(a.d_, b.d_);
874f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
875f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
876f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  LargeSwappable& operator=(LargeSwappable o) {
877f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    using std::swap;
878f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(*this, o);
879f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    return *this;
880f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
881f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
882f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::vector<int> d_;
883f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
884f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
885f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}  // namespace
886f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
887f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void BM_LargeSwappableElements(int iters, int len) {
888f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  typedef tensorflow::gtl::InlinedVector<LargeSwappable, 32> Vec;
889f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  Vec a(len);
890f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  Vec b;
891f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  while (--iters >= 0) {
892f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    using std::swap;
893f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    swap(a, b);
894f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  }
895f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
896f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurBENCHMARK(BM_LargeSwappableElements)->Range(0, 1024);
897f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
898f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}  // namespace tensorflow
899