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/array_slice.h" 17f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 18f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <algorithm> 19f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <array> 20f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <string> 21f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <vector> 22f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 23f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/lib/gtl/inlined_vector.h" 24f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/lib/gtl/stl_util.h" 253ffa307e49e5b150934a71386194d7ed621e3e98Josh Levenberg#include "tensorflow/core/platform/macros.h" 26c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg#include "tensorflow/core/platform/test.h" 275a24d3a2514698b0ae11563b2ea21e368de48a4fJosh Levenberg#include "tensorflow/core/platform/types.h" 28f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 29f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace tensorflow { 30f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace gtl { 31f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace { 32f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 33f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtypedef ArraySlice<int> IntSlice; 34f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtypedef ArraySlice<char> CharSlice; 35f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtypedef MutableArraySlice<int> MutableIntSlice; 36f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtypedef MutableArraySlice<char> MutableCharSlice; 37f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtypedef std::vector<int> IntVec; 38f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 39f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// Append 0..len-1 to *v 40f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtemplate <typename Vector> 41f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void Fill(Vector* v, int len, int offset = 0) { 42f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < len; i++) { 43f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v->push_back(i + offset); 44f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 45f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 46f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 47f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void TestHelper(const IntSlice& vorig, const IntVec& vec) { 48f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice other; // To test the assignment return value. 49f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v = other = vorig; 50f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const int len = vec.size(); 51f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(v.size(), vec.size()); 52f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 53f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < len; i++) { 54f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(v[i], vec[i]); 55f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(v.at(i), vec[i]); 56f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 57f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(v.begin(), gtl::vector_as_array(&vec)); 58f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 59f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int counter = 0; 60f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (IntSlice::iterator it = v.begin(); it != v.end(); ++it) { 61f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(counter, *it); 62f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur counter++; 63f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 64f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(counter, len); 65f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 66f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur counter = 0; 67f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (IntSlice::const_iterator it = v.begin(); it != v.end(); ++it) { 68f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(counter, *it); 69f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur counter++; 70f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 71f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(counter, len); 72f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 73f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (len > 0) { 74f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(0, v.front()); 75f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(len - 1, v.back()); 76f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v.pop_back(); 77f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(len - 1, v.size()); 78f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t i = 0; i < v.size(); ++i) { 79f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(i, v[i]); 80f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 81f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (len > 1) { 82f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v.pop_front(); 83f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(len - 2, v.size()); 84f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t i = 0; i < v.size(); ++i) { 85f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(i + 1, v[i]); 86f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 87f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 88f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 89f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 90f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 91f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// The element access test that is applicable both when MutableArraySlice is 92f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// const and when it's not. 93f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtemplate <class V> 94f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurvoid MutableTestHelperTemplated(V v, int* ptr, const int len) { 95f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CHECK_EQ(v.size(), len); 96f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 97f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < len; i++) { 98f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr + i, &v[i]); 99f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr + i, &v.at(i)); 100f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 101f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr, v.begin()); 102f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr + len, v.end()); 103f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr, v.data()); 104f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 105f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int counter = 0; 106f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (MutableIntSlice::const_iterator it = v.begin(); it != v.end(); ++it) { 107f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr + counter, &*it); 108f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur counter++; 109f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 110f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(counter, len); 111f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 112f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(len, std::distance(v.rbegin(), v.rend())); 113f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 114f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (len > 0) { 115f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr, &v.front()); 116f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr + len - 1, &v.back()); 117f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr + len - 1, &*v.rbegin()); 118f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr, &*(v.rend() - 1)); 119f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 120f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 121f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 122f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void MutableTestHelper(const MutableIntSlice& vorig, int* ptr, 123f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const int len) { 124f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Test the data accessors both when the MutableArraySlice is declared const, 125f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // and when it is not. 126f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableTestHelperTemplated<const MutableIntSlice&>(vorig, ptr, len); 127f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableTestHelperTemplated<MutableIntSlice>(vorig, ptr, len); 128f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 129f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice other; // To test the assignment return value. 130f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice v = other = vorig; 131f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr, v.mutable_data()); 132f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 133f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int counter = 0; 134f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (MutableIntSlice::iterator it = v.begin(); it != v.end(); ++it) { 135f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr + counter, &*it); 136f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur counter++; 137f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 138f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(counter, len); 139f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 140f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (len > 0) { 141f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Test that elements are assignable. 142f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v[0] = 1; 143f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v.front() = 2; 144f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v.back() = 5; 145f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur *v.mutable_data() = 4; 146f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::fill(v.begin(), v.end(), 5); 147f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::fill(v.rbegin(), v.rend(), 6); 148f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Test size-changing methods. 149f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v.pop_back(); 150f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(len - 1, v.size()); 151f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t i = 0; i < v.size(); ++i) { 152f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr + i, &v[i]); 153f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 154f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (len > 1) { 155f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v.pop_front(); 156f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(len - 2, v.size()); 157f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t i = 0; i < v.size(); ++i) { 158f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(ptr + i + 1, &v[i]); 159f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 160f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 161f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 162f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 163f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 164f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtemplate <typename Vector> 165f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void TestImplicitConversion(const IntSlice& v, const Vector& vec) { 166f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(v.size(), vec.size()); 167f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t i = 0; i < v.size(); i++) { 168f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(v[i], vec[i]); 169f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 170f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 171f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 172f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtemplate <typename Vector> 173f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void TestImplicitConversion(const CharSlice& v, const Vector& vec) { 174f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(IntVec(v.begin(), v.end()), vec); 175f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 176f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 177f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void TestImplicitConversion(const MutableIntSlice& v, const int* data, 178f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int size) { 179f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(size, v.size()); 180f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t i = 0; i < v.size(); i++) { 181f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(data + i, &v[i]); 182f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 183f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 184f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 185f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic void TestImplicitConversion(const MutableCharSlice& v, const char* data, 186f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int size) { 187f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(size, v.size()); 188f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t i = 0; i < v.size(); i++) { 189f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(data + i, &v[i]); 190f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 191f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 192f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// A struct supplying the data(), mutable_data() and size() methods, just like 193f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// e.g. proto2::RepeatedField. 194f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct RepeatedField { 195f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::vector<int> storage; 196f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const int* data() const { return storage.data(); } 197f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int* mutable_data() { return storage.data(); } 198f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int size() const { return storage.size(); } 199f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}; 200f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 201f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// A struct supplying the data() (both mutable and const versions) and 202f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// size(). It also supplies mutable_data() but we test that data() is selected 203f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// instead. 204f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct ContainerWithOverloads { 205f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::vector<int> storage; 206f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::vector<int> wrong_storage; 207f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const int* data() const { return storage.data(); } 208f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int* data() { return storage.data(); } 209f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // MutableArraySlice should not call mutable_data(), preferring data() 210f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // instead. 211f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int* mutable_data() { return wrong_storage.data(); } 212f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int size() const { return storage.size(); } 213f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}; 214f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 215f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// A struct supplying data() and size() methods. 216f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstruct ContainerWithShallowConstData { 217f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::vector<int> storage; 218f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int* data() const { return const_cast<int*>(storage.data()); } 219f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int size() const { return storage.size(); } 220f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}; 221f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 222f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, Simple) { 223f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int len = 0; len < 20; len++) { 224f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 225f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, len); 226f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestHelper(IntSlice(vec), vec); 227f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestHelper(IntSlice(vec.data(), vec.size()), vec); 228f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 229f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 230f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 231f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, WithPosAndLen) { 232f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 233f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, 20); 234f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t len = 0; len < vec.size(); len++) { 235f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec subvec(vec.begin(), vec.begin() + len); 236f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(IntSlice(vec, 0, len), subvec); 237f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(IntSlice(IntSlice(vec), 0, len), subvec); 238f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 239f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(0, IntSlice(vec, 0, 0).size()); 240f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(0, IntSlice(IntSlice(vec), 0, 0).size()); 241f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(IntSlice(vec, 0, IntSlice::npos), vec); 242f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 243f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 244f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, Clear) { 245f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int len = 0; len < 20; len++) { 246f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 247f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, len); 248f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v(vec); 249f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v.clear(); 250f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(0, v.size()); 251f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(v.begin(), v.end()); 252f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 253f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 254f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 255f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, Swap) { 256f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int l1 = 0; l1 < 20; l1++) { 257f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int l2 = 0; l2 < 20; l2++) { 258f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec avec, bvec; 259f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&avec, l1); 260f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&bvec, l2, 100); 261f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice a(avec), b(bvec); 262f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur using std::swap; 263f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur swap(a, b); 264f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(l1, b.size()); 265f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(l2, a.size()); 266f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < l1; i++) { 267f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(i, b[i]); 268f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 269f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < l2; i++) { 270f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(100 + i, a[i]); 271f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 272f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 273f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 274f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 275f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 276f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, ImplicitConversion) { 277f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int len = 0; len < 20; len++) { 278f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 279f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, len); 280f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice slice; 281f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur slice = vec; 282f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(vec, vec); 283f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(slice, vec); 284f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(IntSlice(vec.data(), vec.size()), vec); 285f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 286f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 287f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 288f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, InlinedVectorConversion) { 289f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int len = 0; len < 20; len++) { 290f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur InlinedVector<int, 4> inline_vec; 291f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < len; i++) { 292f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur inline_vec.push_back(i); 293f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 294f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 295f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, len); 296f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v = inline_vec; // Test assignment 297f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 298f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(inline_vec, vec); 299f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 300f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 301f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 302f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, StaticArrayConversion) { 303f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int array[20]; 304f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 305f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, TF_ARRAYSIZE(array)); 306f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::copy(vec.begin(), vec.end(), array); 307f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v = array; // Test assignment 308f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 309f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(array, vec); 310f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 311f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 312f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, StdArrayConversion) { 313f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::array<int, 20> array; 314f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 315f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, array.size()); 316f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::copy(vec.begin(), vec.end(), array.begin()); 317f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 318f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Check assignment. 319f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur { 320f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v = array; 321f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 322f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 323f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 324f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Check sub-slice initialization. 325f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur { 326f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v = {array, 10, 15}; 327f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 328f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 329f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 330f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(array, vec); 331f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 332f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 333f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// Values according to the Fill function. 334f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurstatic const int test_const_array[] = {0, 1, 2}; 335f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 336f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, ConstStaticArrayConversion) { 337f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 338f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, TF_ARRAYSIZE(test_const_array)); 339f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v = test_const_array; // Test assignment 340f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 341f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(test_const_array, vec); 342f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 343f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 344f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, RepeatedFieldConversion) { 345f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur RepeatedField repeated_field; 346f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 347f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, 20); 348f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur repeated_field.storage = vec; 349f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v = repeated_field; // Test assignment 350f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 351f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(repeated_field, vec); 352f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 353f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 354f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, ContainerWithOverloadsConversion) { 355f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ContainerWithOverloads container; 356f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&container.storage, 20); 357f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur container.wrong_storage.resize(container.size()); 358f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v = container; // Test assignment 359f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 360f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(container, container.storage); 361f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 362f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 363f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, ContainerWithShallowConstDataConversion) { 364f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ContainerWithShallowConstData container; 365f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&container.storage, 20); 366f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice v = container; // Test assignment 367f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 368f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(container, container.storage); 369f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 370f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 371f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, MutableIntSliceConversion) { 372f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec(20); 373f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice slice = MutableIntSlice(&vec); 374f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(vec.size(), slice.size()); 375f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(vec.data(), slice.data()); 376f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 377f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 378f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, Equality) { 379f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec1(20); 380f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec2(20); 381f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // These two slices are from different vectors, but have the same 382f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // size and have the same elements (right now). They should 383f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // compare equal. 384f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const IntSlice from1(vec1); 385f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const IntSlice from2(vec2); 386f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(from1, from1); 387f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(from1, from2); 388f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 389f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // This verifies that MutableArraySlices can be compared freely with 390f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // ArraySlices. 391f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const MutableIntSlice mutable_from1(&vec1); 392f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const MutableIntSlice mutable_from2(&vec2); 393f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(from1, mutable_from1); 394f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(mutable_from1, from1); 395f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(mutable_from1, mutable_from2); 396f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(mutable_from2, mutable_from1); 397f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 398f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // With a different size, the array slices should not be equal. 399f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_NE(from1, IntSlice(from1, 0, from1.size() - 1)); 400f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 401f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // With different contents, the array slices should not be equal. 402f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ++vec2.back(); 403f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_NE(from1, from2); 404f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 405f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 406f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// Compile-asserts that the argument has the expected type. 407f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurtemplate <typename Expected, typename T> 408f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurvoid CheckType(const T& value) { 409c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg ::testing::StaticAssertTypeEq<Expected, T>(); 410f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 411f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 412f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, ExposesContainerTypesAndConsts) { 413f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntSlice slice; 414f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const IntSlice const_slice; 415f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CheckType<IntSlice::iterator>(slice.begin()); 416f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CheckType<IntSlice::const_iterator>(const_slice.end()); 417f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CheckType<IntSlice::const_reverse_iterator>(const_slice.rbegin()); 418f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CheckType<IntSlice::reverse_iterator>(slice.rend()); 419c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg ::testing::StaticAssertTypeEq<int, IntSlice::value_type>(); 420c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg ::testing::StaticAssertTypeEq<const int*, IntSlice::pointer>(); 421c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg ::testing::StaticAssertTypeEq<const int&, IntSlice::const_reference>(); 422f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(static_cast<IntSlice::size_type>(-1), IntSlice::npos); 423f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 424f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 425f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurvoid TestEmpty(IntSlice slice) { ASSERT_TRUE(slice.empty()); } 426f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 427f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurvoid TestRange(IntSlice slice, int from, int to) { 428f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ASSERT_EQ(to - from + 1, slice.size()); 429f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t i = 0; i < slice.size(); ++i) { 430f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(from + i, slice[i]); 431f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 432f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 433f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 434f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntSlice, InitializerListConversion) { 435f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestEmpty({}); 436f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestRange({1}, 1, 1); 437f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestRange({10, 11, 12, 13}, 10, 13); 438f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 439f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 440f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(CharSlice, StringConversion) { 441f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec; 442f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&vec, 20); 443f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur string str(vec.begin(), vec.end()); 444f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CharSlice v = str; // Test assignment 445f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 446f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(str, vec); 447f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 448f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 449f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(IntPtrSlice, ConstConversion) { 450f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int one = 1; 451f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int two = 2; 452f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::vector<int*> vec; 453f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur vec.push_back(&one); 454f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur vec.push_back(&two); 455f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ArraySlice<const int*> v = vec; 456f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ASSERT_EQ(2, v.size()); 457f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(&one, v[0]); 458f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(&two, v[1]); 459f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 460f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 461f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, Simple) { 462f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int len = 0; len < 20; len++) { 463f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec(len); 464f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableTestHelper(MutableIntSlice(&vec), vec.data(), len); 465f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableTestHelper(MutableIntSlice(vec.data(), vec.size()), vec.data(), len); 466f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 467f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 468f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 469f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, WithPosAndLen) { 470f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec(20); 471f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (size_t len = 0; len < vec.size(); len++) { 472f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(MutableIntSlice(&vec, 0, len), vec.data(), len); 473f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(MutableIntSlice(MutableIntSlice(&vec), 0, len), 474f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur vec.data(), len); 475f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 476f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(0, MutableIntSlice(&vec, 0, 0).size()); 477f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(0, MutableIntSlice(MutableIntSlice(&vec), 0, 0).size()); 478f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(MutableIntSlice(&vec, 0, MutableIntSlice::npos), 479f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur vec.data(), vec.size()); 480f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 481f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 482f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, Clear) { 483f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int len = 0; len < 20; len++) { 484f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec(len); 485f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice v(&vec); 486f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur v.clear(); 487f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(0, v.size()); 488f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(v.begin(), v.end()); 489f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 490f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 491f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 492f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, Swap) { 493f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int l1 = 0; l1 < 20; l1++) { 494f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int l2 = 0; l2 < 20; l2++) { 495f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec avec(l1), bvec(l2); 496f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice a(&avec), b(&bvec); 497f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur using std::swap; 498f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur swap(a, b); 499f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(l1, b.size()); 500f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(l2, a.size()); 501f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < l1; i++) { 502f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(&avec[i], &b[i]); 503f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 504f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < l2; i++) { 505f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(&bvec[i], &a[i]); 506f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 507f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 508f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 509f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 510f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 511f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, ImplicitConversion) { 512f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int len = 0; len < 20; len++) { 513f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IntVec vec(len); 514f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice slice; 515f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur slice = &vec; 516f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(&vec, vec.data(), len); 517f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(slice, vec.data(), len); 518f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(MutableIntSlice(vec.data(), vec.size()), vec.data(), 519f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur len); 520f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 521f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 522f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 523f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, InlinedVectorConversion) { 524f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int len = 0; len < 20; len++) { 525f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur InlinedVector<int, 4> inline_vec; 526f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < len; i++) { 527f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur inline_vec.push_back(i); 528f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 529f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice v = &inline_vec; // Test assignment 530f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 531422f4492dd93af9b09fb0b27c57c65467c30f798A. Unique TensorFlower TestImplicitConversion(&inline_vec, inline_vec.data(), inline_vec.size()); 532f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 533f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 534f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 535f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, StaticArrayConversion) { 536f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int array[20]; 537f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice v = array; // Test assignment 538f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 539f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(array, array, TF_ARRAYSIZE(array)); 540f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 541f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 542f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, StdArrayConversion) { 543f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::array<int, 20> array; 544f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 545f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Check assignment. 546f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur { 547f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice v = &array; 548f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 549f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 550f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 551f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Check sub-slice initialization. 552f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur { 553f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice v = {&array, 10, 15}; 554f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 555f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 556f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 557f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(&array, &array[0], array.size()); 558f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 559f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 560f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, RepeatedFieldConversion) { 561f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur RepeatedField repeated_field; 562f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&repeated_field.storage, 20); 563f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice v = &repeated_field; // Test assignment 564f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 565f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(&repeated_field, repeated_field.storage.data(), 566f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur repeated_field.storage.size()); 567f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 568f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 569f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, ContainerWithOverloadsConversion) { 570f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ContainerWithOverloads container; 571f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&container.storage, 20); 572f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur container.wrong_storage.resize(container.size()); 573f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice v = &container; // Test assignment 574f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 575f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(&container, container.storage.data(), 576f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur container.storage.size()); 577f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 578f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 579f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, ContainerWithShallowConstDataConversion) { 580f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ContainerWithShallowConstData container; 581f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Fill(&container.storage, 20); 582f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice v = &container; // Test assignment 583f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 584f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(&container, container.storage.data(), 585f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur container.storage.size()); 586f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 587f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 588f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, TypedefsAndConstants) { 589c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg ::testing::StaticAssertTypeEq<int, MutableIntSlice::value_type>(); 590c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg ::testing::StaticAssertTypeEq<int*, MutableIntSlice::pointer>(); 591c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg ::testing::StaticAssertTypeEq<const int*, MutableIntSlice::const_pointer>(); 592c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg ::testing::StaticAssertTypeEq<int&, MutableIntSlice::reference>(); 593c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg ::testing::StaticAssertTypeEq<const int&, MutableIntSlice::const_reference>(); 594f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 595f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(static_cast<MutableIntSlice::size_type>(-1), MutableIntSlice::npos); 596f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 597f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 598f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, IteratorsAndReferences) { 599f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto accept_pointer = [](int* x) {}; 600f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto accept_reference = [](int& x) {}; 601f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto accept_iterator = [](MutableIntSlice::iterator x) {}; 602f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto accept_reverse_iterator = [](MutableIntSlice::reverse_iterator x) {}; 603f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 604f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int a[1]; 605f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableIntSlice s = a; 606f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 607f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_pointer(s.data()); 608f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_pointer(s.mutable_data()); 609f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_iterator(s.begin()); 610f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_iterator(s.end()); 611f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reverse_iterator(s.rbegin()); 612f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reverse_iterator(s.rend()); 613f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 614f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reference(s[0]); 615f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reference(s.at(0)); 616f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reference(s.front()); 617f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reference(s.back()); 618f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 619f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 620f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableIntSlice, IteratorsAndReferences_Const) { 621f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto accept_pointer = [](int* x) {}; 622f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto accept_reference = [](int& x) {}; 623f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto accept_iterator = [](MutableIntSlice::iterator x) {}; 624f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto accept_reverse_iterator = [](MutableIntSlice::reverse_iterator x) {}; 625f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 626f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int a[1]; 627f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const MutableIntSlice s = a; 628f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 629f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_pointer(s.data()); 630f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_pointer(s.mutable_data()); 631f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_iterator(s.begin()); 632f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_iterator(s.end()); 633f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reverse_iterator(s.rbegin()); 634f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reverse_iterator(s.rend()); 635f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 636f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reference(s[0]); 637f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reference(s.at(0)); 638f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reference(s.front()); 639f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur accept_reference(s.back()); 640f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 641f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 642f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurbool TestMutableOverload(MutableIntSlice slice) { return false; } 643f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 644f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurbool TestMutableOverload(MutableCharSlice slice) { return true; } 645f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 646f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST(MutableCharSlice, StringConversion) { 647f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int len = 0; len < 20; len++) { 648f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur string str(len, '\0'); 649f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur MutableCharSlice v = &str; // Test assignment 650f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static_cast<void>(v); 651f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TestImplicitConversion(v, str.data(), str.size()); 652f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 653f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Verify that only the correct overload is feasible. Note that this would 654f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // fail if the string ctor was declared simply as MutableArraySlice(string*), 655f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // since in that case both overloads would be feasible. 656f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur string str; 657f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_TRUE(TestMutableOverload(&str)); 6587be94c2f2987db1d45a0d90f56865b0b6a2c93e0Josh Levenberg 6597be94c2f2987db1d45a0d90f56865b0b6a2c93e0Josh Levenberg // Avoid warning "unused function 'TestMutableOverload'" 6607be94c2f2987db1d45a0d90f56865b0b6a2c93e0Josh Levenberg int a[1]; 6617be94c2f2987db1d45a0d90f56865b0b6a2c93e0Josh Levenberg EXPECT_FALSE(TestMutableOverload(a)); 662f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 663f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 664f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} // namespace 665f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} // namespace gtl 666f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} // namespace tensorflow 667