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