xref: /aosp_15_r20/external/cronet/base/numerics/byte_conversions_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/numerics/byte_conversions.h"
6*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker namespace base::numerics {
9*6777b538SAndroid Build Coastguard Worker 
TEST(NumericsTest,FromNativeEndian)10*6777b538SAndroid Build Coastguard Worker TEST(NumericsTest, FromNativeEndian) {
11*6777b538SAndroid Build Coastguard Worker   // The implementation of FromNativeEndian and FromLittleEndian assumes the
12*6777b538SAndroid Build Coastguard Worker   // native endian is little. If support of big endian is desired, compile-time
13*6777b538SAndroid Build Coastguard Worker   // branches will need to be added to the implementation, and the test results
14*6777b538SAndroid Build Coastguard Worker   // will differ there (they would match FromBigEndian in this test).
15*6777b538SAndroid Build Coastguard Worker   static_assert(std::endian::native == std::endian::little);
16*6777b538SAndroid Build Coastguard Worker   {
17*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u};
18*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U8FromNativeEndian(bytes), 0x12u);
19*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint8_t, decltype(U8FromNativeEndian(bytes))>);
20*6777b538SAndroid Build Coastguard Worker     static_assert(U8FromNativeEndian(bytes) == 0x12u);
21*6777b538SAndroid Build Coastguard Worker   }
22*6777b538SAndroid Build Coastguard Worker   {
23*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u};
24*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U16FromNativeEndian(bytes), 0x34'12u);
25*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint16_t, decltype(U16FromNativeEndian(bytes))>);
26*6777b538SAndroid Build Coastguard Worker     static_assert(U16FromNativeEndian(bytes) == 0x34'12u);
27*6777b538SAndroid Build Coastguard Worker   }
28*6777b538SAndroid Build Coastguard Worker   {
29*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u};
30*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U32FromNativeEndian(bytes), 0x78'56'34'12u);
31*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint32_t, decltype(U32FromNativeEndian(bytes))>);
32*6777b538SAndroid Build Coastguard Worker     static_assert(U32FromNativeEndian(bytes) == 0x78'56'34'12u);
33*6777b538SAndroid Build Coastguard Worker   }
34*6777b538SAndroid Build Coastguard Worker   {
35*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u,
36*6777b538SAndroid Build Coastguard Worker                                  0x90u, 0x12u, 0x34u, 0x56u};
37*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U64FromNativeEndian(bytes), 0x56'34'12'90'78'56'34'12u);
38*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint64_t, decltype(U64FromNativeEndian(bytes))>);
39*6777b538SAndroid Build Coastguard Worker     static_assert(U64FromNativeEndian(bytes) == 0x56'34'12'90'78'56'34'12u);
40*6777b538SAndroid Build Coastguard Worker   }
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   {
43*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u};
44*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I8FromNativeEndian(bytes), 0x12);
45*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int8_t, decltype(I8FromNativeEndian(bytes))>);
46*6777b538SAndroid Build Coastguard Worker     static_assert(U8FromNativeEndian(bytes) == 0x12);
47*6777b538SAndroid Build Coastguard Worker   }
48*6777b538SAndroid Build Coastguard Worker   {
49*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u};
50*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I16FromNativeEndian(bytes), 0x34'12);
51*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int16_t, decltype(I16FromNativeEndian(bytes))>);
52*6777b538SAndroid Build Coastguard Worker     static_assert(U16FromNativeEndian(bytes) == 0x34'12);
53*6777b538SAndroid Build Coastguard Worker   }
54*6777b538SAndroid Build Coastguard Worker   {
55*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u};
56*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I32FromNativeEndian(bytes), 0x78'56'34'12);
57*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int32_t, decltype(I32FromNativeEndian(bytes))>);
58*6777b538SAndroid Build Coastguard Worker     static_assert(U32FromNativeEndian(bytes) == 0x78'56'34'12);
59*6777b538SAndroid Build Coastguard Worker   }
60*6777b538SAndroid Build Coastguard Worker   {
61*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u,
62*6777b538SAndroid Build Coastguard Worker                                  0x90u, 0x12u, 0x34u, 0x56u};
63*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I64FromNativeEndian(bytes), 0x56'34'12'90'78'56'34'12);
64*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int64_t, decltype(I64FromNativeEndian(bytes))>);
65*6777b538SAndroid Build Coastguard Worker     static_assert(I64FromNativeEndian(bytes) == 0x56'34'12'90'78'56'34'12);
66*6777b538SAndroid Build Coastguard Worker   }
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker   {
69*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u};
70*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(FloatFromNativeEndian(bytes), 1.73782443614e+34f);
71*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std::bit_cast<uint32_t>(FloatFromNativeEndian(bytes)),
72*6777b538SAndroid Build Coastguard Worker               0x78'56'34'12u);
73*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<float, decltype(FloatFromNativeEndian(bytes))>);
74*6777b538SAndroid Build Coastguard Worker     static_assert(FloatFromNativeEndian(bytes) == 1.73782443614e+34f);
75*6777b538SAndroid Build Coastguard Worker     static_assert(std::bit_cast<uint32_t>(FloatFromNativeEndian(bytes)) ==
76*6777b538SAndroid Build Coastguard Worker                   0x78'56'34'12u);
77*6777b538SAndroid Build Coastguard Worker   }
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker   {
80*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u,
81*6777b538SAndroid Build Coastguard Worker                                  0x90u, 0x12u, 0x34u, 0x56u};
82*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(DoubleFromNativeEndian(bytes),
83*6777b538SAndroid Build Coastguard Worker               1.84145159269283616391989849435e107);
84*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std::bit_cast<uint64_t>(DoubleFromNativeEndian(bytes)),
85*6777b538SAndroid Build Coastguard Worker               0x56'34'12'90'78'56'34'12u);
86*6777b538SAndroid Build Coastguard Worker     static_assert(
87*6777b538SAndroid Build Coastguard Worker         std::same_as<double, decltype(DoubleFromNativeEndian(bytes))>);
88*6777b538SAndroid Build Coastguard Worker     static_assert(DoubleFromNativeEndian(bytes) ==
89*6777b538SAndroid Build Coastguard Worker                   1.84145159269283616391989849435e107);
90*6777b538SAndroid Build Coastguard Worker     static_assert(std::bit_cast<uint64_t>(DoubleFromNativeEndian(bytes)) ==
91*6777b538SAndroid Build Coastguard Worker                   0x56'34'12'90'78'56'34'12u);
92*6777b538SAndroid Build Coastguard Worker   }
93*6777b538SAndroid Build Coastguard Worker }
94*6777b538SAndroid Build Coastguard Worker 
TEST(NumericsTest,FromLittleEndian)95*6777b538SAndroid Build Coastguard Worker TEST(NumericsTest, FromLittleEndian) {
96*6777b538SAndroid Build Coastguard Worker   // The implementation of FromNativeEndian and FromLittleEndian assumes the
97*6777b538SAndroid Build Coastguard Worker   // native endian is little. If support of big endian is desired, compile-time
98*6777b538SAndroid Build Coastguard Worker   // branches will need to be added to the implementation, and the test results
99*6777b538SAndroid Build Coastguard Worker   // will differ there (they would match FromBigEndian in this test).
100*6777b538SAndroid Build Coastguard Worker   static_assert(std::endian::native == std::endian::little);
101*6777b538SAndroid Build Coastguard Worker   {
102*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u};
103*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U8FromLittleEndian(bytes), 0x12u);
104*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint8_t, decltype(U8FromLittleEndian(bytes))>);
105*6777b538SAndroid Build Coastguard Worker     static_assert(U8FromLittleEndian(bytes) == 0x12u);
106*6777b538SAndroid Build Coastguard Worker   }
107*6777b538SAndroid Build Coastguard Worker   {
108*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u};
109*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U16FromLittleEndian(bytes), 0x34'12u);
110*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint16_t, decltype(U16FromLittleEndian(bytes))>);
111*6777b538SAndroid Build Coastguard Worker     static_assert(U16FromLittleEndian(bytes) == 0x34'12u);
112*6777b538SAndroid Build Coastguard Worker   }
113*6777b538SAndroid Build Coastguard Worker   {
114*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u};
115*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U32FromLittleEndian(bytes), 0x78'56'34'12u);
116*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint32_t, decltype(U32FromLittleEndian(bytes))>);
117*6777b538SAndroid Build Coastguard Worker     static_assert(U32FromLittleEndian(bytes) == 0x78'56'34'12u);
118*6777b538SAndroid Build Coastguard Worker   }
119*6777b538SAndroid Build Coastguard Worker   {
120*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u,
121*6777b538SAndroid Build Coastguard Worker                                  0x90u, 0x12u, 0x34u, 0x56u};
122*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U64FromLittleEndian(bytes), 0x56'34'12'90'78'56'34'12u);
123*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint64_t, decltype(U64FromLittleEndian(bytes))>);
124*6777b538SAndroid Build Coastguard Worker     static_assert(U64FromLittleEndian(bytes) == 0x56'34'12'90'78'56'34'12u);
125*6777b538SAndroid Build Coastguard Worker   }
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker   {
128*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u};
129*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I8FromLittleEndian(bytes), 0x12);
130*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int8_t, decltype(I8FromLittleEndian(bytes))>);
131*6777b538SAndroid Build Coastguard Worker     static_assert(I8FromLittleEndian(bytes) == 0x12);
132*6777b538SAndroid Build Coastguard Worker   }
133*6777b538SAndroid Build Coastguard Worker   {
134*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u};
135*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I16FromLittleEndian(bytes), 0x34'12);
136*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int16_t, decltype(I16FromLittleEndian(bytes))>);
137*6777b538SAndroid Build Coastguard Worker     static_assert(I16FromLittleEndian(bytes) == 0x34'12);
138*6777b538SAndroid Build Coastguard Worker   }
139*6777b538SAndroid Build Coastguard Worker   {
140*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u};
141*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I32FromLittleEndian(bytes), 0x78'56'34'12);
142*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int32_t, decltype(I32FromLittleEndian(bytes))>);
143*6777b538SAndroid Build Coastguard Worker     static_assert(I32FromLittleEndian(bytes) == 0x78'56'34'12);
144*6777b538SAndroid Build Coastguard Worker   }
145*6777b538SAndroid Build Coastguard Worker   {
146*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u,
147*6777b538SAndroid Build Coastguard Worker                                  0x90u, 0x12u, 0x34u, 0x56u};
148*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I64FromLittleEndian(bytes), 0x56'34'12'90'78'56'34'12);
149*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int64_t, decltype(I64FromLittleEndian(bytes))>);
150*6777b538SAndroid Build Coastguard Worker     static_assert(I64FromLittleEndian(bytes) == 0x56'34'12'90'78'56'34'12);
151*6777b538SAndroid Build Coastguard Worker   }
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker   {
154*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u};
155*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(FloatFromLittleEndian(bytes), 1.73782443614e+34f);
156*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std::bit_cast<uint32_t>(FloatFromLittleEndian(bytes)),
157*6777b538SAndroid Build Coastguard Worker               0x78'56'34'12u);
158*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<float, decltype(FloatFromLittleEndian(bytes))>);
159*6777b538SAndroid Build Coastguard Worker     static_assert(FloatFromLittleEndian(bytes) == 1.73782443614e+34f);
160*6777b538SAndroid Build Coastguard Worker     static_assert(std::bit_cast<uint32_t>(FloatFromLittleEndian(bytes)) ==
161*6777b538SAndroid Build Coastguard Worker                   0x78'56'34'12u);
162*6777b538SAndroid Build Coastguard Worker   }
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker   {
165*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u,
166*6777b538SAndroid Build Coastguard Worker                                  0x90u, 0x12u, 0x34u, 0x56u};
167*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(DoubleFromLittleEndian(bytes),
168*6777b538SAndroid Build Coastguard Worker               1.84145159269283616391989849435e107);
169*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std::bit_cast<uint64_t>(DoubleFromLittleEndian(bytes)),
170*6777b538SAndroid Build Coastguard Worker               0x56'34'12'90'78'56'34'12u);
171*6777b538SAndroid Build Coastguard Worker     static_assert(
172*6777b538SAndroid Build Coastguard Worker         std::same_as<double, decltype(DoubleFromLittleEndian(bytes))>);
173*6777b538SAndroid Build Coastguard Worker     static_assert(DoubleFromLittleEndian(bytes) ==
174*6777b538SAndroid Build Coastguard Worker                   1.84145159269283616391989849435e107);
175*6777b538SAndroid Build Coastguard Worker     static_assert(std::bit_cast<uint64_t>(DoubleFromLittleEndian(bytes)) ==
176*6777b538SAndroid Build Coastguard Worker                   0x56'34'12'90'78'56'34'12u);
177*6777b538SAndroid Build Coastguard Worker   }
178*6777b538SAndroid Build Coastguard Worker }
179*6777b538SAndroid Build Coastguard Worker 
TEST(NumericsTest,FromBigEndian)180*6777b538SAndroid Build Coastguard Worker TEST(NumericsTest, FromBigEndian) {
181*6777b538SAndroid Build Coastguard Worker   // The implementation of FromNativeEndian and FromLittleEndian assumes the
182*6777b538SAndroid Build Coastguard Worker   // native endian is little. If support of big endian is desired, compile-time
183*6777b538SAndroid Build Coastguard Worker   // branches will need to be added to the implementation, and the test results
184*6777b538SAndroid Build Coastguard Worker   // will differ there (they would match FromLittleEndian in this test).
185*6777b538SAndroid Build Coastguard Worker   static_assert(std::endian::native == std::endian::little);
186*6777b538SAndroid Build Coastguard Worker   {
187*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u};
188*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U8FromBigEndian(bytes), 0x12u);
189*6777b538SAndroid Build Coastguard Worker     static_assert(U8FromBigEndian(bytes) == 0x12u);
190*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint8_t, decltype(U8FromBigEndian(bytes))>);
191*6777b538SAndroid Build Coastguard Worker   }
192*6777b538SAndroid Build Coastguard Worker   {
193*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u};
194*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U16FromBigEndian(bytes), 0x12'34u);
195*6777b538SAndroid Build Coastguard Worker     static_assert(U16FromBigEndian(bytes) == 0x12'34u);
196*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint16_t, decltype(U16FromBigEndian(bytes))>);
197*6777b538SAndroid Build Coastguard Worker   }
198*6777b538SAndroid Build Coastguard Worker   {
199*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u};
200*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U32FromBigEndian(bytes), 0x12'34'56'78u);
201*6777b538SAndroid Build Coastguard Worker     static_assert(U32FromBigEndian(bytes) == 0x12'34'56'78u);
202*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint32_t, decltype(U32FromBigEndian(bytes))>);
203*6777b538SAndroid Build Coastguard Worker   }
204*6777b538SAndroid Build Coastguard Worker   {
205*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u,
206*6777b538SAndroid Build Coastguard Worker                                  0x90u, 0x12u, 0x34u, 0x56u};
207*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U64FromBigEndian(bytes), 0x12'34'56'78'90'12'34'56u);
208*6777b538SAndroid Build Coastguard Worker     static_assert(U64FromBigEndian(bytes) == 0x12'34'56'78'90'12'34'56u);
209*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<uint64_t, decltype(U64FromBigEndian(bytes))>);
210*6777b538SAndroid Build Coastguard Worker   }
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker   {
213*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u};
214*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I8FromBigEndian(bytes), 0x12);
215*6777b538SAndroid Build Coastguard Worker     static_assert(I8FromBigEndian(bytes) == 0x12);
216*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int8_t, decltype(I8FromBigEndian(bytes))>);
217*6777b538SAndroid Build Coastguard Worker   }
218*6777b538SAndroid Build Coastguard Worker   {
219*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u};
220*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I16FromBigEndian(bytes), 0x12'34);
221*6777b538SAndroid Build Coastguard Worker     static_assert(I16FromBigEndian(bytes) == 0x12'34);
222*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int16_t, decltype(I16FromBigEndian(bytes))>);
223*6777b538SAndroid Build Coastguard Worker   }
224*6777b538SAndroid Build Coastguard Worker   {
225*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u};
226*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I32FromBigEndian(bytes), 0x12'34'56'78);
227*6777b538SAndroid Build Coastguard Worker     static_assert(I32FromBigEndian(bytes) == 0x12'34'56'78);
228*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int32_t, decltype(I32FromBigEndian(bytes))>);
229*6777b538SAndroid Build Coastguard Worker   }
230*6777b538SAndroid Build Coastguard Worker   {
231*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u,
232*6777b538SAndroid Build Coastguard Worker                                  0x90u, 0x12u, 0x34u, 0x56u};
233*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I64FromBigEndian(bytes), 0x12'34'56'78'90'12'34'56);
234*6777b538SAndroid Build Coastguard Worker     static_assert(I64FromBigEndian(bytes) == 0x12'34'56'78'90'12'34'56);
235*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<int64_t, decltype(I64FromBigEndian(bytes))>);
236*6777b538SAndroid Build Coastguard Worker   }
237*6777b538SAndroid Build Coastguard Worker 
238*6777b538SAndroid Build Coastguard Worker   {
239*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u};
240*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(FloatFromBigEndian(bytes), 5.6904566139e-28f);
241*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std::bit_cast<uint32_t>(FloatFromBigEndian(bytes)),
242*6777b538SAndroid Build Coastguard Worker               0x12'34'56'78u);
243*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<float, decltype(FloatFromBigEndian(bytes))>);
244*6777b538SAndroid Build Coastguard Worker     static_assert(FloatFromBigEndian(bytes) == 5.6904566139e-28f);
245*6777b538SAndroid Build Coastguard Worker     static_assert(std::bit_cast<uint32_t>(FloatFromBigEndian(bytes)) ==
246*6777b538SAndroid Build Coastguard Worker                   0x12'34'56'78u);
247*6777b538SAndroid Build Coastguard Worker   }
248*6777b538SAndroid Build Coastguard Worker   {
249*6777b538SAndroid Build Coastguard Worker     constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u,
250*6777b538SAndroid Build Coastguard Worker                                  0x90u, 0x12u, 0x34u, 0x56u};
251*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(DoubleFromBigEndian(bytes), 5.62634909901491201382066931077e-221);
252*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(std::bit_cast<uint64_t>(DoubleFromBigEndian(bytes)),
253*6777b538SAndroid Build Coastguard Worker               0x12'34'56'78'90'12'34'56u);
254*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<double, decltype(DoubleFromBigEndian(bytes))>);
255*6777b538SAndroid Build Coastguard Worker     static_assert(DoubleFromBigEndian(bytes) ==
256*6777b538SAndroid Build Coastguard Worker                   5.62634909901491201382066931077e-221);
257*6777b538SAndroid Build Coastguard Worker     static_assert(std::bit_cast<uint64_t>(DoubleFromBigEndian(bytes)) ==
258*6777b538SAndroid Build Coastguard Worker                   0x12'34'56'78'90'12'34'56u);
259*6777b538SAndroid Build Coastguard Worker   }
260*6777b538SAndroid Build Coastguard Worker }
261*6777b538SAndroid Build Coastguard Worker 
TEST(NumericsTest,ToNativeEndian)262*6777b538SAndroid Build Coastguard Worker TEST(NumericsTest, ToNativeEndian) {
263*6777b538SAndroid Build Coastguard Worker   // The implementation of ToNativeEndian and ToLittleEndian assumes the native
264*6777b538SAndroid Build Coastguard Worker   // endian is little. If support of big endian is desired, compile-time
265*6777b538SAndroid Build Coastguard Worker   // branches will need to be added to the implementation, and the test results
266*6777b538SAndroid Build Coastguard Worker   // will differ there (they would match ToBigEndian in this test).
267*6777b538SAndroid Build Coastguard Worker   static_assert(std::endian::native == std::endian::little);
268*6777b538SAndroid Build Coastguard Worker   {
269*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 1u> bytes = {0x12u};
270*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint8_t{0x12u};
271*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U8ToNativeEndian(val), bytes);
272*6777b538SAndroid Build Coastguard Worker     static_assert(
273*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 1u>, decltype(U8ToNativeEndian(val))>);
274*6777b538SAndroid Build Coastguard Worker     static_assert(U8ToNativeEndian(val) == bytes);
275*6777b538SAndroid Build Coastguard Worker   }
276*6777b538SAndroid Build Coastguard Worker   {
277*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u};
278*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint16_t{0x34'12u};
279*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U16ToNativeEndian(val), bytes);
280*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 2u>,
281*6777b538SAndroid Build Coastguard Worker                                decltype(U16ToNativeEndian(val))>);
282*6777b538SAndroid Build Coastguard Worker     static_assert(U16ToNativeEndian(val) == bytes);
283*6777b538SAndroid Build Coastguard Worker   }
284*6777b538SAndroid Build Coastguard Worker   {
285*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u};
286*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint32_t{0x78'56'34'12u};
287*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U32ToNativeEndian(val), bytes);
288*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 4u>,
289*6777b538SAndroid Build Coastguard Worker                                decltype(U32ToNativeEndian(val))>);
290*6777b538SAndroid Build Coastguard Worker     static_assert(U32ToNativeEndian(val) == bytes);
291*6777b538SAndroid Build Coastguard Worker   }
292*6777b538SAndroid Build Coastguard Worker   {
293*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u,
294*6777b538SAndroid Build Coastguard Worker                                                0x90u, 0x12u, 0x34u, 0x56u};
295*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint64_t{0x56'34'12'90'78'56'34'12u};
296*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U64ToNativeEndian(val), bytes);
297*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 8u>,
298*6777b538SAndroid Build Coastguard Worker                                decltype(U64ToNativeEndian(val))>);
299*6777b538SAndroid Build Coastguard Worker     static_assert(U64ToNativeEndian(val) == bytes);
300*6777b538SAndroid Build Coastguard Worker   }
301*6777b538SAndroid Build Coastguard Worker 
302*6777b538SAndroid Build Coastguard Worker   {
303*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 1u> bytes = {0x12u};
304*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int8_t{0x12};
305*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I8ToNativeEndian(val), bytes);
306*6777b538SAndroid Build Coastguard Worker     static_assert(
307*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 1u>, decltype(I8ToNativeEndian(val))>);
308*6777b538SAndroid Build Coastguard Worker     static_assert(I8ToNativeEndian(val) == bytes);
309*6777b538SAndroid Build Coastguard Worker   }
310*6777b538SAndroid Build Coastguard Worker   {
311*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u};
312*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int16_t{0x34'12};
313*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I16ToNativeEndian(val), bytes);
314*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 2u>,
315*6777b538SAndroid Build Coastguard Worker                                decltype(I16ToNativeEndian(val))>);
316*6777b538SAndroid Build Coastguard Worker     static_assert(I16ToNativeEndian(val) == bytes);
317*6777b538SAndroid Build Coastguard Worker   }
318*6777b538SAndroid Build Coastguard Worker   {
319*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u};
320*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int32_t{0x78'56'34'12};
321*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I32ToNativeEndian(val), bytes);
322*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 4u>,
323*6777b538SAndroid Build Coastguard Worker                                decltype(I32ToNativeEndian(val))>);
324*6777b538SAndroid Build Coastguard Worker     static_assert(I32ToNativeEndian(val) == bytes);
325*6777b538SAndroid Build Coastguard Worker   }
326*6777b538SAndroid Build Coastguard Worker   {
327*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u,
328*6777b538SAndroid Build Coastguard Worker                                                0x90u, 0x12u, 0x34u, 0x56u};
329*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int64_t{0x56'34'12'90'78'56'34'12};
330*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I64ToNativeEndian(val), bytes);
331*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 8u>,
332*6777b538SAndroid Build Coastguard Worker                                decltype(I64ToNativeEndian(val))>);
333*6777b538SAndroid Build Coastguard Worker     static_assert(I64ToNativeEndian(val) == bytes);
334*6777b538SAndroid Build Coastguard Worker   }
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker   {
337*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u};
338*6777b538SAndroid Build Coastguard Worker     constexpr float val = 1.73782443614e+34f;
339*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(FloatToNativeEndian(val), bytes);
340*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 4u>,
341*6777b538SAndroid Build Coastguard Worker                                decltype(FloatToNativeEndian(val))>);
342*6777b538SAndroid Build Coastguard Worker     static_assert(FloatToNativeEndian(val) == bytes);
343*6777b538SAndroid Build Coastguard Worker   }
344*6777b538SAndroid Build Coastguard Worker 
345*6777b538SAndroid Build Coastguard Worker   {
346*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u,
347*6777b538SAndroid Build Coastguard Worker                                                0x90u, 0x12u, 0x34u, 0x56u};
348*6777b538SAndroid Build Coastguard Worker     constexpr double val = 1.84145159269283616391989849435e107;
349*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(DoubleToNativeEndian(val), bytes);
350*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 8u>,
351*6777b538SAndroid Build Coastguard Worker                                decltype(DoubleToNativeEndian(val))>);
352*6777b538SAndroid Build Coastguard Worker     static_assert(DoubleToNativeEndian(val) == bytes);
353*6777b538SAndroid Build Coastguard Worker   }
354*6777b538SAndroid Build Coastguard Worker }
355*6777b538SAndroid Build Coastguard Worker 
TEST(NumericsTest,ToLittleEndian)356*6777b538SAndroid Build Coastguard Worker TEST(NumericsTest, ToLittleEndian) {
357*6777b538SAndroid Build Coastguard Worker   // The implementation of ToNativeEndian and ToLittleEndian assumes the native
358*6777b538SAndroid Build Coastguard Worker   // endian is little. If support of big endian is desired, compile-time
359*6777b538SAndroid Build Coastguard Worker   // branches will need to be added to the implementation, and the test results
360*6777b538SAndroid Build Coastguard Worker   // will differ there (they would match ToBigEndian in this test).
361*6777b538SAndroid Build Coastguard Worker   static_assert(std::endian::native == std::endian::little);
362*6777b538SAndroid Build Coastguard Worker   {
363*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 1u> bytes = {0x12u};
364*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint8_t{0x12u};
365*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U8ToLittleEndian(val), bytes);
366*6777b538SAndroid Build Coastguard Worker     static_assert(
367*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 1u>, decltype(U8ToLittleEndian(val))>);
368*6777b538SAndroid Build Coastguard Worker     static_assert(U8ToLittleEndian(val) == bytes);
369*6777b538SAndroid Build Coastguard Worker   }
370*6777b538SAndroid Build Coastguard Worker   {
371*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u};
372*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint16_t{0x34'12u};
373*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U16ToLittleEndian(val), bytes);
374*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 2u>,
375*6777b538SAndroid Build Coastguard Worker                                decltype(U16ToLittleEndian(val))>);
376*6777b538SAndroid Build Coastguard Worker     static_assert(U16ToLittleEndian(val) == bytes);
377*6777b538SAndroid Build Coastguard Worker   }
378*6777b538SAndroid Build Coastguard Worker   {
379*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u};
380*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint32_t{0x78'56'34'12u};
381*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U32ToLittleEndian(val), bytes);
382*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 4u>,
383*6777b538SAndroid Build Coastguard Worker                                decltype(U32ToLittleEndian(val))>);
384*6777b538SAndroid Build Coastguard Worker     static_assert(U32ToLittleEndian(val) == bytes);
385*6777b538SAndroid Build Coastguard Worker   }
386*6777b538SAndroid Build Coastguard Worker   {
387*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u,
388*6777b538SAndroid Build Coastguard Worker                                                0x90u, 0x12u, 0x34u, 0x56u};
389*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint64_t{0x56'34'12'90'78'56'34'12u};
390*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U64ToLittleEndian(val), bytes);
391*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 8u>,
392*6777b538SAndroid Build Coastguard Worker                                decltype(U64ToLittleEndian(val))>);
393*6777b538SAndroid Build Coastguard Worker     static_assert(U64ToLittleEndian(val) == bytes);
394*6777b538SAndroid Build Coastguard Worker   }
395*6777b538SAndroid Build Coastguard Worker 
396*6777b538SAndroid Build Coastguard Worker   {
397*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 1u> bytes = {0x12u};
398*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int8_t{0x12};
399*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I8ToLittleEndian(val), bytes);
400*6777b538SAndroid Build Coastguard Worker     static_assert(
401*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 1u>, decltype(I8ToLittleEndian(val))>);
402*6777b538SAndroid Build Coastguard Worker     static_assert(I8ToLittleEndian(val) == bytes);
403*6777b538SAndroid Build Coastguard Worker   }
404*6777b538SAndroid Build Coastguard Worker   {
405*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u};
406*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int16_t{0x34'12};
407*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I16ToLittleEndian(val), bytes);
408*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 2u>,
409*6777b538SAndroid Build Coastguard Worker                                decltype(I16ToLittleEndian(val))>);
410*6777b538SAndroid Build Coastguard Worker     static_assert(I16ToLittleEndian(val) == bytes);
411*6777b538SAndroid Build Coastguard Worker   }
412*6777b538SAndroid Build Coastguard Worker   {
413*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u};
414*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int32_t{0x78'56'34'12};
415*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I32ToLittleEndian(val), bytes);
416*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 4u>,
417*6777b538SAndroid Build Coastguard Worker                                decltype(I32ToLittleEndian(val))>);
418*6777b538SAndroid Build Coastguard Worker     static_assert(I32ToLittleEndian(val) == bytes);
419*6777b538SAndroid Build Coastguard Worker   }
420*6777b538SAndroid Build Coastguard Worker   {
421*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u,
422*6777b538SAndroid Build Coastguard Worker                                                0x90u, 0x12u, 0x34u, 0x56u};
423*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int64_t{0x56'34'12'90'78'56'34'12};
424*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I64ToLittleEndian(val), bytes);
425*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 8u>,
426*6777b538SAndroid Build Coastguard Worker                                decltype(I64ToLittleEndian(val))>);
427*6777b538SAndroid Build Coastguard Worker     static_assert(I64ToLittleEndian(val) == bytes);
428*6777b538SAndroid Build Coastguard Worker   }
429*6777b538SAndroid Build Coastguard Worker 
430*6777b538SAndroid Build Coastguard Worker   {
431*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u};
432*6777b538SAndroid Build Coastguard Worker     constexpr float val = 1.73782443614e+34f;
433*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(FloatToLittleEndian(val), bytes);
434*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 4u>,
435*6777b538SAndroid Build Coastguard Worker                                decltype(FloatToLittleEndian(val))>);
436*6777b538SAndroid Build Coastguard Worker     static_assert(FloatToLittleEndian(val) == bytes);
437*6777b538SAndroid Build Coastguard Worker   }
438*6777b538SAndroid Build Coastguard Worker 
439*6777b538SAndroid Build Coastguard Worker   {
440*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u,
441*6777b538SAndroid Build Coastguard Worker                                                0x90u, 0x12u, 0x34u, 0x56u};
442*6777b538SAndroid Build Coastguard Worker     constexpr double val = 1.84145159269283616391989849435e107;
443*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(DoubleToLittleEndian(val), bytes);
444*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 8u>,
445*6777b538SAndroid Build Coastguard Worker                                decltype(DoubleToLittleEndian(val))>);
446*6777b538SAndroid Build Coastguard Worker     static_assert(DoubleToLittleEndian(val) == bytes);
447*6777b538SAndroid Build Coastguard Worker   }
448*6777b538SAndroid Build Coastguard Worker }
449*6777b538SAndroid Build Coastguard Worker 
TEST(NumericsTest,ToBigEndian)450*6777b538SAndroid Build Coastguard Worker TEST(NumericsTest, ToBigEndian) {
451*6777b538SAndroid Build Coastguard Worker   // The implementation of ToBigEndian assumes the native endian is little. If
452*6777b538SAndroid Build Coastguard Worker   // support of big endian is desired, compile-time branches will need to be
453*6777b538SAndroid Build Coastguard Worker   // added to the implementation, and the test results will differ there (they
454*6777b538SAndroid Build Coastguard Worker   // would match ToLittleEndian in this test).
455*6777b538SAndroid Build Coastguard Worker   static_assert(std::endian::native == std::endian::little);
456*6777b538SAndroid Build Coastguard Worker   {
457*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 1u> bytes = {0x12u};
458*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint8_t{0x12u};
459*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U8ToBigEndian(val), bytes);
460*6777b538SAndroid Build Coastguard Worker     static_assert(
461*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 1u>, decltype(U8ToBigEndian(val))>);
462*6777b538SAndroid Build Coastguard Worker     static_assert(U8ToBigEndian(val) == bytes);
463*6777b538SAndroid Build Coastguard Worker   }
464*6777b538SAndroid Build Coastguard Worker   {
465*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u};
466*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint16_t{0x12'34u};
467*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U16ToBigEndian(val), bytes);
468*6777b538SAndroid Build Coastguard Worker     static_assert(
469*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 2u>, decltype(U16ToBigEndian(val))>);
470*6777b538SAndroid Build Coastguard Worker     static_assert(U16ToBigEndian(val) == bytes);
471*6777b538SAndroid Build Coastguard Worker   }
472*6777b538SAndroid Build Coastguard Worker   {
473*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u};
474*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint32_t{0x12'34'56'78u};
475*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U32ToBigEndian(val), bytes);
476*6777b538SAndroid Build Coastguard Worker     static_assert(
477*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 4u>, decltype(U32ToBigEndian(val))>);
478*6777b538SAndroid Build Coastguard Worker     static_assert(U32ToBigEndian(val) == bytes);
479*6777b538SAndroid Build Coastguard Worker   }
480*6777b538SAndroid Build Coastguard Worker   {
481*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u,
482*6777b538SAndroid Build Coastguard Worker                                                0x90u, 0x12u, 0x34u, 0x56u};
483*6777b538SAndroid Build Coastguard Worker     constexpr auto val = uint64_t{0x12'34'56'78'90'12'34'56u};
484*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(U64ToBigEndian(val), bytes);
485*6777b538SAndroid Build Coastguard Worker     static_assert(
486*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 8u>, decltype(U64ToBigEndian(val))>);
487*6777b538SAndroid Build Coastguard Worker     static_assert(U64ToBigEndian(val) == bytes);
488*6777b538SAndroid Build Coastguard Worker   }
489*6777b538SAndroid Build Coastguard Worker 
490*6777b538SAndroid Build Coastguard Worker   {
491*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 1u> bytes = {0x12u};
492*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int8_t{0x12u};
493*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I8ToBigEndian(val), bytes);
494*6777b538SAndroid Build Coastguard Worker     static_assert(
495*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 1u>, decltype(I8ToBigEndian(val))>);
496*6777b538SAndroid Build Coastguard Worker     static_assert(I8ToBigEndian(val) == bytes);
497*6777b538SAndroid Build Coastguard Worker   }
498*6777b538SAndroid Build Coastguard Worker   {
499*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u};
500*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int16_t{0x12'34u};
501*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I16ToBigEndian(val), bytes);
502*6777b538SAndroid Build Coastguard Worker     static_assert(
503*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 2u>, decltype(I16ToBigEndian(val))>);
504*6777b538SAndroid Build Coastguard Worker     static_assert(I16ToBigEndian(val) == bytes);
505*6777b538SAndroid Build Coastguard Worker   }
506*6777b538SAndroid Build Coastguard Worker   {
507*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u};
508*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int32_t{0x12'34'56'78u};
509*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I32ToBigEndian(val), bytes);
510*6777b538SAndroid Build Coastguard Worker     static_assert(
511*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 4u>, decltype(I32ToBigEndian(val))>);
512*6777b538SAndroid Build Coastguard Worker     static_assert(I32ToBigEndian(val) == bytes);
513*6777b538SAndroid Build Coastguard Worker   }
514*6777b538SAndroid Build Coastguard Worker   {
515*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u,
516*6777b538SAndroid Build Coastguard Worker                                                0x90u, 0x12u, 0x34u, 0x56u};
517*6777b538SAndroid Build Coastguard Worker     constexpr auto val = int64_t{0x12'34'56'78'90'12'34'56u};
518*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(I64ToBigEndian(val), bytes);
519*6777b538SAndroid Build Coastguard Worker     static_assert(
520*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 8u>, decltype(I64ToBigEndian(val))>);
521*6777b538SAndroid Build Coastguard Worker     static_assert(I64ToBigEndian(val) == bytes);
522*6777b538SAndroid Build Coastguard Worker   }
523*6777b538SAndroid Build Coastguard Worker 
524*6777b538SAndroid Build Coastguard Worker   {
525*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u};
526*6777b538SAndroid Build Coastguard Worker     constexpr float val = 5.6904566139e-28f;
527*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(FloatToBigEndian(val), bytes);
528*6777b538SAndroid Build Coastguard Worker     static_assert(
529*6777b538SAndroid Build Coastguard Worker         std::same_as<std::array<uint8_t, 4u>, decltype(FloatToBigEndian(val))>);
530*6777b538SAndroid Build Coastguard Worker     static_assert(FloatToBigEndian(val) == bytes);
531*6777b538SAndroid Build Coastguard Worker   }
532*6777b538SAndroid Build Coastguard Worker 
533*6777b538SAndroid Build Coastguard Worker   {
534*6777b538SAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u,
535*6777b538SAndroid Build Coastguard Worker                                                0x90u, 0x12u, 0x34u, 0x56u};
536*6777b538SAndroid Build Coastguard Worker     constexpr double val = 5.62634909901491201382066931077e-221;
537*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(DoubleToBigEndian(val), bytes);
538*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::array<uint8_t, 8u>,
539*6777b538SAndroid Build Coastguard Worker                                decltype(DoubleToBigEndian(val))>);
540*6777b538SAndroid Build Coastguard Worker     static_assert(DoubleToBigEndian(val) == bytes);
541*6777b538SAndroid Build Coastguard Worker   }
542*6777b538SAndroid Build Coastguard Worker }
543*6777b538SAndroid Build Coastguard Worker 
544*6777b538SAndroid Build Coastguard Worker }  // namespace base::numerics
545