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