xref: /aosp_15_r20/external/abseil-cpp/absl/container/internal/layout_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include "absl/container/internal/layout.h"
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker // We need ::max_align_t because some libstdc++ versions don't provide
18*9356374aSAndroid Build Coastguard Worker // std::max_align_t
19*9356374aSAndroid Build Coastguard Worker #include <stddef.h>
20*9356374aSAndroid Build Coastguard Worker 
21*9356374aSAndroid Build Coastguard Worker #include <cstdint>
22*9356374aSAndroid Build Coastguard Worker #include <cstring>
23*9356374aSAndroid Build Coastguard Worker #include <initializer_list>
24*9356374aSAndroid Build Coastguard Worker #include <memory>
25*9356374aSAndroid Build Coastguard Worker #include <ostream>
26*9356374aSAndroid Build Coastguard Worker #include <string>
27*9356374aSAndroid Build Coastguard Worker #include <tuple>
28*9356374aSAndroid Build Coastguard Worker #include <type_traits>
29*9356374aSAndroid Build Coastguard Worker 
30*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
31*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
32*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
33*9356374aSAndroid Build Coastguard Worker #include "absl/log/check.h"
34*9356374aSAndroid Build Coastguard Worker #include "absl/types/span.h"
35*9356374aSAndroid Build Coastguard Worker #include "absl/utility/utility.h"
36*9356374aSAndroid Build Coastguard Worker 
37*9356374aSAndroid Build Coastguard Worker namespace absl {
38*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
39*9356374aSAndroid Build Coastguard Worker namespace container_internal {
40*9356374aSAndroid Build Coastguard Worker namespace {
41*9356374aSAndroid Build Coastguard Worker 
42*9356374aSAndroid Build Coastguard Worker using ::absl::Span;
43*9356374aSAndroid Build Coastguard Worker using ::testing::ElementsAre;
44*9356374aSAndroid Build Coastguard Worker 
Distance(const void * from,const void * to)45*9356374aSAndroid Build Coastguard Worker size_t Distance(const void* from, const void* to) {
46*9356374aSAndroid Build Coastguard Worker   CHECK_LE(from, to) << "Distance must be non-negative";
47*9356374aSAndroid Build Coastguard Worker   return static_cast<const char*>(to) - static_cast<const char*>(from);
48*9356374aSAndroid Build Coastguard Worker }
49*9356374aSAndroid Build Coastguard Worker 
50*9356374aSAndroid Build Coastguard Worker template <class Expected, class Actual>
Type(Actual val)51*9356374aSAndroid Build Coastguard Worker Expected Type(Actual val) {
52*9356374aSAndroid Build Coastguard Worker   static_assert(std::is_same<Expected, Actual>(), "");
53*9356374aSAndroid Build Coastguard Worker   return val;
54*9356374aSAndroid Build Coastguard Worker }
55*9356374aSAndroid Build Coastguard Worker 
56*9356374aSAndroid Build Coastguard Worker // Helper classes to test different size and alignments.
57*9356374aSAndroid Build Coastguard Worker struct alignas(8) Int128 {
58*9356374aSAndroid Build Coastguard Worker   uint64_t a, b;
operator ==(Int128 lhs,Int128 rhs)59*9356374aSAndroid Build Coastguard Worker   friend bool operator==(Int128 lhs, Int128 rhs) {
60*9356374aSAndroid Build Coastguard Worker     return std::tie(lhs.a, lhs.b) == std::tie(rhs.a, rhs.b);
61*9356374aSAndroid Build Coastguard Worker   }
62*9356374aSAndroid Build Coastguard Worker 
Nameabsl::container_internal::__anonbf23a5d60111::Int12863*9356374aSAndroid Build Coastguard Worker   static std::string Name() {
64*9356374aSAndroid Build Coastguard Worker     return internal_layout::adl_barrier::TypeName<Int128>();
65*9356374aSAndroid Build Coastguard Worker   }
66*9356374aSAndroid Build Coastguard Worker };
67*9356374aSAndroid Build Coastguard Worker 
68*9356374aSAndroid Build Coastguard Worker // int64_t is *not* 8-byte aligned on all platforms!
69*9356374aSAndroid Build Coastguard Worker struct alignas(8) Int64 {
70*9356374aSAndroid Build Coastguard Worker   int64_t a;
operator ==(Int64 lhs,Int64 rhs)71*9356374aSAndroid Build Coastguard Worker   friend bool operator==(Int64 lhs, Int64 rhs) { return lhs.a == rhs.a; }
72*9356374aSAndroid Build Coastguard Worker };
73*9356374aSAndroid Build Coastguard Worker 
74*9356374aSAndroid Build Coastguard Worker // Properties of types that this test relies on.
75*9356374aSAndroid Build Coastguard Worker static_assert(sizeof(int8_t) == 1, "");
76*9356374aSAndroid Build Coastguard Worker static_assert(alignof(int8_t) == 1, "");
77*9356374aSAndroid Build Coastguard Worker static_assert(sizeof(int16_t) == 2, "");
78*9356374aSAndroid Build Coastguard Worker static_assert(alignof(int16_t) == 2, "");
79*9356374aSAndroid Build Coastguard Worker static_assert(sizeof(int32_t) == 4, "");
80*9356374aSAndroid Build Coastguard Worker static_assert(alignof(int32_t) == 4, "");
81*9356374aSAndroid Build Coastguard Worker static_assert(sizeof(Int64) == 8, "");
82*9356374aSAndroid Build Coastguard Worker static_assert(alignof(Int64) == 8, "");
83*9356374aSAndroid Build Coastguard Worker static_assert(sizeof(Int128) == 16, "");
84*9356374aSAndroid Build Coastguard Worker static_assert(alignof(Int128) == 8, "");
85*9356374aSAndroid Build Coastguard Worker 
86*9356374aSAndroid Build Coastguard Worker template <class Expected, class Actual>
SameType()87*9356374aSAndroid Build Coastguard Worker void SameType() {
88*9356374aSAndroid Build Coastguard Worker   static_assert(std::is_same<Expected, Actual>(), "");
89*9356374aSAndroid Build Coastguard Worker }
90*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,ElementType)91*9356374aSAndroid Build Coastguard Worker TEST(Layout, ElementType) {
92*9356374aSAndroid Build Coastguard Worker   {
93*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
94*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, L::ElementType<0>>();
95*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, decltype(L::Partial())::ElementType<0>>();
96*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, decltype(L::Partial(0))::ElementType<0>>();
97*9356374aSAndroid Build Coastguard Worker   }
98*9356374aSAndroid Build Coastguard Worker   {
99*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
100*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, L::ElementType<0>>();
101*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, L::ElementType<1>>();
102*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, decltype(L::Partial())::ElementType<0>>();
103*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, decltype(L::Partial())::ElementType<1>>();
104*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, decltype(L::Partial(0))::ElementType<0>>();
105*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, decltype(L::Partial(0))::ElementType<1>>();
106*9356374aSAndroid Build Coastguard Worker   }
107*9356374aSAndroid Build Coastguard Worker   {
108*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
109*9356374aSAndroid Build Coastguard Worker     SameType<int8_t, L::ElementType<0>>();
110*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, L::ElementType<1>>();
111*9356374aSAndroid Build Coastguard Worker     SameType<Int128, L::ElementType<2>>();
112*9356374aSAndroid Build Coastguard Worker     SameType<int8_t, decltype(L::Partial())::ElementType<0>>();
113*9356374aSAndroid Build Coastguard Worker     SameType<int8_t, decltype(L::Partial(0))::ElementType<0>>();
114*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, decltype(L::Partial(0))::ElementType<1>>();
115*9356374aSAndroid Build Coastguard Worker     SameType<int8_t, decltype(L::Partial(0, 0))::ElementType<0>>();
116*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, decltype(L::Partial(0, 0))::ElementType<1>>();
117*9356374aSAndroid Build Coastguard Worker     SameType<Int128, decltype(L::Partial(0, 0))::ElementType<2>>();
118*9356374aSAndroid Build Coastguard Worker     SameType<int8_t, decltype(L::Partial(0, 0, 0))::ElementType<0>>();
119*9356374aSAndroid Build Coastguard Worker     SameType<int32_t, decltype(L::Partial(0, 0, 0))::ElementType<1>>();
120*9356374aSAndroid Build Coastguard Worker     SameType<Int128, decltype(L::Partial(0, 0, 0))::ElementType<2>>();
121*9356374aSAndroid Build Coastguard Worker   }
122*9356374aSAndroid Build Coastguard Worker }
123*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,ElementTypes)124*9356374aSAndroid Build Coastguard Worker TEST(Layout, ElementTypes) {
125*9356374aSAndroid Build Coastguard Worker   {
126*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
127*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int32_t>, L::ElementTypes>();
128*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int32_t>, decltype(L::Partial())::ElementTypes>();
129*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int32_t>, decltype(L::Partial(0))::ElementTypes>();
130*9356374aSAndroid Build Coastguard Worker   }
131*9356374aSAndroid Build Coastguard Worker   {
132*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
133*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int32_t, int32_t>, L::ElementTypes>();
134*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int32_t, int32_t>,
135*9356374aSAndroid Build Coastguard Worker              decltype(L::Partial())::ElementTypes>();
136*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int32_t, int32_t>,
137*9356374aSAndroid Build Coastguard Worker              decltype(L::Partial(0))::ElementTypes>();
138*9356374aSAndroid Build Coastguard Worker   }
139*9356374aSAndroid Build Coastguard Worker   {
140*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
141*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int8_t, int32_t, Int128>, L::ElementTypes>();
142*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int8_t, int32_t, Int128>,
143*9356374aSAndroid Build Coastguard Worker              decltype(L::Partial())::ElementTypes>();
144*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int8_t, int32_t, Int128>,
145*9356374aSAndroid Build Coastguard Worker              decltype(L::Partial(0))::ElementTypes>();
146*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int8_t, int32_t, Int128>,
147*9356374aSAndroid Build Coastguard Worker              decltype(L::Partial(0, 0))::ElementTypes>();
148*9356374aSAndroid Build Coastguard Worker     SameType<std::tuple<int8_t, int32_t, Int128>,
149*9356374aSAndroid Build Coastguard Worker              decltype(L::Partial(0, 0, 0))::ElementTypes>();
150*9356374aSAndroid Build Coastguard Worker   }
151*9356374aSAndroid Build Coastguard Worker }
152*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,OffsetByIndex)153*9356374aSAndroid Build Coastguard Worker TEST(Layout, OffsetByIndex) {
154*9356374aSAndroid Build Coastguard Worker   {
155*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
156*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial().Offset<0>());
157*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(3).Offset<0>());
158*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L(3).Offset<0>());
159*9356374aSAndroid Build Coastguard Worker   }
160*9356374aSAndroid Build Coastguard Worker   {
161*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
162*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial().Offset<0>());
163*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(3).Offset<0>());
164*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, L::Partial(3).Offset<1>());
165*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(3, 5).Offset<0>());
166*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, L::Partial(3, 5).Offset<1>());
167*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L(3, 5).Offset<0>());
168*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, L(3, 5).Offset<1>());
169*9356374aSAndroid Build Coastguard Worker   }
170*9356374aSAndroid Build Coastguard Worker   {
171*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
172*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial().Offset<0>());
173*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Offset<0>());
174*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Offset<1>());
175*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(1).Offset<0>());
176*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, L::Partial(1).Offset<1>());
177*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(5).Offset<0>());
178*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(5).Offset<1>());
179*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0).Offset<0>());
180*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0).Offset<1>());
181*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0).Offset<2>());
182*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(1, 0).Offset<0>());
183*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, L::Partial(1, 0).Offset<1>());
184*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(1, 0).Offset<2>());
185*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(5, 3).Offset<0>());
186*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(5, 3).Offset<1>());
187*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, L::Partial(5, 3).Offset<2>());
188*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0, 0).Offset<0>());
189*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0, 0).Offset<1>());
190*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0, 0).Offset<2>());
191*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(1, 0, 0).Offset<0>());
192*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, L::Partial(1, 0, 0).Offset<1>());
193*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(1, 0, 0).Offset<2>());
194*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(5, 3, 1).Offset<0>());
195*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, L::Partial(5, 3, 1).Offset<2>());
196*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(5, 3, 1).Offset<1>());
197*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L(5, 3, 1).Offset<0>());
198*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, L(5, 3, 1).Offset<2>());
199*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L(5, 3, 1).Offset<1>());
200*9356374aSAndroid Build Coastguard Worker   }
201*9356374aSAndroid Build Coastguard Worker }
202*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,OffsetByType)203*9356374aSAndroid Build Coastguard Worker TEST(Layout, OffsetByType) {
204*9356374aSAndroid Build Coastguard Worker   {
205*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
206*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial().Offset<int32_t>());
207*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(3).Offset<int32_t>());
208*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L(3).Offset<int32_t>());
209*9356374aSAndroid Build Coastguard Worker   }
210*9356374aSAndroid Build Coastguard Worker   {
211*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
212*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial().Offset<int8_t>());
213*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Offset<int8_t>());
214*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Offset<int32_t>());
215*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(1).Offset<int8_t>());
216*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, L::Partial(1).Offset<int32_t>());
217*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(5).Offset<int8_t>());
218*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(5).Offset<int32_t>());
219*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0).Offset<int8_t>());
220*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0).Offset<int32_t>());
221*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0).Offset<Int128>());
222*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(1, 0).Offset<int8_t>());
223*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, L::Partial(1, 0).Offset<int32_t>());
224*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(1, 0).Offset<Int128>());
225*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(5, 3).Offset<int8_t>());
226*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(5, 3).Offset<int32_t>());
227*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, L::Partial(5, 3).Offset<Int128>());
228*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0, 0).Offset<int8_t>());
229*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0, 0).Offset<int32_t>());
230*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0, 0).Offset<Int128>());
231*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(1, 0, 0).Offset<int8_t>());
232*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, L::Partial(1, 0, 0).Offset<int32_t>());
233*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(1, 0, 0).Offset<Int128>());
234*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(5, 3, 1).Offset<int8_t>());
235*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, L::Partial(5, 3, 1).Offset<Int128>());
236*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(5, 3, 1).Offset<int32_t>());
237*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L(5, 3, 1).Offset<int8_t>());
238*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, L(5, 3, 1).Offset<Int128>());
239*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L(5, 3, 1).Offset<int32_t>());
240*9356374aSAndroid Build Coastguard Worker   }
241*9356374aSAndroid Build Coastguard Worker }
242*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,Offsets)243*9356374aSAndroid Build Coastguard Worker TEST(Layout, Offsets) {
244*9356374aSAndroid Build Coastguard Worker   {
245*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
246*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial().Offsets(), ElementsAre(0));
247*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(3).Offsets(), ElementsAre(0));
248*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L(3).Offsets(), ElementsAre(0));
249*9356374aSAndroid Build Coastguard Worker   }
250*9356374aSAndroid Build Coastguard Worker   {
251*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
252*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial().Offsets(), ElementsAre(0));
253*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(3).Offsets(), ElementsAre(0, 12));
254*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(3, 5).Offsets(), ElementsAre(0, 12));
255*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L(3, 5).Offsets(), ElementsAre(0, 12));
256*9356374aSAndroid Build Coastguard Worker   }
257*9356374aSAndroid Build Coastguard Worker   {
258*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
259*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial().Offsets(), ElementsAre(0));
260*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(1).Offsets(), ElementsAre(0, 4));
261*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(5).Offsets(), ElementsAre(0, 8));
262*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(0, 0).Offsets(), ElementsAre(0, 0, 0));
263*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(1, 0).Offsets(), ElementsAre(0, 4, 8));
264*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(5, 3).Offsets(), ElementsAre(0, 8, 24));
265*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(0, 0, 0).Offsets(), ElementsAre(0, 0, 0));
266*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(1, 0, 0).Offsets(), ElementsAre(0, 4, 8));
267*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(5, 3, 1).Offsets(), ElementsAre(0, 8, 24));
268*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L(5, 3, 1).Offsets(), ElementsAre(0, 8, 24));
269*9356374aSAndroid Build Coastguard Worker   }
270*9356374aSAndroid Build Coastguard Worker }
271*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticOffsets)272*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticOffsets) {
273*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int32_t, Int128>;
274*9356374aSAndroid Build Coastguard Worker   {
275*9356374aSAndroid Build Coastguard Worker     using SL = L::WithStaticSizes<>;
276*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial().Offsets(), ElementsAre(0));
277*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(5).Offsets(), ElementsAre(0, 8));
278*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(5, 3, 1).Offsets(), ElementsAre(0, 8, 24));
279*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL(5, 3, 1).Offsets(), ElementsAre(0, 8, 24));
280*9356374aSAndroid Build Coastguard Worker   }
281*9356374aSAndroid Build Coastguard Worker   {
282*9356374aSAndroid Build Coastguard Worker     using SL = L::WithStaticSizes<5>;
283*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial().Offsets(), ElementsAre(0, 8));
284*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3).Offsets(), ElementsAre(0, 8, 24));
285*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3, 1).Offsets(), ElementsAre(0, 8, 24));
286*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL(3, 1).Offsets(), ElementsAre(0, 8, 24));
287*9356374aSAndroid Build Coastguard Worker   }
288*9356374aSAndroid Build Coastguard Worker   {
289*9356374aSAndroid Build Coastguard Worker     using SL = L::WithStaticSizes<5, 3>;
290*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial().Offsets(), ElementsAre(0, 8, 24));
291*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(1).Offsets(), ElementsAre(0, 8, 24));
292*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL(1).Offsets(), ElementsAre(0, 8, 24));
293*9356374aSAndroid Build Coastguard Worker   }
294*9356374aSAndroid Build Coastguard Worker   {
295*9356374aSAndroid Build Coastguard Worker     using SL = L::WithStaticSizes<5, 3, 1>;
296*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial().Offsets(), ElementsAre(0, 8, 24));
297*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL().Offsets(), ElementsAre(0, 8, 24));
298*9356374aSAndroid Build Coastguard Worker   }
299*9356374aSAndroid Build Coastguard Worker }
300*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,AllocSize)301*9356374aSAndroid Build Coastguard Worker TEST(Layout, AllocSize) {
302*9356374aSAndroid Build Coastguard Worker   {
303*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
304*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).AllocSize());
305*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, L::Partial(3).AllocSize());
306*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, L(3).AllocSize());
307*9356374aSAndroid Build Coastguard Worker   }
308*9356374aSAndroid Build Coastguard Worker   {
309*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
310*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(32, L::Partial(3, 5).AllocSize());
311*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(32, L(3, 5).AllocSize());
312*9356374aSAndroid Build Coastguard Worker   }
313*9356374aSAndroid Build Coastguard Worker   {
314*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
315*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0, 0, 0).AllocSize());
316*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(1, 0, 0).AllocSize());
317*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, L::Partial(0, 1, 0).AllocSize());
318*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(16, L::Partial(0, 0, 1).AllocSize());
319*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, L::Partial(1, 1, 1).AllocSize());
320*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, L::Partial(3, 5, 7).AllocSize());
321*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, L(3, 5, 7).AllocSize());
322*9356374aSAndroid Build Coastguard Worker   }
323*9356374aSAndroid Build Coastguard Worker }
324*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticAllocSize)325*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticAllocSize) {
326*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int32_t, Int128>;
327*9356374aSAndroid Build Coastguard Worker   {
328*9356374aSAndroid Build Coastguard Worker     using SL = L::WithStaticSizes<>;
329*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, SL::Partial(3, 5, 7).AllocSize());
330*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, SL(3, 5, 7).AllocSize());
331*9356374aSAndroid Build Coastguard Worker   }
332*9356374aSAndroid Build Coastguard Worker   {
333*9356374aSAndroid Build Coastguard Worker     using SL = L::WithStaticSizes<3>;
334*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, SL::Partial(5, 7).AllocSize());
335*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, SL(5, 7).AllocSize());
336*9356374aSAndroid Build Coastguard Worker   }
337*9356374aSAndroid Build Coastguard Worker   {
338*9356374aSAndroid Build Coastguard Worker     using SL = L::WithStaticSizes<3, 5>;
339*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, SL::Partial(7).AllocSize());
340*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, SL(7).AllocSize());
341*9356374aSAndroid Build Coastguard Worker   }
342*9356374aSAndroid Build Coastguard Worker   {
343*9356374aSAndroid Build Coastguard Worker     using SL = L::WithStaticSizes<3, 5, 7>;
344*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, SL::Partial().AllocSize());
345*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(136, SL().AllocSize());
346*9356374aSAndroid Build Coastguard Worker   }
347*9356374aSAndroid Build Coastguard Worker }
348*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,SizeByIndex)349*9356374aSAndroid Build Coastguard Worker TEST(Layout, SizeByIndex) {
350*9356374aSAndroid Build Coastguard Worker   {
351*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
352*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Size<0>());
353*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Size<0>());
354*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3).Size<0>());
355*9356374aSAndroid Build Coastguard Worker   }
356*9356374aSAndroid Build Coastguard Worker   {
357*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
358*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Size<0>());
359*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Size<0>());
360*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5).Size<0>());
361*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5).Size<1>());
362*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3, 5).Size<0>());
363*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L(3, 5).Size<1>());
364*9356374aSAndroid Build Coastguard Worker   }
365*9356374aSAndroid Build Coastguard Worker   {
366*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
367*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Size<0>());
368*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5).Size<0>());
369*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5).Size<1>());
370*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5, 7).Size<0>());
371*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5, 7).Size<1>());
372*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L::Partial(3, 5, 7).Size<2>());
373*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3, 5, 7).Size<0>());
374*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L(3, 5, 7).Size<1>());
375*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L(3, 5, 7).Size<2>());
376*9356374aSAndroid Build Coastguard Worker   }
377*9356374aSAndroid Build Coastguard Worker }
378*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,SizeByType)379*9356374aSAndroid Build Coastguard Worker TEST(Layout, SizeByType) {
380*9356374aSAndroid Build Coastguard Worker   {
381*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
382*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Size<int32_t>());
383*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Size<int32_t>());
384*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3).Size<int32_t>());
385*9356374aSAndroid Build Coastguard Worker   }
386*9356374aSAndroid Build Coastguard Worker   {
387*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
388*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Size<int8_t>());
389*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5).Size<int8_t>());
390*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5).Size<int32_t>());
391*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5, 7).Size<int8_t>());
392*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5, 7).Size<int32_t>());
393*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L::Partial(3, 5, 7).Size<Int128>());
394*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3, 5, 7).Size<int8_t>());
395*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L(3, 5, 7).Size<int32_t>());
396*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L(3, 5, 7).Size<Int128>());
397*9356374aSAndroid Build Coastguard Worker   }
398*9356374aSAndroid Build Coastguard Worker }
399*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,Sizes)400*9356374aSAndroid Build Coastguard Worker TEST(Layout, Sizes) {
401*9356374aSAndroid Build Coastguard Worker   {
402*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
403*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial().Sizes(), ElementsAre());
404*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(3).Sizes(), ElementsAre(3));
405*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L(3).Sizes(), ElementsAre(3));
406*9356374aSAndroid Build Coastguard Worker   }
407*9356374aSAndroid Build Coastguard Worker   {
408*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
409*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial().Sizes(), ElementsAre());
410*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(3).Sizes(), ElementsAre(3));
411*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(3, 5).Sizes(), ElementsAre(3, 5));
412*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L(3, 5).Sizes(), ElementsAre(3, 5));
413*9356374aSAndroid Build Coastguard Worker   }
414*9356374aSAndroid Build Coastguard Worker   {
415*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
416*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial().Sizes(), ElementsAre());
417*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(3).Sizes(), ElementsAre(3));
418*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(3, 5).Sizes(), ElementsAre(3, 5));
419*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L::Partial(3, 5, 7).Sizes(), ElementsAre(3, 5, 7));
420*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(L(3, 5, 7).Sizes(), ElementsAre(3, 5, 7));
421*9356374aSAndroid Build Coastguard Worker   }
422*9356374aSAndroid Build Coastguard Worker }
423*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticSize)424*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticSize) {
425*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int32_t, Int128>;
426*9356374aSAndroid Build Coastguard Worker   {
427*9356374aSAndroid Build Coastguard Worker     using SL = L::WithStaticSizes<>;
428*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial().Sizes(), ElementsAre());
429*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3).Size<0>(), 3);
430*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3).Size<int8_t>(), 3);
431*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3).Sizes(), ElementsAre(3));
432*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3, 5, 7).Size<0>(), 3);
433*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3, 5, 7).Size<int8_t>(), 3);
434*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3, 5, 7).Size<2>(), 7);
435*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3, 5, 7).Size<Int128>(), 7);
436*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL::Partial(3, 5, 7).Sizes(), ElementsAre(3, 5, 7));
437*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL(3, 5, 7).Size<0>(), 3);
438*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL(3, 5, 7).Size<int8_t>(), 3);
439*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL(3, 5, 7).Size<2>(), 7);
440*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL(3, 5, 7).Size<Int128>(), 7);
441*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(SL(3, 5, 7).Sizes(), ElementsAre(3, 5, 7));
442*9356374aSAndroid Build Coastguard Worker   }
443*9356374aSAndroid Build Coastguard Worker }
444*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,PointerByIndex)445*9356374aSAndroid Build Coastguard Worker TEST(Layout, PointerByIndex) {
446*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char p[100] = {0};
447*9356374aSAndroid Build Coastguard Worker   {
448*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
449*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int32_t*>(L::Partial().Pointer<0>(p))));
450*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
451*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const int32_t*>(L::Partial(3).Pointer<0>(p))));
452*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int32_t*>(L(3).Pointer<0>(p))));
453*9356374aSAndroid Build Coastguard Worker   }
454*9356374aSAndroid Build Coastguard Worker   {
455*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
456*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int32_t*>(L::Partial().Pointer<0>(p))));
457*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
458*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const int32_t*>(L::Partial(3).Pointer<0>(p))));
459*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12,
460*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const int32_t*>(L::Partial(3).Pointer<1>(p))));
461*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
462*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int32_t*>(L::Partial(3, 5).Pointer<0>(p))));
463*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
464*9356374aSAndroid Build Coastguard Worker         12, Distance(p, Type<const int32_t*>(L::Partial(3, 5).Pointer<1>(p))));
465*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int32_t*>(L(3, 5).Pointer<0>(p))));
466*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, Distance(p, Type<const int32_t*>(L(3, 5).Pointer<1>(p))));
467*9356374aSAndroid Build Coastguard Worker   }
468*9356374aSAndroid Build Coastguard Worker   {
469*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
470*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int8_t*>(L::Partial().Pointer<0>(p))));
471*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int8_t*>(L::Partial(0).Pointer<0>(p))));
472*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
473*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const int32_t*>(L::Partial(0).Pointer<1>(p))));
474*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int8_t*>(L::Partial(1).Pointer<0>(p))));
475*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4,
476*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const int32_t*>(L::Partial(1).Pointer<1>(p))));
477*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int8_t*>(L::Partial(5).Pointer<0>(p))));
478*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8,
479*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const int32_t*>(L::Partial(5).Pointer<1>(p))));
480*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
481*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const int8_t*>(L::Partial(0, 0).Pointer<0>(p))));
482*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
483*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int32_t*>(L::Partial(0, 0).Pointer<1>(p))));
484*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
485*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const Int128*>(L::Partial(0, 0).Pointer<2>(p))));
486*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
487*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const int8_t*>(L::Partial(1, 0).Pointer<0>(p))));
488*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
489*9356374aSAndroid Build Coastguard Worker         4, Distance(p, Type<const int32_t*>(L::Partial(1, 0).Pointer<1>(p))));
490*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8,
491*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const Int128*>(L::Partial(1, 0).Pointer<2>(p))));
492*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
493*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const int8_t*>(L::Partial(5, 3).Pointer<0>(p))));
494*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
495*9356374aSAndroid Build Coastguard Worker         8, Distance(p, Type<const int32_t*>(L::Partial(5, 3).Pointer<1>(p))));
496*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24,
497*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const Int128*>(L::Partial(5, 3).Pointer<2>(p))));
498*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
499*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int8_t*>(L::Partial(0, 0, 0).Pointer<0>(p))));
500*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
501*9356374aSAndroid Build Coastguard Worker         0,
502*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int32_t*>(L::Partial(0, 0, 0).Pointer<1>(p))));
503*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
504*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const Int128*>(L::Partial(0, 0, 0).Pointer<2>(p))));
505*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
506*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int8_t*>(L::Partial(1, 0, 0).Pointer<0>(p))));
507*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
508*9356374aSAndroid Build Coastguard Worker         4,
509*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int32_t*>(L::Partial(1, 0, 0).Pointer<1>(p))));
510*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
511*9356374aSAndroid Build Coastguard Worker         8, Distance(p, Type<const Int128*>(L::Partial(1, 0, 0).Pointer<2>(p))));
512*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
513*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int8_t*>(L::Partial(5, 3, 1).Pointer<0>(p))));
514*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
515*9356374aSAndroid Build Coastguard Worker         24,
516*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const Int128*>(L::Partial(5, 3, 1).Pointer<2>(p))));
517*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
518*9356374aSAndroid Build Coastguard Worker         8,
519*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int32_t*>(L::Partial(5, 3, 1).Pointer<1>(p))));
520*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int8_t*>(L(5, 3, 1).Pointer<0>(p))));
521*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, Distance(p, Type<const Int128*>(L(5, 3, 1).Pointer<2>(p))));
522*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<const int32_t*>(L(5, 3, 1).Pointer<1>(p))));
523*9356374aSAndroid Build Coastguard Worker   }
524*9356374aSAndroid Build Coastguard Worker }
525*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,PointerByType)526*9356374aSAndroid Build Coastguard Worker TEST(Layout, PointerByType) {
527*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char p[100] = {0};
528*9356374aSAndroid Build Coastguard Worker   {
529*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
530*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
531*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int32_t*>(L::Partial().Pointer<int32_t>(p))));
532*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
533*9356374aSAndroid Build Coastguard Worker         0,
534*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int32_t*>(L::Partial(3).Pointer<int32_t>(p))));
535*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int32_t*>(L(3).Pointer<int32_t>(p))));
536*9356374aSAndroid Build Coastguard Worker   }
537*9356374aSAndroid Build Coastguard Worker   {
538*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
539*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
540*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int8_t*>(L::Partial().Pointer<int8_t>(p))));
541*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
542*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int8_t*>(L::Partial(0).Pointer<int8_t>(p))));
543*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
544*9356374aSAndroid Build Coastguard Worker         0,
545*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int32_t*>(L::Partial(0).Pointer<int32_t>(p))));
546*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
547*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int8_t*>(L::Partial(1).Pointer<int8_t>(p))));
548*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
549*9356374aSAndroid Build Coastguard Worker         4,
550*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int32_t*>(L::Partial(1).Pointer<int32_t>(p))));
551*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
552*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<const int8_t*>(L::Partial(5).Pointer<int8_t>(p))));
553*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
554*9356374aSAndroid Build Coastguard Worker         8,
555*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int32_t*>(L::Partial(5).Pointer<int32_t>(p))));
556*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
557*9356374aSAndroid Build Coastguard Worker         0,
558*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int8_t*>(L::Partial(0, 0).Pointer<int8_t>(p))));
559*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int32_t*>(
560*9356374aSAndroid Build Coastguard Worker                                  L::Partial(0, 0).Pointer<int32_t>(p))));
561*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
562*9356374aSAndroid Build Coastguard Worker         0,
563*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const Int128*>(L::Partial(0, 0).Pointer<Int128>(p))));
564*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
565*9356374aSAndroid Build Coastguard Worker         0,
566*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int8_t*>(L::Partial(1, 0).Pointer<int8_t>(p))));
567*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, Distance(p, Type<const int32_t*>(
568*9356374aSAndroid Build Coastguard Worker                                  L::Partial(1, 0).Pointer<int32_t>(p))));
569*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
570*9356374aSAndroid Build Coastguard Worker         8,
571*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const Int128*>(L::Partial(1, 0).Pointer<Int128>(p))));
572*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
573*9356374aSAndroid Build Coastguard Worker         0,
574*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const int8_t*>(L::Partial(5, 3).Pointer<int8_t>(p))));
575*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<const int32_t*>(
576*9356374aSAndroid Build Coastguard Worker                                  L::Partial(5, 3).Pointer<int32_t>(p))));
577*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
578*9356374aSAndroid Build Coastguard Worker         24,
579*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<const Int128*>(L::Partial(5, 3).Pointer<Int128>(p))));
580*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int8_t*>(
581*9356374aSAndroid Build Coastguard Worker                                  L::Partial(0, 0, 0).Pointer<int8_t>(p))));
582*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int32_t*>(
583*9356374aSAndroid Build Coastguard Worker                                  L::Partial(0, 0, 0).Pointer<int32_t>(p))));
584*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const Int128*>(
585*9356374aSAndroid Build Coastguard Worker                                  L::Partial(0, 0, 0).Pointer<Int128>(p))));
586*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int8_t*>(
587*9356374aSAndroid Build Coastguard Worker                                  L::Partial(1, 0, 0).Pointer<int8_t>(p))));
588*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, Distance(p, Type<const int32_t*>(
589*9356374aSAndroid Build Coastguard Worker                                  L::Partial(1, 0, 0).Pointer<int32_t>(p))));
590*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<const Int128*>(
591*9356374aSAndroid Build Coastguard Worker                                  L::Partial(1, 0, 0).Pointer<Int128>(p))));
592*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<const int8_t*>(
593*9356374aSAndroid Build Coastguard Worker                                  L::Partial(5, 3, 1).Pointer<int8_t>(p))));
594*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, Distance(p, Type<const Int128*>(
595*9356374aSAndroid Build Coastguard Worker                                   L::Partial(5, 3, 1).Pointer<Int128>(p))));
596*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<const int32_t*>(
597*9356374aSAndroid Build Coastguard Worker                                  L::Partial(5, 3, 1).Pointer<int32_t>(p))));
598*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24,
599*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<const Int128*>(L(5, 3, 1).Pointer<Int128>(p))));
600*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
601*9356374aSAndroid Build Coastguard Worker         8, Distance(p, Type<const int32_t*>(L(5, 3, 1).Pointer<int32_t>(p))));
602*9356374aSAndroid Build Coastguard Worker   }
603*9356374aSAndroid Build Coastguard Worker }
604*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,MutablePointerByIndex)605*9356374aSAndroid Build Coastguard Worker TEST(Layout, MutablePointerByIndex) {
606*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
607*9356374aSAndroid Build Coastguard Worker   {
608*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
609*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L::Partial().Pointer<0>(p))));
610*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L::Partial(3).Pointer<0>(p))));
611*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L(3).Pointer<0>(p))));
612*9356374aSAndroid Build Coastguard Worker   }
613*9356374aSAndroid Build Coastguard Worker   {
614*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
615*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L::Partial().Pointer<0>(p))));
616*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L::Partial(3).Pointer<0>(p))));
617*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, Distance(p, Type<int32_t*>(L::Partial(3).Pointer<1>(p))));
618*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L::Partial(3, 5).Pointer<0>(p))));
619*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, Distance(p, Type<int32_t*>(L::Partial(3, 5).Pointer<1>(p))));
620*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L(3, 5).Pointer<0>(p))));
621*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, Distance(p, Type<int32_t*>(L(3, 5).Pointer<1>(p))));
622*9356374aSAndroid Build Coastguard Worker   }
623*9356374aSAndroid Build Coastguard Worker   {
624*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
625*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial().Pointer<0>(p))));
626*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(0).Pointer<0>(p))));
627*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L::Partial(0).Pointer<1>(p))));
628*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(1).Pointer<0>(p))));
629*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, Distance(p, Type<int32_t*>(L::Partial(1).Pointer<1>(p))));
630*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(5).Pointer<0>(p))));
631*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<int32_t*>(L::Partial(5).Pointer<1>(p))));
632*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(0, 0).Pointer<0>(p))));
633*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L::Partial(0, 0).Pointer<1>(p))));
634*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Int128*>(L::Partial(0, 0).Pointer<2>(p))));
635*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(1, 0).Pointer<0>(p))));
636*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, Distance(p, Type<int32_t*>(L::Partial(1, 0).Pointer<1>(p))));
637*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<Int128*>(L::Partial(1, 0).Pointer<2>(p))));
638*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(5, 3).Pointer<0>(p))));
639*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<int32_t*>(L::Partial(5, 3).Pointer<1>(p))));
640*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, Distance(p, Type<Int128*>(L::Partial(5, 3).Pointer<2>(p))));
641*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(0, 0, 0).Pointer<0>(p))));
642*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
643*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int32_t*>(L::Partial(0, 0, 0).Pointer<1>(p))));
644*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Int128*>(L::Partial(0, 0, 0).Pointer<2>(p))));
645*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(1, 0, 0).Pointer<0>(p))));
646*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4,
647*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int32_t*>(L::Partial(1, 0, 0).Pointer<1>(p))));
648*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<Int128*>(L::Partial(1, 0, 0).Pointer<2>(p))));
649*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(5, 3, 1).Pointer<0>(p))));
650*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24,
651*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<Int128*>(L::Partial(5, 3, 1).Pointer<2>(p))));
652*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8,
653*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int32_t*>(L::Partial(5, 3, 1).Pointer<1>(p))));
654*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L(5, 3, 1).Pointer<0>(p))));
655*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, Distance(p, Type<Int128*>(L(5, 3, 1).Pointer<2>(p))));
656*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<int32_t*>(L(5, 3, 1).Pointer<1>(p))));
657*9356374aSAndroid Build Coastguard Worker   }
658*9356374aSAndroid Build Coastguard Worker }
659*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,MutablePointerByType)660*9356374aSAndroid Build Coastguard Worker TEST(Layout, MutablePointerByType) {
661*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
662*9356374aSAndroid Build Coastguard Worker   {
663*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
664*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L::Partial().Pointer<int32_t>(p))));
665*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
666*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int32_t*>(L::Partial(3).Pointer<int32_t>(p))));
667*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int32_t*>(L(3).Pointer<int32_t>(p))));
668*9356374aSAndroid Build Coastguard Worker   }
669*9356374aSAndroid Build Coastguard Worker   {
670*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
671*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial().Pointer<int8_t>(p))));
672*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(0).Pointer<int8_t>(p))));
673*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
674*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int32_t*>(L::Partial(0).Pointer<int32_t>(p))));
675*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(1).Pointer<int8_t>(p))));
676*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4,
677*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int32_t*>(L::Partial(1).Pointer<int32_t>(p))));
678*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L::Partial(5).Pointer<int8_t>(p))));
679*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8,
680*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int32_t*>(L::Partial(5).Pointer<int32_t>(p))));
681*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
682*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int8_t*>(L::Partial(0, 0).Pointer<int8_t>(p))));
683*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
684*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<int32_t*>(L::Partial(0, 0).Pointer<int32_t>(p))));
685*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
686*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<Int128*>(L::Partial(0, 0).Pointer<Int128>(p))));
687*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
688*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int8_t*>(L::Partial(1, 0).Pointer<int8_t>(p))));
689*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
690*9356374aSAndroid Build Coastguard Worker         4, Distance(p, Type<int32_t*>(L::Partial(1, 0).Pointer<int32_t>(p))));
691*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8,
692*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<Int128*>(L::Partial(1, 0).Pointer<Int128>(p))));
693*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
694*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<int8_t*>(L::Partial(5, 3).Pointer<int8_t>(p))));
695*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
696*9356374aSAndroid Build Coastguard Worker         8, Distance(p, Type<int32_t*>(L::Partial(5, 3).Pointer<int32_t>(p))));
697*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24,
698*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<Int128*>(L::Partial(5, 3).Pointer<Int128>(p))));
699*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
700*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<int8_t*>(L::Partial(0, 0, 0).Pointer<int8_t>(p))));
701*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
702*9356374aSAndroid Build Coastguard Worker         0,
703*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<int32_t*>(L::Partial(0, 0, 0).Pointer<int32_t>(p))));
704*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
705*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<Int128*>(L::Partial(0, 0, 0).Pointer<Int128>(p))));
706*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
707*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<int8_t*>(L::Partial(1, 0, 0).Pointer<int8_t>(p))));
708*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
709*9356374aSAndroid Build Coastguard Worker         4,
710*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<int32_t*>(L::Partial(1, 0, 0).Pointer<int32_t>(p))));
711*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
712*9356374aSAndroid Build Coastguard Worker         8, Distance(p, Type<Int128*>(L::Partial(1, 0, 0).Pointer<Int128>(p))));
713*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
714*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<int8_t*>(L::Partial(5, 3, 1).Pointer<int8_t>(p))));
715*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
716*9356374aSAndroid Build Coastguard Worker         24, Distance(p, Type<Int128*>(L::Partial(5, 3, 1).Pointer<Int128>(p))));
717*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
718*9356374aSAndroid Build Coastguard Worker         8,
719*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<int32_t*>(L::Partial(5, 3, 1).Pointer<int32_t>(p))));
720*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<int8_t*>(L(5, 3, 1).Pointer<int8_t>(p))));
721*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, Distance(p, Type<Int128*>(L(5, 3, 1).Pointer<Int128>(p))));
722*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<int32_t*>(L(5, 3, 1).Pointer<int32_t>(p))));
723*9356374aSAndroid Build Coastguard Worker   }
724*9356374aSAndroid Build Coastguard Worker }
725*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,Pointers)726*9356374aSAndroid Build Coastguard Worker TEST(Layout, Pointers) {
727*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char p[100] = {0};
728*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int8_t, Int128>;
729*9356374aSAndroid Build Coastguard Worker   {
730*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial();
731*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(std::make_tuple(x.Pointer<0>(p)),
732*9356374aSAndroid Build Coastguard Worker               Type<std::tuple<const int8_t*>>(x.Pointers(p)));
733*9356374aSAndroid Build Coastguard Worker   }
734*9356374aSAndroid Build Coastguard Worker   {
735*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1);
736*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p)),
737*9356374aSAndroid Build Coastguard Worker               (Type<std::tuple<const int8_t*, const int8_t*>>(x.Pointers(p))));
738*9356374aSAndroid Build Coastguard Worker   }
739*9356374aSAndroid Build Coastguard Worker   {
740*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1, 2);
741*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
742*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
743*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<const int8_t*, const int8_t*, const Int128*>>(
744*9356374aSAndroid Build Coastguard Worker             x.Pointers(p))));
745*9356374aSAndroid Build Coastguard Worker   }
746*9356374aSAndroid Build Coastguard Worker   {
747*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1, 2, 3);
748*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
749*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
750*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<const int8_t*, const int8_t*, const Int128*>>(
751*9356374aSAndroid Build Coastguard Worker             x.Pointers(p))));
752*9356374aSAndroid Build Coastguard Worker   }
753*9356374aSAndroid Build Coastguard Worker   {
754*9356374aSAndroid Build Coastguard Worker     const L x(1, 2, 3);
755*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
756*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
757*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<const int8_t*, const int8_t*, const Int128*>>(
758*9356374aSAndroid Build Coastguard Worker             x.Pointers(p))));
759*9356374aSAndroid Build Coastguard Worker   }
760*9356374aSAndroid Build Coastguard Worker }
761*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,MutablePointers)762*9356374aSAndroid Build Coastguard Worker TEST(Layout, MutablePointers) {
763*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
764*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int8_t, Int128>;
765*9356374aSAndroid Build Coastguard Worker   {
766*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial();
767*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(std::make_tuple(x.Pointer<0>(p)),
768*9356374aSAndroid Build Coastguard Worker               Type<std::tuple<int8_t*>>(x.Pointers(p)));
769*9356374aSAndroid Build Coastguard Worker   }
770*9356374aSAndroid Build Coastguard Worker   {
771*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1);
772*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p)),
773*9356374aSAndroid Build Coastguard Worker               (Type<std::tuple<int8_t*, int8_t*>>(x.Pointers(p))));
774*9356374aSAndroid Build Coastguard Worker   }
775*9356374aSAndroid Build Coastguard Worker   {
776*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1, 2);
777*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
778*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
779*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<int8_t*, int8_t*, Int128*>>(x.Pointers(p))));
780*9356374aSAndroid Build Coastguard Worker   }
781*9356374aSAndroid Build Coastguard Worker   {
782*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1, 2, 3);
783*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
784*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
785*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<int8_t*, int8_t*, Int128*>>(x.Pointers(p))));
786*9356374aSAndroid Build Coastguard Worker   }
787*9356374aSAndroid Build Coastguard Worker   {
788*9356374aSAndroid Build Coastguard Worker     const L x(1, 2, 3);
789*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
790*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
791*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<int8_t*, int8_t*, Int128*>>(x.Pointers(p))));
792*9356374aSAndroid Build Coastguard Worker   }
793*9356374aSAndroid Build Coastguard Worker }
794*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticPointers)795*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticPointers) {
796*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char p[100] = {0};
797*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int8_t, Int128>;
798*9356374aSAndroid Build Coastguard Worker   {
799*9356374aSAndroid Build Coastguard Worker     const auto x = L::WithStaticSizes<>::Partial();
800*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(std::make_tuple(x.Pointer<0>(p)),
801*9356374aSAndroid Build Coastguard Worker               Type<std::tuple<const int8_t*>>(x.Pointers(p)));
802*9356374aSAndroid Build Coastguard Worker   }
803*9356374aSAndroid Build Coastguard Worker   {
804*9356374aSAndroid Build Coastguard Worker     const auto x = L::WithStaticSizes<>::Partial(1);
805*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p)),
806*9356374aSAndroid Build Coastguard Worker               (Type<std::tuple<const int8_t*, const int8_t*>>(x.Pointers(p))));
807*9356374aSAndroid Build Coastguard Worker   }
808*9356374aSAndroid Build Coastguard Worker   {
809*9356374aSAndroid Build Coastguard Worker     const auto x = L::WithStaticSizes<1>::Partial();
810*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p)),
811*9356374aSAndroid Build Coastguard Worker               (Type<std::tuple<const int8_t*, const int8_t*>>(x.Pointers(p))));
812*9356374aSAndroid Build Coastguard Worker   }
813*9356374aSAndroid Build Coastguard Worker   {
814*9356374aSAndroid Build Coastguard Worker     const auto x = L::WithStaticSizes<>::Partial(1, 2, 3);
815*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
816*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
817*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<const int8_t*, const int8_t*, const Int128*>>(
818*9356374aSAndroid Build Coastguard Worker             x.Pointers(p))));
819*9356374aSAndroid Build Coastguard Worker   }
820*9356374aSAndroid Build Coastguard Worker   {
821*9356374aSAndroid Build Coastguard Worker     const auto x = L::WithStaticSizes<1>::Partial(2, 3);
822*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
823*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
824*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<const int8_t*, const int8_t*, const Int128*>>(
825*9356374aSAndroid Build Coastguard Worker             x.Pointers(p))));
826*9356374aSAndroid Build Coastguard Worker   }
827*9356374aSAndroid Build Coastguard Worker   {
828*9356374aSAndroid Build Coastguard Worker     const auto x = L::WithStaticSizes<1, 2>::Partial(3);
829*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
830*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
831*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<const int8_t*, const int8_t*, const Int128*>>(
832*9356374aSAndroid Build Coastguard Worker             x.Pointers(p))));
833*9356374aSAndroid Build Coastguard Worker   }
834*9356374aSAndroid Build Coastguard Worker   {
835*9356374aSAndroid Build Coastguard Worker     const auto x = L::WithStaticSizes<1, 2, 3>::Partial();
836*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
837*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
838*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<const int8_t*, const int8_t*, const Int128*>>(
839*9356374aSAndroid Build Coastguard Worker             x.Pointers(p))));
840*9356374aSAndroid Build Coastguard Worker   }
841*9356374aSAndroid Build Coastguard Worker   {
842*9356374aSAndroid Build Coastguard Worker     const L::WithStaticSizes<1, 2, 3> x;
843*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
844*9356374aSAndroid Build Coastguard Worker         std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)),
845*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<const int8_t*, const int8_t*, const Int128*>>(
846*9356374aSAndroid Build Coastguard Worker             x.Pointers(p))));
847*9356374aSAndroid Build Coastguard Worker   }
848*9356374aSAndroid Build Coastguard Worker }
849*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,SliceByIndexSize)850*9356374aSAndroid Build Coastguard Worker TEST(Layout, SliceByIndexSize) {
851*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char p[100] = {0};
852*9356374aSAndroid Build Coastguard Worker   {
853*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
854*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Slice<0>(p).size());
855*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size());
856*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3).Slice<0>(p).size());
857*9356374aSAndroid Build Coastguard Worker   }
858*9356374aSAndroid Build Coastguard Worker   {
859*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
860*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size());
861*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5).Slice<1>(p).size());
862*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L(3, 5).Slice<1>(p).size());
863*9356374aSAndroid Build Coastguard Worker   }
864*9356374aSAndroid Build Coastguard Worker   {
865*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
866*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size());
867*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5).Slice<0>(p).size());
868*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5).Slice<1>(p).size());
869*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5, 7).Slice<0>(p).size());
870*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5, 7).Slice<1>(p).size());
871*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L::Partial(3, 5, 7).Slice<2>(p).size());
872*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3, 5, 7).Slice<0>(p).size());
873*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L(3, 5, 7).Slice<1>(p).size());
874*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L(3, 5, 7).Slice<2>(p).size());
875*9356374aSAndroid Build Coastguard Worker   }
876*9356374aSAndroid Build Coastguard Worker }
877*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,SliceByTypeSize)878*9356374aSAndroid Build Coastguard Worker TEST(Layout, SliceByTypeSize) {
879*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char p[100] = {0};
880*9356374aSAndroid Build Coastguard Worker   {
881*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
882*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Slice<int32_t>(p).size());
883*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<int32_t>(p).size());
884*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3).Slice<int32_t>(p).size());
885*9356374aSAndroid Build Coastguard Worker   }
886*9356374aSAndroid Build Coastguard Worker   {
887*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
888*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<int8_t>(p).size());
889*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5).Slice<int8_t>(p).size());
890*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5).Slice<int32_t>(p).size());
891*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5, 7).Slice<int8_t>(p).size());
892*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5, 7).Slice<int32_t>(p).size());
893*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L::Partial(3, 5, 7).Slice<Int128>(p).size());
894*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3, 5, 7).Slice<int8_t>(p).size());
895*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L(3, 5, 7).Slice<int32_t>(p).size());
896*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L(3, 5, 7).Slice<Int128>(p).size());
897*9356374aSAndroid Build Coastguard Worker   }
898*9356374aSAndroid Build Coastguard Worker }
TEST(Layout,MutableSliceByIndexSize)899*9356374aSAndroid Build Coastguard Worker TEST(Layout, MutableSliceByIndexSize) {
900*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
901*9356374aSAndroid Build Coastguard Worker   {
902*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
903*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Slice<0>(p).size());
904*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size());
905*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3).Slice<0>(p).size());
906*9356374aSAndroid Build Coastguard Worker   }
907*9356374aSAndroid Build Coastguard Worker   {
908*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
909*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size());
910*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5).Slice<1>(p).size());
911*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L(3, 5).Slice<1>(p).size());
912*9356374aSAndroid Build Coastguard Worker   }
913*9356374aSAndroid Build Coastguard Worker   {
914*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
915*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size());
916*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5).Slice<0>(p).size());
917*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5).Slice<1>(p).size());
918*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5, 7).Slice<0>(p).size());
919*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5, 7).Slice<1>(p).size());
920*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L::Partial(3, 5, 7).Slice<2>(p).size());
921*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3, 5, 7).Slice<0>(p).size());
922*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L(3, 5, 7).Slice<1>(p).size());
923*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L(3, 5, 7).Slice<2>(p).size());
924*9356374aSAndroid Build Coastguard Worker   }
925*9356374aSAndroid Build Coastguard Worker }
926*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,MutableSliceByTypeSize)927*9356374aSAndroid Build Coastguard Worker TEST(Layout, MutableSliceByTypeSize) {
928*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
929*9356374aSAndroid Build Coastguard Worker   {
930*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
931*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, L::Partial(0).Slice<int32_t>(p).size());
932*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<int32_t>(p).size());
933*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3).Slice<int32_t>(p).size());
934*9356374aSAndroid Build Coastguard Worker   }
935*9356374aSAndroid Build Coastguard Worker   {
936*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
937*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3).Slice<int8_t>(p).size());
938*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5).Slice<int8_t>(p).size());
939*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5).Slice<int32_t>(p).size());
940*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L::Partial(3, 5, 7).Slice<int8_t>(p).size());
941*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L::Partial(3, 5, 7).Slice<int32_t>(p).size());
942*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L::Partial(3, 5, 7).Slice<Int128>(p).size());
943*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(3, L(3, 5, 7).Slice<int8_t>(p).size());
944*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(5, L(3, 5, 7).Slice<int32_t>(p).size());
945*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(7, L(3, 5, 7).Slice<Int128>(p).size());
946*9356374aSAndroid Build Coastguard Worker   }
947*9356374aSAndroid Build Coastguard Worker }
948*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticSliceSize)949*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticSliceSize) {
950*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char cp[100] = {0};
951*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
952*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int32_t, Int128>;
953*9356374aSAndroid Build Coastguard Worker   using SL = L::WithStaticSizes<3, 5>;
954*9356374aSAndroid Build Coastguard Worker 
955*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, SL::Partial().Slice<0>(cp).size());
956*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, SL::Partial().Slice<int8_t>(cp).size());
957*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, SL::Partial(7).Slice<0>(cp).size());
958*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, SL::Partial(7).Slice<int8_t>(cp).size());
959*9356374aSAndroid Build Coastguard Worker 
960*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, SL::Partial().Slice<1>(cp).size());
961*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, SL::Partial().Slice<int32_t>(cp).size());
962*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, SL::Partial(7).Slice<1>(cp).size());
963*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, SL::Partial(7).Slice<int32_t>(cp).size());
964*9356374aSAndroid Build Coastguard Worker 
965*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(7, SL::Partial(7).Slice<2>(cp).size());
966*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(7, SL::Partial(7).Slice<Int128>(cp).size());
967*9356374aSAndroid Build Coastguard Worker 
968*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, SL::Partial().Slice<0>(p).size());
969*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, SL::Partial().Slice<int8_t>(p).size());
970*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, SL::Partial(7).Slice<0>(p).size());
971*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, SL::Partial(7).Slice<int8_t>(p).size());
972*9356374aSAndroid Build Coastguard Worker 
973*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, SL::Partial().Slice<1>(p).size());
974*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, SL::Partial().Slice<int32_t>(p).size());
975*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, SL::Partial(7).Slice<1>(p).size());
976*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, SL::Partial(7).Slice<int32_t>(p).size());
977*9356374aSAndroid Build Coastguard Worker 
978*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(7, SL::Partial(7).Slice<2>(p).size());
979*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(7, SL::Partial(7).Slice<Int128>(p).size());
980*9356374aSAndroid Build Coastguard Worker }
981*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,SliceByIndexData)982*9356374aSAndroid Build Coastguard Worker TEST(Layout, SliceByIndexData) {
983*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char p[100] = {0};
984*9356374aSAndroid Build Coastguard Worker   {
985*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
986*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
987*9356374aSAndroid Build Coastguard Worker         0, Distance(
988*9356374aSAndroid Build Coastguard Worker                p, Type<Span<const int32_t>>(L::Partial(0).Slice<0>(p)).data()));
989*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
990*9356374aSAndroid Build Coastguard Worker         0, Distance(
991*9356374aSAndroid Build Coastguard Worker                p, Type<Span<const int32_t>>(L::Partial(3).Slice<0>(p)).data()));
992*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
993*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<Span<const int32_t>>(L(3).Slice<0>(p)).data()));
994*9356374aSAndroid Build Coastguard Worker   }
995*9356374aSAndroid Build Coastguard Worker   {
996*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
997*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
998*9356374aSAndroid Build Coastguard Worker         0, Distance(
999*9356374aSAndroid Build Coastguard Worker                p, Type<Span<const int32_t>>(L::Partial(3).Slice<0>(p)).data()));
1000*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1001*9356374aSAndroid Build Coastguard Worker         0,
1002*9356374aSAndroid Build Coastguard Worker         Distance(
1003*9356374aSAndroid Build Coastguard Worker             p, Type<Span<const int32_t>>(L::Partial(3, 5).Slice<0>(p)).data()));
1004*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1005*9356374aSAndroid Build Coastguard Worker         12,
1006*9356374aSAndroid Build Coastguard Worker         Distance(
1007*9356374aSAndroid Build Coastguard Worker             p, Type<Span<const int32_t>>(L::Partial(3, 5).Slice<1>(p)).data()));
1008*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1009*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<Span<const int32_t>>(L(3, 5).Slice<0>(p)).data()));
1010*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1011*9356374aSAndroid Build Coastguard Worker         12, Distance(p, Type<Span<const int32_t>>(L(3, 5).Slice<1>(p)).data()));
1012*9356374aSAndroid Build Coastguard Worker   }
1013*9356374aSAndroid Build Coastguard Worker   {
1014*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
1015*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1016*9356374aSAndroid Build Coastguard Worker         0, Distance(
1017*9356374aSAndroid Build Coastguard Worker                p, Type<Span<const int8_t>>(L::Partial(0).Slice<0>(p)).data()));
1018*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1019*9356374aSAndroid Build Coastguard Worker         0, Distance(
1020*9356374aSAndroid Build Coastguard Worker                p, Type<Span<const int8_t>>(L::Partial(1).Slice<0>(p)).data()));
1021*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1022*9356374aSAndroid Build Coastguard Worker         0, Distance(
1023*9356374aSAndroid Build Coastguard Worker                p, Type<Span<const int8_t>>(L::Partial(5).Slice<0>(p)).data()));
1024*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1025*9356374aSAndroid Build Coastguard Worker         0,
1026*9356374aSAndroid Build Coastguard Worker         Distance(
1027*9356374aSAndroid Build Coastguard Worker             p, Type<Span<const int8_t>>(L::Partial(0, 0).Slice<0>(p)).data()));
1028*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1029*9356374aSAndroid Build Coastguard Worker         0,
1030*9356374aSAndroid Build Coastguard Worker         Distance(
1031*9356374aSAndroid Build Coastguard Worker             p, Type<Span<const int32_t>>(L::Partial(0, 0).Slice<1>(p)).data()));
1032*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1033*9356374aSAndroid Build Coastguard Worker         0,
1034*9356374aSAndroid Build Coastguard Worker         Distance(
1035*9356374aSAndroid Build Coastguard Worker             p, Type<Span<const int8_t>>(L::Partial(1, 0).Slice<0>(p)).data()));
1036*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1037*9356374aSAndroid Build Coastguard Worker         4,
1038*9356374aSAndroid Build Coastguard Worker         Distance(
1039*9356374aSAndroid Build Coastguard Worker             p, Type<Span<const int32_t>>(L::Partial(1, 0).Slice<1>(p)).data()));
1040*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1041*9356374aSAndroid Build Coastguard Worker         0,
1042*9356374aSAndroid Build Coastguard Worker         Distance(
1043*9356374aSAndroid Build Coastguard Worker             p, Type<Span<const int8_t>>(L::Partial(5, 3).Slice<0>(p)).data()));
1044*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1045*9356374aSAndroid Build Coastguard Worker         8,
1046*9356374aSAndroid Build Coastguard Worker         Distance(
1047*9356374aSAndroid Build Coastguard Worker             p, Type<Span<const int32_t>>(L::Partial(5, 3).Slice<1>(p)).data()));
1048*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1049*9356374aSAndroid Build Coastguard Worker         0,
1050*9356374aSAndroid Build Coastguard Worker         Distance(
1051*9356374aSAndroid Build Coastguard Worker             p,
1052*9356374aSAndroid Build Coastguard Worker             Type<Span<const int8_t>>(L::Partial(0, 0, 0).Slice<0>(p)).data()));
1053*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1054*9356374aSAndroid Build Coastguard Worker         0,
1055*9356374aSAndroid Build Coastguard Worker         Distance(
1056*9356374aSAndroid Build Coastguard Worker             p,
1057*9356374aSAndroid Build Coastguard Worker             Type<Span<const int32_t>>(L::Partial(0, 0, 0).Slice<1>(p)).data()));
1058*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1059*9356374aSAndroid Build Coastguard Worker         0,
1060*9356374aSAndroid Build Coastguard Worker         Distance(
1061*9356374aSAndroid Build Coastguard Worker             p,
1062*9356374aSAndroid Build Coastguard Worker             Type<Span<const Int128>>(L::Partial(0, 0, 0).Slice<2>(p)).data()));
1063*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1064*9356374aSAndroid Build Coastguard Worker         0,
1065*9356374aSAndroid Build Coastguard Worker         Distance(
1066*9356374aSAndroid Build Coastguard Worker             p,
1067*9356374aSAndroid Build Coastguard Worker             Type<Span<const int8_t>>(L::Partial(1, 0, 0).Slice<0>(p)).data()));
1068*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1069*9356374aSAndroid Build Coastguard Worker         4,
1070*9356374aSAndroid Build Coastguard Worker         Distance(
1071*9356374aSAndroid Build Coastguard Worker             p,
1072*9356374aSAndroid Build Coastguard Worker             Type<Span<const int32_t>>(L::Partial(1, 0, 0).Slice<1>(p)).data()));
1073*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1074*9356374aSAndroid Build Coastguard Worker         8,
1075*9356374aSAndroid Build Coastguard Worker         Distance(
1076*9356374aSAndroid Build Coastguard Worker             p,
1077*9356374aSAndroid Build Coastguard Worker             Type<Span<const Int128>>(L::Partial(1, 0, 0).Slice<2>(p)).data()));
1078*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1079*9356374aSAndroid Build Coastguard Worker         0,
1080*9356374aSAndroid Build Coastguard Worker         Distance(
1081*9356374aSAndroid Build Coastguard Worker             p,
1082*9356374aSAndroid Build Coastguard Worker             Type<Span<const int8_t>>(L::Partial(5, 3, 1).Slice<0>(p)).data()));
1083*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1084*9356374aSAndroid Build Coastguard Worker         24,
1085*9356374aSAndroid Build Coastguard Worker         Distance(
1086*9356374aSAndroid Build Coastguard Worker             p,
1087*9356374aSAndroid Build Coastguard Worker             Type<Span<const Int128>>(L::Partial(5, 3, 1).Slice<2>(p)).data()));
1088*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1089*9356374aSAndroid Build Coastguard Worker         8,
1090*9356374aSAndroid Build Coastguard Worker         Distance(
1091*9356374aSAndroid Build Coastguard Worker             p,
1092*9356374aSAndroid Build Coastguard Worker             Type<Span<const int32_t>>(L::Partial(5, 3, 1).Slice<1>(p)).data()));
1093*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1094*9356374aSAndroid Build Coastguard Worker         0,
1095*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<const int8_t>>(L(5, 3, 1).Slice<0>(p)).data()));
1096*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1097*9356374aSAndroid Build Coastguard Worker         24,
1098*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<const Int128>>(L(5, 3, 1).Slice<2>(p)).data()));
1099*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1100*9356374aSAndroid Build Coastguard Worker         8,
1101*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<const int32_t>>(L(5, 3, 1).Slice<1>(p)).data()));
1102*9356374aSAndroid Build Coastguard Worker   }
1103*9356374aSAndroid Build Coastguard Worker }
1104*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,SliceByTypeData)1105*9356374aSAndroid Build Coastguard Worker TEST(Layout, SliceByTypeData) {
1106*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char p[100] = {0};
1107*9356374aSAndroid Build Coastguard Worker   {
1108*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
1109*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1110*9356374aSAndroid Build Coastguard Worker         0,
1111*9356374aSAndroid Build Coastguard Worker         Distance(
1112*9356374aSAndroid Build Coastguard Worker             p,
1113*9356374aSAndroid Build Coastguard Worker             Type<Span<const int32_t>>(L::Partial(0).Slice<int32_t>(p)).data()));
1114*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1115*9356374aSAndroid Build Coastguard Worker         0,
1116*9356374aSAndroid Build Coastguard Worker         Distance(
1117*9356374aSAndroid Build Coastguard Worker             p,
1118*9356374aSAndroid Build Coastguard Worker             Type<Span<const int32_t>>(L::Partial(3).Slice<int32_t>(p)).data()));
1119*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1120*9356374aSAndroid Build Coastguard Worker         0,
1121*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<const int32_t>>(L(3).Slice<int32_t>(p)).data()));
1122*9356374aSAndroid Build Coastguard Worker   }
1123*9356374aSAndroid Build Coastguard Worker   {
1124*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
1125*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1126*9356374aSAndroid Build Coastguard Worker         0,
1127*9356374aSAndroid Build Coastguard Worker         Distance(
1128*9356374aSAndroid Build Coastguard Worker             p,
1129*9356374aSAndroid Build Coastguard Worker             Type<Span<const int8_t>>(L::Partial(0).Slice<int8_t>(p)).data()));
1130*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1131*9356374aSAndroid Build Coastguard Worker         0,
1132*9356374aSAndroid Build Coastguard Worker         Distance(
1133*9356374aSAndroid Build Coastguard Worker             p,
1134*9356374aSAndroid Build Coastguard Worker             Type<Span<const int8_t>>(L::Partial(1).Slice<int8_t>(p)).data()));
1135*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1136*9356374aSAndroid Build Coastguard Worker         0,
1137*9356374aSAndroid Build Coastguard Worker         Distance(
1138*9356374aSAndroid Build Coastguard Worker             p,
1139*9356374aSAndroid Build Coastguard Worker             Type<Span<const int8_t>>(L::Partial(5).Slice<int8_t>(p)).data()));
1140*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1141*9356374aSAndroid Build Coastguard Worker         0,
1142*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<const int8_t>>(L::Partial(0, 0).Slice<int8_t>(p))
1143*9356374aSAndroid Build Coastguard Worker                         .data()));
1144*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Span<const int32_t>>(
1145*9356374aSAndroid Build Coastguard Worker                                  L::Partial(0, 0).Slice<int32_t>(p))
1146*9356374aSAndroid Build Coastguard Worker                                  .data()));
1147*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1148*9356374aSAndroid Build Coastguard Worker         0,
1149*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<const int8_t>>(L::Partial(1, 0).Slice<int8_t>(p))
1150*9356374aSAndroid Build Coastguard Worker                         .data()));
1151*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, Distance(p, Type<Span<const int32_t>>(
1152*9356374aSAndroid Build Coastguard Worker                                  L::Partial(1, 0).Slice<int32_t>(p))
1153*9356374aSAndroid Build Coastguard Worker                                  .data()));
1154*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1155*9356374aSAndroid Build Coastguard Worker         0,
1156*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<const int8_t>>(L::Partial(5, 3).Slice<int8_t>(p))
1157*9356374aSAndroid Build Coastguard Worker                         .data()));
1158*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<Span<const int32_t>>(
1159*9356374aSAndroid Build Coastguard Worker                                  L::Partial(5, 3).Slice<int32_t>(p))
1160*9356374aSAndroid Build Coastguard Worker                                  .data()));
1161*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Span<const int8_t>>(
1162*9356374aSAndroid Build Coastguard Worker                                  L::Partial(0, 0, 0).Slice<int8_t>(p))
1163*9356374aSAndroid Build Coastguard Worker                                  .data()));
1164*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Span<const int32_t>>(
1165*9356374aSAndroid Build Coastguard Worker                                  L::Partial(0, 0, 0).Slice<int32_t>(p))
1166*9356374aSAndroid Build Coastguard Worker                                  .data()));
1167*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Span<const Int128>>(
1168*9356374aSAndroid Build Coastguard Worker                                  L::Partial(0, 0, 0).Slice<Int128>(p))
1169*9356374aSAndroid Build Coastguard Worker                                  .data()));
1170*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Span<const int8_t>>(
1171*9356374aSAndroid Build Coastguard Worker                                  L::Partial(1, 0, 0).Slice<int8_t>(p))
1172*9356374aSAndroid Build Coastguard Worker                                  .data()));
1173*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(4, Distance(p, Type<Span<const int32_t>>(
1174*9356374aSAndroid Build Coastguard Worker                                  L::Partial(1, 0, 0).Slice<int32_t>(p))
1175*9356374aSAndroid Build Coastguard Worker                                  .data()));
1176*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<Span<const Int128>>(
1177*9356374aSAndroid Build Coastguard Worker                                  L::Partial(1, 0, 0).Slice<Int128>(p))
1178*9356374aSAndroid Build Coastguard Worker                                  .data()));
1179*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Span<const int8_t>>(
1180*9356374aSAndroid Build Coastguard Worker                                  L::Partial(5, 3, 1).Slice<int8_t>(p))
1181*9356374aSAndroid Build Coastguard Worker                                  .data()));
1182*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24, Distance(p, Type<Span<const Int128>>(
1183*9356374aSAndroid Build Coastguard Worker                                   L::Partial(5, 3, 1).Slice<Int128>(p))
1184*9356374aSAndroid Build Coastguard Worker                                   .data()));
1185*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8, Distance(p, Type<Span<const int32_t>>(
1186*9356374aSAndroid Build Coastguard Worker                                  L::Partial(5, 3, 1).Slice<int32_t>(p))
1187*9356374aSAndroid Build Coastguard Worker                                  .data()));
1188*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1189*9356374aSAndroid Build Coastguard Worker         0,
1190*9356374aSAndroid Build Coastguard Worker         Distance(p,
1191*9356374aSAndroid Build Coastguard Worker                  Type<Span<const int8_t>>(L(5, 3, 1).Slice<int8_t>(p)).data()));
1192*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1193*9356374aSAndroid Build Coastguard Worker         24,
1194*9356374aSAndroid Build Coastguard Worker         Distance(p,
1195*9356374aSAndroid Build Coastguard Worker                  Type<Span<const Int128>>(L(5, 3, 1).Slice<Int128>(p)).data()));
1196*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1197*9356374aSAndroid Build Coastguard Worker         8,
1198*9356374aSAndroid Build Coastguard Worker         Distance(
1199*9356374aSAndroid Build Coastguard Worker             p, Type<Span<const int32_t>>(L(5, 3, 1).Slice<int32_t>(p)).data()));
1200*9356374aSAndroid Build Coastguard Worker   }
1201*9356374aSAndroid Build Coastguard Worker }
1202*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,MutableSliceByIndexData)1203*9356374aSAndroid Build Coastguard Worker TEST(Layout, MutableSliceByIndexData) {
1204*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
1205*9356374aSAndroid Build Coastguard Worker   {
1206*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
1207*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1208*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<Span<int32_t>>(L::Partial(0).Slice<0>(p)).data()));
1209*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1210*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<Span<int32_t>>(L::Partial(3).Slice<0>(p)).data()));
1211*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Span<int32_t>>(L(3).Slice<0>(p)).data()));
1212*9356374aSAndroid Build Coastguard Worker   }
1213*9356374aSAndroid Build Coastguard Worker   {
1214*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t, int32_t>;
1215*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1216*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<Span<int32_t>>(L::Partial(3).Slice<0>(p)).data()));
1217*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1218*9356374aSAndroid Build Coastguard Worker         0,
1219*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int32_t>>(L::Partial(3, 5).Slice<0>(p)).data()));
1220*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1221*9356374aSAndroid Build Coastguard Worker         12,
1222*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int32_t>>(L::Partial(3, 5).Slice<1>(p)).data()));
1223*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, Distance(p, Type<Span<int32_t>>(L(3, 5).Slice<0>(p)).data()));
1224*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(12, Distance(p, Type<Span<int32_t>>(L(3, 5).Slice<1>(p)).data()));
1225*9356374aSAndroid Build Coastguard Worker   }
1226*9356374aSAndroid Build Coastguard Worker   {
1227*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
1228*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1229*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<Span<int8_t>>(L::Partial(0).Slice<0>(p)).data()));
1230*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1231*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<Span<int8_t>>(L::Partial(1).Slice<0>(p)).data()));
1232*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1233*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<Span<int8_t>>(L::Partial(5).Slice<0>(p)).data()));
1234*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1235*9356374aSAndroid Build Coastguard Worker         0,
1236*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int8_t>>(L::Partial(0, 0).Slice<0>(p)).data()));
1237*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1238*9356374aSAndroid Build Coastguard Worker         0,
1239*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int32_t>>(L::Partial(0, 0).Slice<1>(p)).data()));
1240*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1241*9356374aSAndroid Build Coastguard Worker         0,
1242*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int8_t>>(L::Partial(1, 0).Slice<0>(p)).data()));
1243*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1244*9356374aSAndroid Build Coastguard Worker         4,
1245*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int32_t>>(L::Partial(1, 0).Slice<1>(p)).data()));
1246*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1247*9356374aSAndroid Build Coastguard Worker         0,
1248*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int8_t>>(L::Partial(5, 3).Slice<0>(p)).data()));
1249*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1250*9356374aSAndroid Build Coastguard Worker         8,
1251*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int32_t>>(L::Partial(5, 3).Slice<1>(p)).data()));
1252*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1253*9356374aSAndroid Build Coastguard Worker         0, Distance(
1254*9356374aSAndroid Build Coastguard Worker                p, Type<Span<int8_t>>(L::Partial(0, 0, 0).Slice<0>(p)).data()));
1255*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1256*9356374aSAndroid Build Coastguard Worker         0, Distance(
1257*9356374aSAndroid Build Coastguard Worker                p, Type<Span<int32_t>>(L::Partial(0, 0, 0).Slice<1>(p)).data()));
1258*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1259*9356374aSAndroid Build Coastguard Worker         0, Distance(
1260*9356374aSAndroid Build Coastguard Worker                p, Type<Span<Int128>>(L::Partial(0, 0, 0).Slice<2>(p)).data()));
1261*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1262*9356374aSAndroid Build Coastguard Worker         0, Distance(
1263*9356374aSAndroid Build Coastguard Worker                p, Type<Span<int8_t>>(L::Partial(1, 0, 0).Slice<0>(p)).data()));
1264*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1265*9356374aSAndroid Build Coastguard Worker         4, Distance(
1266*9356374aSAndroid Build Coastguard Worker                p, Type<Span<int32_t>>(L::Partial(1, 0, 0).Slice<1>(p)).data()));
1267*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1268*9356374aSAndroid Build Coastguard Worker         8, Distance(
1269*9356374aSAndroid Build Coastguard Worker                p, Type<Span<Int128>>(L::Partial(1, 0, 0).Slice<2>(p)).data()));
1270*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1271*9356374aSAndroid Build Coastguard Worker         0, Distance(
1272*9356374aSAndroid Build Coastguard Worker                p, Type<Span<int8_t>>(L::Partial(5, 3, 1).Slice<0>(p)).data()));
1273*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1274*9356374aSAndroid Build Coastguard Worker         24, Distance(
1275*9356374aSAndroid Build Coastguard Worker                 p, Type<Span<Int128>>(L::Partial(5, 3, 1).Slice<2>(p)).data()));
1276*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1277*9356374aSAndroid Build Coastguard Worker         8, Distance(
1278*9356374aSAndroid Build Coastguard Worker                p, Type<Span<int32_t>>(L::Partial(5, 3, 1).Slice<1>(p)).data()));
1279*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
1280*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<Span<int8_t>>(L(5, 3, 1).Slice<0>(p)).data()));
1281*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(24,
1282*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<Span<Int128>>(L(5, 3, 1).Slice<2>(p)).data()));
1283*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(8,
1284*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<Span<int32_t>>(L(5, 3, 1).Slice<1>(p)).data()));
1285*9356374aSAndroid Build Coastguard Worker   }
1286*9356374aSAndroid Build Coastguard Worker }
1287*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,MutableSliceByTypeData)1288*9356374aSAndroid Build Coastguard Worker TEST(Layout, MutableSliceByTypeData) {
1289*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
1290*9356374aSAndroid Build Coastguard Worker   {
1291*9356374aSAndroid Build Coastguard Worker     using L = Layout<int32_t>;
1292*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1293*9356374aSAndroid Build Coastguard Worker         0, Distance(
1294*9356374aSAndroid Build Coastguard Worker                p, Type<Span<int32_t>>(L::Partial(0).Slice<int32_t>(p)).data()));
1295*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1296*9356374aSAndroid Build Coastguard Worker         0, Distance(
1297*9356374aSAndroid Build Coastguard Worker                p, Type<Span<int32_t>>(L::Partial(3).Slice<int32_t>(p)).data()));
1298*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0,
1299*9356374aSAndroid Build Coastguard Worker               Distance(p, Type<Span<int32_t>>(L(3).Slice<int32_t>(p)).data()));
1300*9356374aSAndroid Build Coastguard Worker   }
1301*9356374aSAndroid Build Coastguard Worker   {
1302*9356374aSAndroid Build Coastguard Worker     using L = Layout<int8_t, int32_t, Int128>;
1303*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1304*9356374aSAndroid Build Coastguard Worker         0,
1305*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int8_t>>(L::Partial(0).Slice<int8_t>(p)).data()));
1306*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1307*9356374aSAndroid Build Coastguard Worker         0,
1308*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int8_t>>(L::Partial(1).Slice<int8_t>(p)).data()));
1309*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1310*9356374aSAndroid Build Coastguard Worker         0,
1311*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int8_t>>(L::Partial(5).Slice<int8_t>(p)).data()));
1312*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1313*9356374aSAndroid Build Coastguard Worker         0,
1314*9356374aSAndroid Build Coastguard Worker         Distance(p,
1315*9356374aSAndroid Build Coastguard Worker                  Type<Span<int8_t>>(L::Partial(0, 0).Slice<int8_t>(p)).data()));
1316*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1317*9356374aSAndroid Build Coastguard Worker         0,
1318*9356374aSAndroid Build Coastguard Worker         Distance(
1319*9356374aSAndroid Build Coastguard Worker             p, Type<Span<int32_t>>(L::Partial(0, 0).Slice<int32_t>(p)).data()));
1320*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1321*9356374aSAndroid Build Coastguard Worker         0,
1322*9356374aSAndroid Build Coastguard Worker         Distance(p,
1323*9356374aSAndroid Build Coastguard Worker                  Type<Span<int8_t>>(L::Partial(1, 0).Slice<int8_t>(p)).data()));
1324*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1325*9356374aSAndroid Build Coastguard Worker         4,
1326*9356374aSAndroid Build Coastguard Worker         Distance(
1327*9356374aSAndroid Build Coastguard Worker             p, Type<Span<int32_t>>(L::Partial(1, 0).Slice<int32_t>(p)).data()));
1328*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1329*9356374aSAndroid Build Coastguard Worker         0,
1330*9356374aSAndroid Build Coastguard Worker         Distance(p,
1331*9356374aSAndroid Build Coastguard Worker                  Type<Span<int8_t>>(L::Partial(5, 3).Slice<int8_t>(p)).data()));
1332*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1333*9356374aSAndroid Build Coastguard Worker         8,
1334*9356374aSAndroid Build Coastguard Worker         Distance(
1335*9356374aSAndroid Build Coastguard Worker             p, Type<Span<int32_t>>(L::Partial(5, 3).Slice<int32_t>(p)).data()));
1336*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1337*9356374aSAndroid Build Coastguard Worker         0,
1338*9356374aSAndroid Build Coastguard Worker         Distance(
1339*9356374aSAndroid Build Coastguard Worker             p,
1340*9356374aSAndroid Build Coastguard Worker             Type<Span<int8_t>>(L::Partial(0, 0, 0).Slice<int8_t>(p)).data()));
1341*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1342*9356374aSAndroid Build Coastguard Worker         0,
1343*9356374aSAndroid Build Coastguard Worker         Distance(
1344*9356374aSAndroid Build Coastguard Worker             p,
1345*9356374aSAndroid Build Coastguard Worker             Type<Span<int32_t>>(L::Partial(0, 0, 0).Slice<int32_t>(p)).data()));
1346*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1347*9356374aSAndroid Build Coastguard Worker         0,
1348*9356374aSAndroid Build Coastguard Worker         Distance(
1349*9356374aSAndroid Build Coastguard Worker             p,
1350*9356374aSAndroid Build Coastguard Worker             Type<Span<Int128>>(L::Partial(0, 0, 0).Slice<Int128>(p)).data()));
1351*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1352*9356374aSAndroid Build Coastguard Worker         0,
1353*9356374aSAndroid Build Coastguard Worker         Distance(
1354*9356374aSAndroid Build Coastguard Worker             p,
1355*9356374aSAndroid Build Coastguard Worker             Type<Span<int8_t>>(L::Partial(1, 0, 0).Slice<int8_t>(p)).data()));
1356*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1357*9356374aSAndroid Build Coastguard Worker         4,
1358*9356374aSAndroid Build Coastguard Worker         Distance(
1359*9356374aSAndroid Build Coastguard Worker             p,
1360*9356374aSAndroid Build Coastguard Worker             Type<Span<int32_t>>(L::Partial(1, 0, 0).Slice<int32_t>(p)).data()));
1361*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1362*9356374aSAndroid Build Coastguard Worker         8,
1363*9356374aSAndroid Build Coastguard Worker         Distance(
1364*9356374aSAndroid Build Coastguard Worker             p,
1365*9356374aSAndroid Build Coastguard Worker             Type<Span<Int128>>(L::Partial(1, 0, 0).Slice<Int128>(p)).data()));
1366*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1367*9356374aSAndroid Build Coastguard Worker         0,
1368*9356374aSAndroid Build Coastguard Worker         Distance(
1369*9356374aSAndroid Build Coastguard Worker             p,
1370*9356374aSAndroid Build Coastguard Worker             Type<Span<int8_t>>(L::Partial(5, 3, 1).Slice<int8_t>(p)).data()));
1371*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1372*9356374aSAndroid Build Coastguard Worker         24,
1373*9356374aSAndroid Build Coastguard Worker         Distance(
1374*9356374aSAndroid Build Coastguard Worker             p,
1375*9356374aSAndroid Build Coastguard Worker             Type<Span<Int128>>(L::Partial(5, 3, 1).Slice<Int128>(p)).data()));
1376*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1377*9356374aSAndroid Build Coastguard Worker         8,
1378*9356374aSAndroid Build Coastguard Worker         Distance(
1379*9356374aSAndroid Build Coastguard Worker             p,
1380*9356374aSAndroid Build Coastguard Worker             Type<Span<int32_t>>(L::Partial(5, 3, 1).Slice<int32_t>(p)).data()));
1381*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1382*9356374aSAndroid Build Coastguard Worker         0, Distance(p, Type<Span<int8_t>>(L(5, 3, 1).Slice<int8_t>(p)).data()));
1383*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1384*9356374aSAndroid Build Coastguard Worker         24,
1385*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<Int128>>(L(5, 3, 1).Slice<Int128>(p)).data()));
1386*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1387*9356374aSAndroid Build Coastguard Worker         8,
1388*9356374aSAndroid Build Coastguard Worker         Distance(p, Type<Span<int32_t>>(L(5, 3, 1).Slice<int32_t>(p)).data()));
1389*9356374aSAndroid Build Coastguard Worker   }
1390*9356374aSAndroid Build Coastguard Worker }
1391*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticSliceData)1392*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticSliceData) {
1393*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char cp[100] = {0};
1394*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
1395*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int32_t, Int128>;
1396*9356374aSAndroid Build Coastguard Worker   using SL = L::WithStaticSizes<3, 5>;
1397*9356374aSAndroid Build Coastguard Worker 
1398*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, Distance(cp, SL::Partial().Slice<0>(cp).data()));
1399*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, Distance(cp, SL::Partial().Slice<int8_t>(cp).data()));
1400*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, Distance(cp, SL::Partial(7).Slice<0>(cp).data()));
1401*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, Distance(cp, SL::Partial(7).Slice<int8_t>(cp).data()));
1402*9356374aSAndroid Build Coastguard Worker 
1403*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, Distance(cp, SL::Partial().Slice<1>(cp).data()));
1404*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, Distance(cp, SL::Partial().Slice<int32_t>(cp).data()));
1405*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, Distance(cp, SL::Partial(7).Slice<1>(cp).data()));
1406*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, Distance(cp, SL::Partial(7).Slice<int32_t>(cp).data()));
1407*9356374aSAndroid Build Coastguard Worker 
1408*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, Distance(cp, SL::Partial(7).Slice<2>(cp).data()));
1409*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, Distance(cp, SL::Partial(7).Slice<Int128>(cp).data()));
1410*9356374aSAndroid Build Coastguard Worker 
1411*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, Distance(p, SL::Partial().Slice<0>(p).data()));
1412*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, Distance(p, SL::Partial().Slice<int8_t>(p).data()));
1413*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, Distance(p, SL::Partial(7).Slice<0>(p).data()));
1414*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, Distance(p, SL::Partial(7).Slice<int8_t>(p).data()));
1415*9356374aSAndroid Build Coastguard Worker 
1416*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, Distance(p, SL::Partial().Slice<1>(p).data()));
1417*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, Distance(p, SL::Partial().Slice<int32_t>(p).data()));
1418*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, Distance(p, SL::Partial(7).Slice<1>(p).data()));
1419*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, Distance(p, SL::Partial(7).Slice<int32_t>(p).data()));
1420*9356374aSAndroid Build Coastguard Worker 
1421*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, Distance(p, SL::Partial(7).Slice<2>(p).data()));
1422*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, Distance(p, SL::Partial(7).Slice<Int128>(p).data()));
1423*9356374aSAndroid Build Coastguard Worker }
1424*9356374aSAndroid Build Coastguard Worker 
1425*9356374aSAndroid Build Coastguard Worker MATCHER_P(IsSameSlice, slice, "") {
1426*9356374aSAndroid Build Coastguard Worker   return arg.size() == slice.size() && arg.data() == slice.data();
1427*9356374aSAndroid Build Coastguard Worker }
1428*9356374aSAndroid Build Coastguard Worker 
1429*9356374aSAndroid Build Coastguard Worker template <typename... M>
1430*9356374aSAndroid Build Coastguard Worker class TupleMatcher {
1431*9356374aSAndroid Build Coastguard Worker  public:
TupleMatcher(M...matchers)1432*9356374aSAndroid Build Coastguard Worker   explicit TupleMatcher(M... matchers) : matchers_(std::move(matchers)...) {}
1433*9356374aSAndroid Build Coastguard Worker 
1434*9356374aSAndroid Build Coastguard Worker   template <typename Tuple>
MatchAndExplain(const Tuple & p,testing::MatchResultListener *) const1435*9356374aSAndroid Build Coastguard Worker   bool MatchAndExplain(const Tuple& p,
1436*9356374aSAndroid Build Coastguard Worker                        testing::MatchResultListener* /* listener */) const {
1437*9356374aSAndroid Build Coastguard Worker     static_assert(std::tuple_size<Tuple>::value == sizeof...(M), "");
1438*9356374aSAndroid Build Coastguard Worker     return MatchAndExplainImpl(
1439*9356374aSAndroid Build Coastguard Worker         p, absl::make_index_sequence<std::tuple_size<Tuple>::value>{});
1440*9356374aSAndroid Build Coastguard Worker   }
1441*9356374aSAndroid Build Coastguard Worker 
1442*9356374aSAndroid Build Coastguard Worker   // For the matcher concept. Left empty as we don't really need the diagnostics
1443*9356374aSAndroid Build Coastguard Worker   // right now.
DescribeTo(::std::ostream * os) const1444*9356374aSAndroid Build Coastguard Worker   void DescribeTo(::std::ostream* os) const {}
DescribeNegationTo(::std::ostream * os) const1445*9356374aSAndroid Build Coastguard Worker   void DescribeNegationTo(::std::ostream* os) const {}
1446*9356374aSAndroid Build Coastguard Worker 
1447*9356374aSAndroid Build Coastguard Worker  private:
1448*9356374aSAndroid Build Coastguard Worker   template <typename Tuple, size_t... Is>
MatchAndExplainImpl(const Tuple & p,absl::index_sequence<Is...>) const1449*9356374aSAndroid Build Coastguard Worker   bool MatchAndExplainImpl(const Tuple& p, absl::index_sequence<Is...>) const {
1450*9356374aSAndroid Build Coastguard Worker     // Using std::min as a simple variadic "and".
1451*9356374aSAndroid Build Coastguard Worker     return std::min(
1452*9356374aSAndroid Build Coastguard Worker         {true, testing::SafeMatcherCast<
1453*9356374aSAndroid Build Coastguard Worker                    const typename std::tuple_element<Is, Tuple>::type&>(
1454*9356374aSAndroid Build Coastguard Worker                    std::get<Is>(matchers_))
1455*9356374aSAndroid Build Coastguard Worker                    .Matches(std::get<Is>(p))...});
1456*9356374aSAndroid Build Coastguard Worker   }
1457*9356374aSAndroid Build Coastguard Worker 
1458*9356374aSAndroid Build Coastguard Worker   std::tuple<M...> matchers_;
1459*9356374aSAndroid Build Coastguard Worker };
1460*9356374aSAndroid Build Coastguard Worker 
1461*9356374aSAndroid Build Coastguard Worker template <typename... M>
Tuple(M...matchers)1462*9356374aSAndroid Build Coastguard Worker testing::PolymorphicMatcher<TupleMatcher<M...>> Tuple(M... matchers) {
1463*9356374aSAndroid Build Coastguard Worker   return testing::MakePolymorphicMatcher(
1464*9356374aSAndroid Build Coastguard Worker       TupleMatcher<M...>(std::move(matchers)...));
1465*9356374aSAndroid Build Coastguard Worker }
1466*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,Slices)1467*9356374aSAndroid Build Coastguard Worker TEST(Layout, Slices) {
1468*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char p[100] = {0};
1469*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int8_t, Int128>;
1470*9356374aSAndroid Build Coastguard Worker   {
1471*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial();
1472*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(Type<std::tuple<>>(x.Slices(p)), Tuple());
1473*9356374aSAndroid Build Coastguard Worker   }
1474*9356374aSAndroid Build Coastguard Worker   {
1475*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1);
1476*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(Type<std::tuple<Span<const int8_t>>>(x.Slices(p)),
1477*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p))));
1478*9356374aSAndroid Build Coastguard Worker   }
1479*9356374aSAndroid Build Coastguard Worker   {
1480*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1, 2);
1481*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(
1482*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<Span<const int8_t>, Span<const int8_t>>>(x.Slices(p))),
1483*9356374aSAndroid Build Coastguard Worker         Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p))));
1484*9356374aSAndroid Build Coastguard Worker   }
1485*9356374aSAndroid Build Coastguard Worker   {
1486*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1, 2, 3);
1487*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<const int8_t>, Span<const int8_t>,
1488*9356374aSAndroid Build Coastguard Worker                                  Span<const Int128>>>(x.Slices(p))),
1489*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)),
1490*9356374aSAndroid Build Coastguard Worker                       IsSameSlice(x.Slice<2>(p))));
1491*9356374aSAndroid Build Coastguard Worker   }
1492*9356374aSAndroid Build Coastguard Worker   {
1493*9356374aSAndroid Build Coastguard Worker     const L x(1, 2, 3);
1494*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<const int8_t>, Span<const int8_t>,
1495*9356374aSAndroid Build Coastguard Worker                                  Span<const Int128>>>(x.Slices(p))),
1496*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)),
1497*9356374aSAndroid Build Coastguard Worker                       IsSameSlice(x.Slice<2>(p))));
1498*9356374aSAndroid Build Coastguard Worker   }
1499*9356374aSAndroid Build Coastguard Worker }
1500*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,MutableSlices)1501*9356374aSAndroid Build Coastguard Worker TEST(Layout, MutableSlices) {
1502*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
1503*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, int8_t, Int128>;
1504*9356374aSAndroid Build Coastguard Worker   {
1505*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial();
1506*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(Type<std::tuple<>>(x.Slices(p)), Tuple());
1507*9356374aSAndroid Build Coastguard Worker   }
1508*9356374aSAndroid Build Coastguard Worker   {
1509*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1);
1510*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(Type<std::tuple<Span<int8_t>>>(x.Slices(p)),
1511*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p))));
1512*9356374aSAndroid Build Coastguard Worker   }
1513*9356374aSAndroid Build Coastguard Worker   {
1514*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1, 2);
1515*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<int8_t>, Span<int8_t>>>(x.Slices(p))),
1516*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p))));
1517*9356374aSAndroid Build Coastguard Worker   }
1518*9356374aSAndroid Build Coastguard Worker   {
1519*9356374aSAndroid Build Coastguard Worker     const auto x = L::Partial(1, 2, 3);
1520*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<int8_t>, Span<int8_t>, Span<Int128>>>(
1521*9356374aSAndroid Build Coastguard Worker                     x.Slices(p))),
1522*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)),
1523*9356374aSAndroid Build Coastguard Worker                       IsSameSlice(x.Slice<2>(p))));
1524*9356374aSAndroid Build Coastguard Worker   }
1525*9356374aSAndroid Build Coastguard Worker   {
1526*9356374aSAndroid Build Coastguard Worker     const L x(1, 2, 3);
1527*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<int8_t>, Span<int8_t>, Span<Int128>>>(
1528*9356374aSAndroid Build Coastguard Worker                     x.Slices(p))),
1529*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)),
1530*9356374aSAndroid Build Coastguard Worker                       IsSameSlice(x.Slice<2>(p))));
1531*9356374aSAndroid Build Coastguard Worker   }
1532*9356374aSAndroid Build Coastguard Worker }
1533*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticSlices)1534*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticSlices) {
1535*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char cp[100] = {0};
1536*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[100] = {0};
1537*9356374aSAndroid Build Coastguard Worker   using SL = Layout<int8_t, int8_t, Int128>::WithStaticSizes<1, 2>;
1538*9356374aSAndroid Build Coastguard Worker   {
1539*9356374aSAndroid Build Coastguard Worker     const auto x = SL::Partial();
1540*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(
1541*9356374aSAndroid Build Coastguard Worker         (Type<std::tuple<Span<const int8_t>, Span<const int8_t>>>(
1542*9356374aSAndroid Build Coastguard Worker             x.Slices(cp))),
1543*9356374aSAndroid Build Coastguard Worker         Tuple(IsSameSlice(x.Slice<0>(cp)), IsSameSlice(x.Slice<1>(cp))));
1544*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<int8_t>, Span<int8_t>>>(x.Slices(p))),
1545*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p))));
1546*9356374aSAndroid Build Coastguard Worker   }
1547*9356374aSAndroid Build Coastguard Worker   {
1548*9356374aSAndroid Build Coastguard Worker     const auto x = SL::Partial(3);
1549*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<const int8_t>, Span<const int8_t>,
1550*9356374aSAndroid Build Coastguard Worker                                  Span<const Int128>>>(x.Slices(cp))),
1551*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(cp)), IsSameSlice(x.Slice<1>(cp)),
1552*9356374aSAndroid Build Coastguard Worker                       IsSameSlice(x.Slice<2>(cp))));
1553*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<int8_t>, Span<int8_t>, Span<Int128>>>(
1554*9356374aSAndroid Build Coastguard Worker                     x.Slices(p))),
1555*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)),
1556*9356374aSAndroid Build Coastguard Worker                       IsSameSlice(x.Slice<2>(p))));
1557*9356374aSAndroid Build Coastguard Worker   }
1558*9356374aSAndroid Build Coastguard Worker   {
1559*9356374aSAndroid Build Coastguard Worker     const SL x(3);
1560*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<const int8_t>, Span<const int8_t>,
1561*9356374aSAndroid Build Coastguard Worker                                  Span<const Int128>>>(x.Slices(cp))),
1562*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(cp)), IsSameSlice(x.Slice<1>(cp)),
1563*9356374aSAndroid Build Coastguard Worker                       IsSameSlice(x.Slice<2>(cp))));
1564*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT((Type<std::tuple<Span<int8_t>, Span<int8_t>, Span<Int128>>>(
1565*9356374aSAndroid Build Coastguard Worker                     x.Slices(p))),
1566*9356374aSAndroid Build Coastguard Worker                 Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)),
1567*9356374aSAndroid Build Coastguard Worker                       IsSameSlice(x.Slice<2>(p))));
1568*9356374aSAndroid Build Coastguard Worker   }
1569*9356374aSAndroid Build Coastguard Worker }
1570*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,UnalignedTypes)1571*9356374aSAndroid Build Coastguard Worker TEST(Layout, UnalignedTypes) {
1572*9356374aSAndroid Build Coastguard Worker   constexpr Layout<unsigned char, unsigned char, unsigned char> x(1, 2, 3);
1573*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[x.AllocSize() + 1];
1574*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(x.Pointers(p + 1), Tuple(p + 1, p + 2, p + 4));
1575*9356374aSAndroid Build Coastguard Worker }
1576*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,CustomAlignment)1577*9356374aSAndroid Build Coastguard Worker TEST(Layout, CustomAlignment) {
1578*9356374aSAndroid Build Coastguard Worker   constexpr Layout<unsigned char, Aligned<unsigned char, 8>> x(1, 2);
1579*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char p[x.AllocSize()];
1580*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(10, x.AllocSize());
1581*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(x.Pointers(p), Tuple(p + 0, p + 8));
1582*9356374aSAndroid Build Coastguard Worker }
1583*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,OverAligned)1584*9356374aSAndroid Build Coastguard Worker TEST(Layout, OverAligned) {
1585*9356374aSAndroid Build Coastguard Worker   constexpr size_t M = alignof(max_align_t);
1586*9356374aSAndroid Build Coastguard Worker   constexpr Layout<unsigned char, Aligned<unsigned char, 2 * M>> x(1, 3);
1587*9356374aSAndroid Build Coastguard Worker #ifdef __GNUC__
1588*9356374aSAndroid Build Coastguard Worker   // Using __attribute__ ((aligned ())) instead of alignas to bypass a gcc bug:
1589*9356374aSAndroid Build Coastguard Worker   // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89357
1590*9356374aSAndroid Build Coastguard Worker   __attribute__((aligned(2 * M))) unsigned char p[x.AllocSize()];
1591*9356374aSAndroid Build Coastguard Worker #else
1592*9356374aSAndroid Build Coastguard Worker   alignas(2 * M) unsigned char p[x.AllocSize()];
1593*9356374aSAndroid Build Coastguard Worker #endif
1594*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2 * M + 3, x.AllocSize());
1595*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(x.Pointers(p), Tuple(p + 0, p + 2 * M));
1596*9356374aSAndroid Build Coastguard Worker }
1597*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,Alignment)1598*9356374aSAndroid Build Coastguard Worker TEST(Layout, Alignment) {
1599*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int8_t>::Alignment() == 1, "");
1600*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int32_t>::Alignment() == 4, "");
1601*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<Int64>::Alignment() == 8, "");
1602*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<Aligned<int8_t, 64>>::Alignment() == 64, "");
1603*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int8_t, int32_t, Int64>::Alignment() == 8, "");
1604*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int8_t, Int64, int32_t>::Alignment() == 8, "");
1605*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int32_t, int8_t, Int64>::Alignment() == 8, "");
1606*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int32_t, Int64, int8_t>::Alignment() == 8, "");
1607*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<Int64, int8_t, int32_t>::Alignment() == 8, "");
1608*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<Int64, int32_t, int8_t>::Alignment() == 8, "");
1609*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<Int64, int32_t, int8_t>::Alignment() == 8, "");
1610*9356374aSAndroid Build Coastguard Worker   static_assert(
1611*9356374aSAndroid Build Coastguard Worker       Layout<Aligned<int8_t, 64>>::WithStaticSizes<>::Alignment() == 64, "");
1612*9356374aSAndroid Build Coastguard Worker   static_assert(
1613*9356374aSAndroid Build Coastguard Worker       Layout<Aligned<int8_t, 64>>::WithStaticSizes<2>::Alignment() == 64, "");
1614*9356374aSAndroid Build Coastguard Worker }
1615*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticAlignment)1616*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticAlignment) {
1617*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int8_t>::WithStaticSizes<>::Alignment() == 1, "");
1618*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int8_t>::WithStaticSizes<0>::Alignment() == 1, "");
1619*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int8_t>::WithStaticSizes<7>::Alignment() == 1, "");
1620*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int32_t>::WithStaticSizes<>::Alignment() == 4, "");
1621*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int32_t>::WithStaticSizes<0>::Alignment() == 4, "");
1622*9356374aSAndroid Build Coastguard Worker   static_assert(Layout<int32_t>::WithStaticSizes<3>::Alignment() == 4, "");
1623*9356374aSAndroid Build Coastguard Worker   static_assert(
1624*9356374aSAndroid Build Coastguard Worker       Layout<Aligned<int8_t, 64>>::WithStaticSizes<>::Alignment() == 64, "");
1625*9356374aSAndroid Build Coastguard Worker   static_assert(
1626*9356374aSAndroid Build Coastguard Worker       Layout<Aligned<int8_t, 64>>::WithStaticSizes<0>::Alignment() == 64, "");
1627*9356374aSAndroid Build Coastguard Worker   static_assert(
1628*9356374aSAndroid Build Coastguard Worker       Layout<Aligned<int8_t, 64>>::WithStaticSizes<2>::Alignment() == 64, "");
1629*9356374aSAndroid Build Coastguard Worker   static_assert(
1630*9356374aSAndroid Build Coastguard Worker       Layout<int32_t, Int64, int8_t>::WithStaticSizes<>::Alignment() == 8, "");
1631*9356374aSAndroid Build Coastguard Worker   static_assert(
1632*9356374aSAndroid Build Coastguard Worker       Layout<int32_t, Int64, int8_t>::WithStaticSizes<0, 0, 0>::Alignment() ==
1633*9356374aSAndroid Build Coastguard Worker           8,
1634*9356374aSAndroid Build Coastguard Worker       "");
1635*9356374aSAndroid Build Coastguard Worker   static_assert(
1636*9356374aSAndroid Build Coastguard Worker       Layout<int32_t, Int64, int8_t>::WithStaticSizes<1, 1, 1>::Alignment() ==
1637*9356374aSAndroid Build Coastguard Worker           8,
1638*9356374aSAndroid Build Coastguard Worker       "");
1639*9356374aSAndroid Build Coastguard Worker }
1640*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,ConstexprPartial)1641*9356374aSAndroid Build Coastguard Worker TEST(Layout, ConstexprPartial) {
1642*9356374aSAndroid Build Coastguard Worker   constexpr size_t M = alignof(max_align_t);
1643*9356374aSAndroid Build Coastguard Worker   constexpr Layout<unsigned char, Aligned<unsigned char, 2 * M>> x(1, 3);
1644*9356374aSAndroid Build Coastguard Worker   static_assert(x.Partial(1).template Offset<1>() == 2 * M, "");
1645*9356374aSAndroid Build Coastguard Worker }
1646*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticConstexpr)1647*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticConstexpr) {
1648*9356374aSAndroid Build Coastguard Worker   constexpr size_t M = alignof(max_align_t);
1649*9356374aSAndroid Build Coastguard Worker   using L = Layout<unsigned char, Aligned<unsigned char, 2 * M>>;
1650*9356374aSAndroid Build Coastguard Worker   using SL = L::WithStaticSizes<1, 3>;
1651*9356374aSAndroid Build Coastguard Worker   constexpr SL x;
1652*9356374aSAndroid Build Coastguard Worker   static_assert(x.Offset<1>() == 2 * M, "");
1653*9356374aSAndroid Build Coastguard Worker }
1654*9356374aSAndroid Build Coastguard Worker 
1655*9356374aSAndroid Build Coastguard Worker // [from, to)
1656*9356374aSAndroid Build Coastguard Worker struct Region {
1657*9356374aSAndroid Build Coastguard Worker   size_t from;
1658*9356374aSAndroid Build Coastguard Worker   size_t to;
1659*9356374aSAndroid Build Coastguard Worker };
1660*9356374aSAndroid Build Coastguard Worker 
ExpectRegionPoisoned(const unsigned char * p,size_t n,bool poisoned)1661*9356374aSAndroid Build Coastguard Worker void ExpectRegionPoisoned(const unsigned char* p, size_t n, bool poisoned) {
1662*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_HAVE_ADDRESS_SANITIZER
1663*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i != n; ++i) {
1664*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(poisoned, __asan_address_is_poisoned(p + i));
1665*9356374aSAndroid Build Coastguard Worker   }
1666*9356374aSAndroid Build Coastguard Worker #endif
1667*9356374aSAndroid Build Coastguard Worker }
1668*9356374aSAndroid Build Coastguard Worker 
1669*9356374aSAndroid Build Coastguard Worker template <size_t N>
ExpectPoisoned(const unsigned char (& buf)[N],std::initializer_list<Region> reg)1670*9356374aSAndroid Build Coastguard Worker void ExpectPoisoned(const unsigned char (&buf)[N],
1671*9356374aSAndroid Build Coastguard Worker                     std::initializer_list<Region> reg) {
1672*9356374aSAndroid Build Coastguard Worker   size_t prev = 0;
1673*9356374aSAndroid Build Coastguard Worker   for (const Region& r : reg) {
1674*9356374aSAndroid Build Coastguard Worker     ExpectRegionPoisoned(buf + prev, r.from - prev, false);
1675*9356374aSAndroid Build Coastguard Worker     ExpectRegionPoisoned(buf + r.from, r.to - r.from, true);
1676*9356374aSAndroid Build Coastguard Worker     prev = r.to;
1677*9356374aSAndroid Build Coastguard Worker   }
1678*9356374aSAndroid Build Coastguard Worker   ExpectRegionPoisoned(buf + prev, N - prev, false);
1679*9356374aSAndroid Build Coastguard Worker }
1680*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,PoisonPadding)1681*9356374aSAndroid Build Coastguard Worker TEST(Layout, PoisonPadding) {
1682*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, Int64, int32_t, Int128>;
1683*9356374aSAndroid Build Coastguard Worker 
1684*9356374aSAndroid Build Coastguard Worker   constexpr size_t n = L::Partial(1, 2, 3, 4).AllocSize();
1685*9356374aSAndroid Build Coastguard Worker   {
1686*9356374aSAndroid Build Coastguard Worker     constexpr auto x = L::Partial();
1687*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1688*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1689*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1690*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {});
1691*9356374aSAndroid Build Coastguard Worker   }
1692*9356374aSAndroid Build Coastguard Worker   {
1693*9356374aSAndroid Build Coastguard Worker     constexpr auto x = L::Partial(1);
1694*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1695*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1696*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1697*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {{1, 8}});
1698*9356374aSAndroid Build Coastguard Worker   }
1699*9356374aSAndroid Build Coastguard Worker   {
1700*9356374aSAndroid Build Coastguard Worker     constexpr auto x = L::Partial(1, 2);
1701*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1702*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1703*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1704*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {{1, 8}});
1705*9356374aSAndroid Build Coastguard Worker   }
1706*9356374aSAndroid Build Coastguard Worker   {
1707*9356374aSAndroid Build Coastguard Worker     constexpr auto x = L::Partial(1, 2, 3);
1708*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1709*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1710*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1711*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {{1, 8}, {36, 40}});
1712*9356374aSAndroid Build Coastguard Worker   }
1713*9356374aSAndroid Build Coastguard Worker   {
1714*9356374aSAndroid Build Coastguard Worker     constexpr auto x = L::Partial(1, 2, 3, 4);
1715*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1716*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1717*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1718*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {{1, 8}, {36, 40}});
1719*9356374aSAndroid Build Coastguard Worker   }
1720*9356374aSAndroid Build Coastguard Worker   {
1721*9356374aSAndroid Build Coastguard Worker     constexpr L x(1, 2, 3, 4);
1722*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1723*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1724*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1725*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {{1, 8}, {36, 40}});
1726*9356374aSAndroid Build Coastguard Worker   }
1727*9356374aSAndroid Build Coastguard Worker }
1728*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticPoisonPadding)1729*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticPoisonPadding) {
1730*9356374aSAndroid Build Coastguard Worker   using L = Layout<int8_t, Int64, int32_t, Int128>;
1731*9356374aSAndroid Build Coastguard Worker   using SL = L::WithStaticSizes<1, 2>;
1732*9356374aSAndroid Build Coastguard Worker 
1733*9356374aSAndroid Build Coastguard Worker   constexpr size_t n = L::Partial(1, 2, 3, 4).AllocSize();
1734*9356374aSAndroid Build Coastguard Worker   {
1735*9356374aSAndroid Build Coastguard Worker     constexpr auto x = SL::Partial();
1736*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1737*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1738*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1739*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {{1, 8}});
1740*9356374aSAndroid Build Coastguard Worker   }
1741*9356374aSAndroid Build Coastguard Worker   {
1742*9356374aSAndroid Build Coastguard Worker     constexpr auto x = SL::Partial(3);
1743*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1744*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1745*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1746*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {{1, 8}, {36, 40}});
1747*9356374aSAndroid Build Coastguard Worker   }
1748*9356374aSAndroid Build Coastguard Worker   {
1749*9356374aSAndroid Build Coastguard Worker     constexpr auto x = SL::Partial(3, 4);
1750*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1751*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1752*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1753*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {{1, 8}, {36, 40}});
1754*9356374aSAndroid Build Coastguard Worker   }
1755*9356374aSAndroid Build Coastguard Worker   {
1756*9356374aSAndroid Build Coastguard Worker     constexpr SL x(3, 4);
1757*9356374aSAndroid Build Coastguard Worker     alignas(max_align_t) const unsigned char c[n] = {};
1758*9356374aSAndroid Build Coastguard Worker     x.PoisonPadding(c);
1759*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(x.Slices(c), x.Slices(c));
1760*9356374aSAndroid Build Coastguard Worker     ExpectPoisoned(c, {{1, 8}, {36, 40}});
1761*9356374aSAndroid Build Coastguard Worker   }
1762*9356374aSAndroid Build Coastguard Worker }
1763*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,DebugString)1764*9356374aSAndroid Build Coastguard Worker TEST(Layout, DebugString) {
1765*9356374aSAndroid Build Coastguard Worker   {
1766*9356374aSAndroid Build Coastguard Worker     constexpr auto x = Layout<int8_t, int32_t, int8_t, Int128>::Partial();
1767*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("@0<signed char>(1)", x.DebugString());
1768*9356374aSAndroid Build Coastguard Worker   }
1769*9356374aSAndroid Build Coastguard Worker   {
1770*9356374aSAndroid Build Coastguard Worker     constexpr auto x = Layout<int8_t, int32_t, int8_t, Int128>::Partial(1);
1771*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("@0<signed char>(1)[1]; @4<int>(4)", x.DebugString());
1772*9356374aSAndroid Build Coastguard Worker   }
1773*9356374aSAndroid Build Coastguard Worker   {
1774*9356374aSAndroid Build Coastguard Worker     constexpr auto x = Layout<int8_t, int32_t, int8_t, Int128>::Partial(1, 2);
1775*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("@0<signed char>(1)[1]; @4<int>(4)[2]; @12<signed char>(1)",
1776*9356374aSAndroid Build Coastguard Worker               x.DebugString());
1777*9356374aSAndroid Build Coastguard Worker   }
1778*9356374aSAndroid Build Coastguard Worker   {
1779*9356374aSAndroid Build Coastguard Worker     constexpr auto x =
1780*9356374aSAndroid Build Coastguard Worker         Layout<int8_t, int32_t, int8_t, Int128>::Partial(1, 2, 3);
1781*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1782*9356374aSAndroid Build Coastguard Worker         "@0<signed char>(1)[1]; @4<int>(4)[2]; @12<signed char>(1)[3]; "
1783*9356374aSAndroid Build Coastguard Worker         "@16" +
1784*9356374aSAndroid Build Coastguard Worker             Int128::Name() + "(16)",
1785*9356374aSAndroid Build Coastguard Worker         x.DebugString());
1786*9356374aSAndroid Build Coastguard Worker   }
1787*9356374aSAndroid Build Coastguard Worker   {
1788*9356374aSAndroid Build Coastguard Worker     constexpr auto x =
1789*9356374aSAndroid Build Coastguard Worker         Layout<int8_t, int32_t, int8_t, Int128>::Partial(1, 2, 3, 4);
1790*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1791*9356374aSAndroid Build Coastguard Worker         "@0<signed char>(1)[1]; @4<int>(4)[2]; @12<signed char>(1)[3]; "
1792*9356374aSAndroid Build Coastguard Worker         "@16" +
1793*9356374aSAndroid Build Coastguard Worker             Int128::Name() + "(16)[4]",
1794*9356374aSAndroid Build Coastguard Worker         x.DebugString());
1795*9356374aSAndroid Build Coastguard Worker   }
1796*9356374aSAndroid Build Coastguard Worker   {
1797*9356374aSAndroid Build Coastguard Worker     constexpr Layout<int8_t, int32_t, int8_t, Int128> x(1, 2, 3, 4);
1798*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1799*9356374aSAndroid Build Coastguard Worker         "@0<signed char>(1)[1]; @4<int>(4)[2]; @12<signed char>(1)[3]; "
1800*9356374aSAndroid Build Coastguard Worker         "@16" +
1801*9356374aSAndroid Build Coastguard Worker             Int128::Name() + "(16)[4]",
1802*9356374aSAndroid Build Coastguard Worker         x.DebugString());
1803*9356374aSAndroid Build Coastguard Worker   }
1804*9356374aSAndroid Build Coastguard Worker }
1805*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,StaticDebugString)1806*9356374aSAndroid Build Coastguard Worker TEST(Layout, StaticDebugString) {
1807*9356374aSAndroid Build Coastguard Worker   {
1808*9356374aSAndroid Build Coastguard Worker     constexpr auto x =
1809*9356374aSAndroid Build Coastguard Worker         Layout<int8_t, int32_t, int8_t, Int128>::WithStaticSizes<>::Partial();
1810*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("@0<signed char>(1)", x.DebugString());
1811*9356374aSAndroid Build Coastguard Worker   }
1812*9356374aSAndroid Build Coastguard Worker   {
1813*9356374aSAndroid Build Coastguard Worker     constexpr auto x =
1814*9356374aSAndroid Build Coastguard Worker         Layout<int8_t, int32_t, int8_t, Int128>::WithStaticSizes<>::Partial(1);
1815*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("@0<signed char>(1)[1]; @4<int>(4)", x.DebugString());
1816*9356374aSAndroid Build Coastguard Worker   }
1817*9356374aSAndroid Build Coastguard Worker   {
1818*9356374aSAndroid Build Coastguard Worker     constexpr auto x =
1819*9356374aSAndroid Build Coastguard Worker         Layout<int8_t, int32_t, int8_t, Int128>::WithStaticSizes<1>::Partial();
1820*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("@0<signed char>(1)[1]; @4<int>(4)", x.DebugString());
1821*9356374aSAndroid Build Coastguard Worker   }
1822*9356374aSAndroid Build Coastguard Worker   {
1823*9356374aSAndroid Build Coastguard Worker     constexpr auto x =
1824*9356374aSAndroid Build Coastguard Worker         Layout<int8_t, int32_t, int8_t, Int128>::WithStaticSizes<>::Partial(1,
1825*9356374aSAndroid Build Coastguard Worker                                                                             2);
1826*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("@0<signed char>(1)[1]; @4<int>(4)[2]; @12<signed char>(1)",
1827*9356374aSAndroid Build Coastguard Worker               x.DebugString());
1828*9356374aSAndroid Build Coastguard Worker   }
1829*9356374aSAndroid Build Coastguard Worker   {
1830*9356374aSAndroid Build Coastguard Worker     constexpr auto x =
1831*9356374aSAndroid Build Coastguard Worker         Layout<int8_t, int32_t, int8_t, Int128>::WithStaticSizes<1>::Partial(2);
1832*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("@0<signed char>(1)[1]; @4<int>(4)[2]; @12<signed char>(1)",
1833*9356374aSAndroid Build Coastguard Worker               x.DebugString());
1834*9356374aSAndroid Build Coastguard Worker   }
1835*9356374aSAndroid Build Coastguard Worker   {
1836*9356374aSAndroid Build Coastguard Worker     constexpr auto x = Layout<int8_t, int32_t, int8_t,
1837*9356374aSAndroid Build Coastguard Worker                               Int128>::WithStaticSizes<1, 2>::Partial();
1838*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("@0<signed char>(1)[1]; @4<int>(4)[2]; @12<signed char>(1)",
1839*9356374aSAndroid Build Coastguard Worker               x.DebugString());
1840*9356374aSAndroid Build Coastguard Worker   }
1841*9356374aSAndroid Build Coastguard Worker   {
1842*9356374aSAndroid Build Coastguard Worker     constexpr auto x = Layout<int8_t, int32_t, int8_t,
1843*9356374aSAndroid Build Coastguard Worker                               Int128>::WithStaticSizes<1, 2, 3, 4>::Partial();
1844*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1845*9356374aSAndroid Build Coastguard Worker         "@0<signed char>(1)[1]; @4<int>(4)[2]; @12<signed char>(1)[3]; "
1846*9356374aSAndroid Build Coastguard Worker         "@16" +
1847*9356374aSAndroid Build Coastguard Worker             Int128::Name() + "(16)[4]",
1848*9356374aSAndroid Build Coastguard Worker         x.DebugString());
1849*9356374aSAndroid Build Coastguard Worker   }
1850*9356374aSAndroid Build Coastguard Worker   {
1851*9356374aSAndroid Build Coastguard Worker     constexpr Layout<int8_t, int32_t, int8_t, Int128>::WithStaticSizes<1, 2, 3,
1852*9356374aSAndroid Build Coastguard Worker                                                                        4>
1853*9356374aSAndroid Build Coastguard Worker         x;
1854*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(
1855*9356374aSAndroid Build Coastguard Worker         "@0<signed char>(1)[1]; @4<int>(4)[2]; @12<signed char>(1)[3]; "
1856*9356374aSAndroid Build Coastguard Worker         "@16" +
1857*9356374aSAndroid Build Coastguard Worker             Int128::Name() + "(16)[4]",
1858*9356374aSAndroid Build Coastguard Worker         x.DebugString());
1859*9356374aSAndroid Build Coastguard Worker   }
1860*9356374aSAndroid Build Coastguard Worker }
1861*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,CharTypes)1862*9356374aSAndroid Build Coastguard Worker TEST(Layout, CharTypes) {
1863*9356374aSAndroid Build Coastguard Worker   constexpr Layout<int32_t> x(1);
1864*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) char c[x.AllocSize()] = {};
1865*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) unsigned char uc[x.AllocSize()] = {};
1866*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) signed char sc[x.AllocSize()] = {};
1867*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const char cc[x.AllocSize()] = {};
1868*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const unsigned char cuc[x.AllocSize()] = {};
1869*9356374aSAndroid Build Coastguard Worker   alignas(max_align_t) const signed char csc[x.AllocSize()] = {};
1870*9356374aSAndroid Build Coastguard Worker 
1871*9356374aSAndroid Build Coastguard Worker   Type<int32_t*>(x.Pointer<0>(c));
1872*9356374aSAndroid Build Coastguard Worker   Type<int32_t*>(x.Pointer<0>(uc));
1873*9356374aSAndroid Build Coastguard Worker   Type<int32_t*>(x.Pointer<0>(sc));
1874*9356374aSAndroid Build Coastguard Worker   Type<const int32_t*>(x.Pointer<0>(cc));
1875*9356374aSAndroid Build Coastguard Worker   Type<const int32_t*>(x.Pointer<0>(cuc));
1876*9356374aSAndroid Build Coastguard Worker   Type<const int32_t*>(x.Pointer<0>(csc));
1877*9356374aSAndroid Build Coastguard Worker 
1878*9356374aSAndroid Build Coastguard Worker   Type<int32_t*>(x.Pointer<int32_t>(c));
1879*9356374aSAndroid Build Coastguard Worker   Type<int32_t*>(x.Pointer<int32_t>(uc));
1880*9356374aSAndroid Build Coastguard Worker   Type<int32_t*>(x.Pointer<int32_t>(sc));
1881*9356374aSAndroid Build Coastguard Worker   Type<const int32_t*>(x.Pointer<int32_t>(cc));
1882*9356374aSAndroid Build Coastguard Worker   Type<const int32_t*>(x.Pointer<int32_t>(cuc));
1883*9356374aSAndroid Build Coastguard Worker   Type<const int32_t*>(x.Pointer<int32_t>(csc));
1884*9356374aSAndroid Build Coastguard Worker 
1885*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<int32_t*>>(x.Pointers(c));
1886*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<int32_t*>>(x.Pointers(uc));
1887*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<int32_t*>>(x.Pointers(sc));
1888*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<const int32_t*>>(x.Pointers(cc));
1889*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<const int32_t*>>(x.Pointers(cuc));
1890*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<const int32_t*>>(x.Pointers(csc));
1891*9356374aSAndroid Build Coastguard Worker 
1892*9356374aSAndroid Build Coastguard Worker   Type<Span<int32_t>>(x.Slice<0>(c));
1893*9356374aSAndroid Build Coastguard Worker   Type<Span<int32_t>>(x.Slice<0>(uc));
1894*9356374aSAndroid Build Coastguard Worker   Type<Span<int32_t>>(x.Slice<0>(sc));
1895*9356374aSAndroid Build Coastguard Worker   Type<Span<const int32_t>>(x.Slice<0>(cc));
1896*9356374aSAndroid Build Coastguard Worker   Type<Span<const int32_t>>(x.Slice<0>(cuc));
1897*9356374aSAndroid Build Coastguard Worker   Type<Span<const int32_t>>(x.Slice<0>(csc));
1898*9356374aSAndroid Build Coastguard Worker 
1899*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<Span<int32_t>>>(x.Slices(c));
1900*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<Span<int32_t>>>(x.Slices(uc));
1901*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<Span<int32_t>>>(x.Slices(sc));
1902*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<Span<const int32_t>>>(x.Slices(cc));
1903*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<Span<const int32_t>>>(x.Slices(cuc));
1904*9356374aSAndroid Build Coastguard Worker   Type<std::tuple<Span<const int32_t>>>(x.Slices(csc));
1905*9356374aSAndroid Build Coastguard Worker }
1906*9356374aSAndroid Build Coastguard Worker 
TEST(Layout,ConstElementType)1907*9356374aSAndroid Build Coastguard Worker TEST(Layout, ConstElementType) {
1908*9356374aSAndroid Build Coastguard Worker   constexpr Layout<const int32_t> x(1);
1909*9356374aSAndroid Build Coastguard Worker   alignas(int32_t) char c[x.AllocSize()] = {};
1910*9356374aSAndroid Build Coastguard Worker   const char* cc = c;
1911*9356374aSAndroid Build Coastguard Worker   const int32_t* p = reinterpret_cast<const int32_t*>(cc);
1912*9356374aSAndroid Build Coastguard Worker 
1913*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(alignof(int32_t), x.Alignment());
1914*9356374aSAndroid Build Coastguard Worker 
1915*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, x.Offset<0>());
1916*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, x.Offset<const int32_t>());
1917*9356374aSAndroid Build Coastguard Worker 
1918*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(x.Offsets(), ElementsAre(0));
1919*9356374aSAndroid Build Coastguard Worker 
1920*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, x.Size<0>());
1921*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, x.Size<const int32_t>());
1922*9356374aSAndroid Build Coastguard Worker 
1923*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(x.Sizes(), ElementsAre(1));
1924*9356374aSAndroid Build Coastguard Worker 
1925*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(int32_t), x.AllocSize());
1926*9356374aSAndroid Build Coastguard Worker 
1927*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(p, Type<const int32_t*>(x.Pointer<0>(c)));
1928*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(p, Type<const int32_t*>(x.Pointer<0>(cc)));
1929*9356374aSAndroid Build Coastguard Worker 
1930*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(p, Type<const int32_t*>(x.Pointer<const int32_t>(c)));
1931*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(p, Type<const int32_t*>(x.Pointer<const int32_t>(cc)));
1932*9356374aSAndroid Build Coastguard Worker 
1933*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(Type<std::tuple<const int32_t*>>(x.Pointers(c)), Tuple(p));
1934*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(Type<std::tuple<const int32_t*>>(x.Pointers(cc)), Tuple(p));
1935*9356374aSAndroid Build Coastguard Worker 
1936*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(Type<Span<const int32_t>>(x.Slice<0>(c)),
1937*9356374aSAndroid Build Coastguard Worker               IsSameSlice(Span<const int32_t>(p, 1)));
1938*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(Type<Span<const int32_t>>(x.Slice<0>(cc)),
1939*9356374aSAndroid Build Coastguard Worker               IsSameSlice(Span<const int32_t>(p, 1)));
1940*9356374aSAndroid Build Coastguard Worker 
1941*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(Type<Span<const int32_t>>(x.Slice<const int32_t>(c)),
1942*9356374aSAndroid Build Coastguard Worker               IsSameSlice(Span<const int32_t>(p, 1)));
1943*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(Type<Span<const int32_t>>(x.Slice<const int32_t>(cc)),
1944*9356374aSAndroid Build Coastguard Worker               IsSameSlice(Span<const int32_t>(p, 1)));
1945*9356374aSAndroid Build Coastguard Worker 
1946*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(Type<std::tuple<Span<const int32_t>>>(x.Slices(c)),
1947*9356374aSAndroid Build Coastguard Worker               Tuple(IsSameSlice(Span<const int32_t>(p, 1))));
1948*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(Type<std::tuple<Span<const int32_t>>>(x.Slices(cc)),
1949*9356374aSAndroid Build Coastguard Worker               Tuple(IsSameSlice(Span<const int32_t>(p, 1))));
1950*9356374aSAndroid Build Coastguard Worker }
1951*9356374aSAndroid Build Coastguard Worker 
1952*9356374aSAndroid Build Coastguard Worker namespace example {
1953*9356374aSAndroid Build Coastguard Worker 
1954*9356374aSAndroid Build Coastguard Worker // Immutable move-only string with sizeof equal to sizeof(void*). The string
1955*9356374aSAndroid Build Coastguard Worker // size and the characters are kept in the same heap allocation.
1956*9356374aSAndroid Build Coastguard Worker class CompactString {
1957*9356374aSAndroid Build Coastguard Worker  public:
CompactString(const char * s="")1958*9356374aSAndroid Build Coastguard Worker   CompactString(const char* s = "") {  // NOLINT
1959*9356374aSAndroid Build Coastguard Worker     const size_t size = strlen(s);
1960*9356374aSAndroid Build Coastguard Worker     // size_t[1], followed by char[size + 1].
1961*9356374aSAndroid Build Coastguard Worker     // This statement doesn't allocate memory.
1962*9356374aSAndroid Build Coastguard Worker     const L layout(1, size + 1);
1963*9356374aSAndroid Build Coastguard Worker     // AllocSize() tells us how much memory we need to allocate for all our
1964*9356374aSAndroid Build Coastguard Worker     // data.
1965*9356374aSAndroid Build Coastguard Worker     p_.reset(new unsigned char[layout.AllocSize()]);
1966*9356374aSAndroid Build Coastguard Worker     // If running under ASAN, mark the padding bytes, if any, to catch memory
1967*9356374aSAndroid Build Coastguard Worker     // errors.
1968*9356374aSAndroid Build Coastguard Worker     layout.PoisonPadding(p_.get());
1969*9356374aSAndroid Build Coastguard Worker     // Store the size in the allocation.
1970*9356374aSAndroid Build Coastguard Worker     // Pointer<size_t>() is a synonym for Pointer<0>().
1971*9356374aSAndroid Build Coastguard Worker     *layout.Pointer<size_t>(p_.get()) = size;
1972*9356374aSAndroid Build Coastguard Worker     // Store the characters in the allocation.
1973*9356374aSAndroid Build Coastguard Worker     memcpy(layout.Pointer<char>(p_.get()), s, size + 1);
1974*9356374aSAndroid Build Coastguard Worker   }
1975*9356374aSAndroid Build Coastguard Worker 
size() const1976*9356374aSAndroid Build Coastguard Worker   size_t size() const {
1977*9356374aSAndroid Build Coastguard Worker     // Equivalent to reinterpret_cast<size_t&>(*p).
1978*9356374aSAndroid Build Coastguard Worker     return *L::Partial().Pointer<size_t>(p_.get());
1979*9356374aSAndroid Build Coastguard Worker   }
1980*9356374aSAndroid Build Coastguard Worker 
c_str() const1981*9356374aSAndroid Build Coastguard Worker   const char* c_str() const {
1982*9356374aSAndroid Build Coastguard Worker     // Equivalent to reinterpret_cast<char*>(p.get() + sizeof(size_t)).
1983*9356374aSAndroid Build Coastguard Worker     // The argument in Partial(1) specifies that we have size_t[1] in front of
1984*9356374aSAndroid Build Coastguard Worker     // the characters.
1985*9356374aSAndroid Build Coastguard Worker     return L::Partial(1).Pointer<char>(p_.get());
1986*9356374aSAndroid Build Coastguard Worker   }
1987*9356374aSAndroid Build Coastguard Worker 
1988*9356374aSAndroid Build Coastguard Worker  private:
1989*9356374aSAndroid Build Coastguard Worker   // Our heap allocation contains a size_t followed by an array of chars.
1990*9356374aSAndroid Build Coastguard Worker   using L = Layout<size_t, char>;
1991*9356374aSAndroid Build Coastguard Worker   std::unique_ptr<unsigned char[]> p_;
1992*9356374aSAndroid Build Coastguard Worker };
1993*9356374aSAndroid Build Coastguard Worker 
TEST(CompactString,Works)1994*9356374aSAndroid Build Coastguard Worker TEST(CompactString, Works) {
1995*9356374aSAndroid Build Coastguard Worker   CompactString s = "hello";
1996*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, s.size());
1997*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("hello", s.c_str());
1998*9356374aSAndroid Build Coastguard Worker }
1999*9356374aSAndroid Build Coastguard Worker 
2000*9356374aSAndroid Build Coastguard Worker // Same as the previous CompactString example, except we set the first array
2001*9356374aSAndroid Build Coastguard Worker // size to 1 statically, since we know it is always 1. This allows us to compute
2002*9356374aSAndroid Build Coastguard Worker // the offset of the character array at compile time.
2003*9356374aSAndroid Build Coastguard Worker class StaticCompactString {
2004*9356374aSAndroid Build Coastguard Worker  public:
StaticCompactString(const char * s="")2005*9356374aSAndroid Build Coastguard Worker   StaticCompactString(const char* s = "") {  // NOLINT
2006*9356374aSAndroid Build Coastguard Worker     const size_t size = strlen(s);
2007*9356374aSAndroid Build Coastguard Worker     const SL layout(size + 1);
2008*9356374aSAndroid Build Coastguard Worker     p_.reset(new unsigned char[layout.AllocSize()]);
2009*9356374aSAndroid Build Coastguard Worker     layout.PoisonPadding(p_.get());
2010*9356374aSAndroid Build Coastguard Worker     *layout.Pointer<size_t>(p_.get()) = size;
2011*9356374aSAndroid Build Coastguard Worker     memcpy(layout.Pointer<char>(p_.get()), s, size + 1);
2012*9356374aSAndroid Build Coastguard Worker   }
2013*9356374aSAndroid Build Coastguard Worker 
size() const2014*9356374aSAndroid Build Coastguard Worker   size_t size() const { return *SL::Partial().Pointer<size_t>(p_.get()); }
2015*9356374aSAndroid Build Coastguard Worker 
c_str() const2016*9356374aSAndroid Build Coastguard Worker   const char* c_str() const { return SL::Partial().Pointer<char>(p_.get()); }
2017*9356374aSAndroid Build Coastguard Worker 
2018*9356374aSAndroid Build Coastguard Worker  private:
2019*9356374aSAndroid Build Coastguard Worker   using SL = Layout<size_t, char>::WithStaticSizes<1>;
2020*9356374aSAndroid Build Coastguard Worker   std::unique_ptr<unsigned char[]> p_;
2021*9356374aSAndroid Build Coastguard Worker };
2022*9356374aSAndroid Build Coastguard Worker 
TEST(StaticCompactString,Works)2023*9356374aSAndroid Build Coastguard Worker TEST(StaticCompactString, Works) {
2024*9356374aSAndroid Build Coastguard Worker   StaticCompactString s = "hello";
2025*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, s.size());
2026*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("hello", s.c_str());
2027*9356374aSAndroid Build Coastguard Worker }
2028*9356374aSAndroid Build Coastguard Worker 
2029*9356374aSAndroid Build Coastguard Worker }  // namespace example
2030*9356374aSAndroid Build Coastguard Worker 
2031*9356374aSAndroid Build Coastguard Worker }  // namespace
2032*9356374aSAndroid Build Coastguard Worker }  // namespace container_internal
2033*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
2034*9356374aSAndroid Build Coastguard Worker }  // namespace absl
2035