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