| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/numerics/byte_conversions.h" |
| |
| #include <array> |
| #include <bit> |
| #include <concepts> |
| #include <cstdint> |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base::numerics { |
| |
| TEST(NumericsTest, FromNativeEndian) { |
| // The implementation of FromNativeEndian and FromLittleEndian assumes the |
| // native endian is little. If support of big endian is desired, compile-time |
| // branches will need to be added to the implementation, and the test results |
| // will differ there (they would match FromBigEndian in this test). |
| static_assert(std::endian::native == std::endian::little); |
| { |
| constexpr uint8_t bytes[] = {0x12u}; |
| EXPECT_EQ(U8FromNativeEndian(bytes), 0x12u); |
| static_assert(std::same_as<uint8_t, decltype(U8FromNativeEndian(bytes))>); |
| static_assert(U8FromNativeEndian(bytes) == 0x12u); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u}; |
| EXPECT_EQ(U16FromNativeEndian(bytes), 0x34'12u); |
| static_assert(std::same_as<uint16_t, decltype(U16FromNativeEndian(bytes))>); |
| static_assert(U16FromNativeEndian(bytes) == 0x34'12u); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u}; |
| EXPECT_EQ(U32FromNativeEndian(bytes), 0x78'56'34'12u); |
| static_assert(std::same_as<uint32_t, decltype(U32FromNativeEndian(bytes))>); |
| static_assert(U32FromNativeEndian(bytes) == 0x78'56'34'12u); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| EXPECT_EQ(U64FromNativeEndian(bytes), 0x56'34'12'90'78'56'34'12u); |
| static_assert(std::same_as<uint64_t, decltype(U64FromNativeEndian(bytes))>); |
| static_assert(U64FromNativeEndian(bytes) == 0x56'34'12'90'78'56'34'12u); |
| } |
| |
| { |
| constexpr uint8_t bytes[] = {0x12u}; |
| EXPECT_EQ(I8FromNativeEndian(bytes), 0x12); |
| static_assert(std::same_as<int8_t, decltype(I8FromNativeEndian(bytes))>); |
| static_assert(U8FromNativeEndian(bytes) == 0x12); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u}; |
| EXPECT_EQ(I16FromNativeEndian(bytes), 0x34'12); |
| static_assert(std::same_as<int16_t, decltype(I16FromNativeEndian(bytes))>); |
| static_assert(U16FromNativeEndian(bytes) == 0x34'12); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u}; |
| EXPECT_EQ(I32FromNativeEndian(bytes), 0x78'56'34'12); |
| static_assert(std::same_as<int32_t, decltype(I32FromNativeEndian(bytes))>); |
| static_assert(U32FromNativeEndian(bytes) == 0x78'56'34'12); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| EXPECT_EQ(I64FromNativeEndian(bytes), 0x56'34'12'90'78'56'34'12); |
| static_assert(std::same_as<int64_t, decltype(I64FromNativeEndian(bytes))>); |
| static_assert(I64FromNativeEndian(bytes) == 0x56'34'12'90'78'56'34'12); |
| } |
| |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u}; |
| EXPECT_EQ(FloatFromNativeEndian(bytes), 1.73782443614e+34f); |
| EXPECT_EQ(std::bit_cast<uint32_t>(FloatFromNativeEndian(bytes)), |
| 0x78'56'34'12u); |
| static_assert(std::same_as<float, decltype(FloatFromNativeEndian(bytes))>); |
| static_assert(FloatFromNativeEndian(bytes) == 1.73782443614e+34f); |
| static_assert(std::bit_cast<uint32_t>(FloatFromNativeEndian(bytes)) == |
| 0x78'56'34'12u); |
| } |
| |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| EXPECT_EQ(DoubleFromNativeEndian(bytes), |
| 1.84145159269283616391989849435e107); |
| EXPECT_EQ(std::bit_cast<uint64_t>(DoubleFromNativeEndian(bytes)), |
| 0x56'34'12'90'78'56'34'12u); |
| static_assert( |
| std::same_as<double, decltype(DoubleFromNativeEndian(bytes))>); |
| static_assert(DoubleFromNativeEndian(bytes) == |
| 1.84145159269283616391989849435e107); |
| static_assert(std::bit_cast<uint64_t>(DoubleFromNativeEndian(bytes)) == |
| 0x56'34'12'90'78'56'34'12u); |
| } |
| } |
| |
| TEST(NumericsTest, FromLittleEndian) { |
| // The implementation of FromNativeEndian and FromLittleEndian assumes the |
| // native endian is little. If support of big endian is desired, compile-time |
| // branches will need to be added to the implementation, and the test results |
| // will differ there (they would match FromBigEndian in this test). |
| static_assert(std::endian::native == std::endian::little); |
| { |
| constexpr uint8_t bytes[] = {0x12u}; |
| EXPECT_EQ(U8FromLittleEndian(bytes), 0x12u); |
| static_assert(std::same_as<uint8_t, decltype(U8FromLittleEndian(bytes))>); |
| static_assert(U8FromLittleEndian(bytes) == 0x12u); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u}; |
| EXPECT_EQ(U16FromLittleEndian(bytes), 0x34'12u); |
| static_assert(std::same_as<uint16_t, decltype(U16FromLittleEndian(bytes))>); |
| static_assert(U16FromLittleEndian(bytes) == 0x34'12u); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u}; |
| EXPECT_EQ(U32FromLittleEndian(bytes), 0x78'56'34'12u); |
| static_assert(std::same_as<uint32_t, decltype(U32FromLittleEndian(bytes))>); |
| static_assert(U32FromLittleEndian(bytes) == 0x78'56'34'12u); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| EXPECT_EQ(U64FromLittleEndian(bytes), 0x56'34'12'90'78'56'34'12u); |
| static_assert(std::same_as<uint64_t, decltype(U64FromLittleEndian(bytes))>); |
| static_assert(U64FromLittleEndian(bytes) == 0x56'34'12'90'78'56'34'12u); |
| } |
| |
| { |
| constexpr uint8_t bytes[] = {0x12u}; |
| EXPECT_EQ(I8FromLittleEndian(bytes), 0x12); |
| static_assert(std::same_as<int8_t, decltype(I8FromLittleEndian(bytes))>); |
| static_assert(I8FromLittleEndian(bytes) == 0x12); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u}; |
| EXPECT_EQ(I16FromLittleEndian(bytes), 0x34'12); |
| static_assert(std::same_as<int16_t, decltype(I16FromLittleEndian(bytes))>); |
| static_assert(I16FromLittleEndian(bytes) == 0x34'12); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u}; |
| EXPECT_EQ(I32FromLittleEndian(bytes), 0x78'56'34'12); |
| static_assert(std::same_as<int32_t, decltype(I32FromLittleEndian(bytes))>); |
| static_assert(I32FromLittleEndian(bytes) == 0x78'56'34'12); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| EXPECT_EQ(I64FromLittleEndian(bytes), 0x56'34'12'90'78'56'34'12); |
| static_assert(std::same_as<int64_t, decltype(I64FromLittleEndian(bytes))>); |
| static_assert(I64FromLittleEndian(bytes) == 0x56'34'12'90'78'56'34'12); |
| } |
| |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u}; |
| EXPECT_EQ(FloatFromLittleEndian(bytes), 1.73782443614e+34f); |
| EXPECT_EQ(std::bit_cast<uint32_t>(FloatFromLittleEndian(bytes)), |
| 0x78'56'34'12u); |
| static_assert(std::same_as<float, decltype(FloatFromLittleEndian(bytes))>); |
| static_assert(FloatFromLittleEndian(bytes) == 1.73782443614e+34f); |
| static_assert(std::bit_cast<uint32_t>(FloatFromLittleEndian(bytes)) == |
| 0x78'56'34'12u); |
| } |
| |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| EXPECT_EQ(DoubleFromLittleEndian(bytes), |
| 1.84145159269283616391989849435e107); |
| EXPECT_EQ(std::bit_cast<uint64_t>(DoubleFromLittleEndian(bytes)), |
| 0x56'34'12'90'78'56'34'12u); |
| static_assert( |
| std::same_as<double, decltype(DoubleFromLittleEndian(bytes))>); |
| static_assert(DoubleFromLittleEndian(bytes) == |
| 1.84145159269283616391989849435e107); |
| static_assert(std::bit_cast<uint64_t>(DoubleFromLittleEndian(bytes)) == |
| 0x56'34'12'90'78'56'34'12u); |
| } |
| } |
| |
| TEST(NumericsTest, FromBigEndian) { |
| // The implementation of FromNativeEndian and FromLittleEndian assumes the |
| // native endian is little. If support of big endian is desired, compile-time |
| // branches will need to be added to the implementation, and the test results |
| // will differ there (they would match FromLittleEndian in this test). |
| static_assert(std::endian::native == std::endian::little); |
| { |
| constexpr uint8_t bytes[] = {0x12u}; |
| EXPECT_EQ(U8FromBigEndian(bytes), 0x12u); |
| static_assert(U8FromBigEndian(bytes) == 0x12u); |
| static_assert(std::same_as<uint8_t, decltype(U8FromBigEndian(bytes))>); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u}; |
| EXPECT_EQ(U16FromBigEndian(bytes), 0x12'34u); |
| static_assert(U16FromBigEndian(bytes) == 0x12'34u); |
| static_assert(std::same_as<uint16_t, decltype(U16FromBigEndian(bytes))>); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u}; |
| EXPECT_EQ(U32FromBigEndian(bytes), 0x12'34'56'78u); |
| static_assert(U32FromBigEndian(bytes) == 0x12'34'56'78u); |
| static_assert(std::same_as<uint32_t, decltype(U32FromBigEndian(bytes))>); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| EXPECT_EQ(U64FromBigEndian(bytes), 0x12'34'56'78'90'12'34'56u); |
| static_assert(U64FromBigEndian(bytes) == 0x12'34'56'78'90'12'34'56u); |
| static_assert(std::same_as<uint64_t, decltype(U64FromBigEndian(bytes))>); |
| } |
| |
| { |
| constexpr uint8_t bytes[] = {0x12u}; |
| EXPECT_EQ(I8FromBigEndian(bytes), 0x12); |
| static_assert(I8FromBigEndian(bytes) == 0x12); |
| static_assert(std::same_as<int8_t, decltype(I8FromBigEndian(bytes))>); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u}; |
| EXPECT_EQ(I16FromBigEndian(bytes), 0x12'34); |
| static_assert(I16FromBigEndian(bytes) == 0x12'34); |
| static_assert(std::same_as<int16_t, decltype(I16FromBigEndian(bytes))>); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u}; |
| EXPECT_EQ(I32FromBigEndian(bytes), 0x12'34'56'78); |
| static_assert(I32FromBigEndian(bytes) == 0x12'34'56'78); |
| static_assert(std::same_as<int32_t, decltype(I32FromBigEndian(bytes))>); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| EXPECT_EQ(I64FromBigEndian(bytes), 0x12'34'56'78'90'12'34'56); |
| static_assert(I64FromBigEndian(bytes) == 0x12'34'56'78'90'12'34'56); |
| static_assert(std::same_as<int64_t, decltype(I64FromBigEndian(bytes))>); |
| } |
| |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u}; |
| EXPECT_EQ(FloatFromBigEndian(bytes), 5.6904566139e-28f); |
| EXPECT_EQ(std::bit_cast<uint32_t>(FloatFromBigEndian(bytes)), |
| 0x12'34'56'78u); |
| static_assert(std::same_as<float, decltype(FloatFromBigEndian(bytes))>); |
| static_assert(FloatFromBigEndian(bytes) == 5.6904566139e-28f); |
| static_assert(std::bit_cast<uint32_t>(FloatFromBigEndian(bytes)) == |
| 0x12'34'56'78u); |
| } |
| { |
| constexpr uint8_t bytes[] = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| EXPECT_EQ(DoubleFromBigEndian(bytes), 5.62634909901491201382066931077e-221); |
| EXPECT_EQ(std::bit_cast<uint64_t>(DoubleFromBigEndian(bytes)), |
| 0x12'34'56'78'90'12'34'56u); |
| static_assert(std::same_as<double, decltype(DoubleFromBigEndian(bytes))>); |
| static_assert(DoubleFromBigEndian(bytes) == |
| 5.62634909901491201382066931077e-221); |
| static_assert(std::bit_cast<uint64_t>(DoubleFromBigEndian(bytes)) == |
| 0x12'34'56'78'90'12'34'56u); |
| } |
| } |
| |
| TEST(NumericsTest, ToNativeEndian) { |
| // The implementation of ToNativeEndian and ToLittleEndian assumes the native |
| // endian is little. If support of big endian is desired, compile-time |
| // branches will need to be added to the implementation, and the test results |
| // will differ there (they would match ToBigEndian in this test). |
| static_assert(std::endian::native == std::endian::little); |
| { |
| constexpr std::array<uint8_t, 1u> bytes = {0x12u}; |
| constexpr auto val = uint8_t{0x12u}; |
| EXPECT_EQ(U8ToNativeEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 1u>, decltype(U8ToNativeEndian(val))>); |
| static_assert(U8ToNativeEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u}; |
| constexpr auto val = uint16_t{0x34'12u}; |
| EXPECT_EQ(U16ToNativeEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 2u>, |
| decltype(U16ToNativeEndian(val))>); |
| static_assert(U16ToNativeEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u}; |
| constexpr auto val = uint32_t{0x78'56'34'12u}; |
| EXPECT_EQ(U32ToNativeEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 4u>, |
| decltype(U32ToNativeEndian(val))>); |
| static_assert(U32ToNativeEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| constexpr auto val = uint64_t{0x56'34'12'90'78'56'34'12u}; |
| EXPECT_EQ(U64ToNativeEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 8u>, |
| decltype(U64ToNativeEndian(val))>); |
| static_assert(U64ToNativeEndian(val) == bytes); |
| } |
| |
| { |
| constexpr std::array<uint8_t, 1u> bytes = {0x12u}; |
| constexpr auto val = int8_t{0x12}; |
| EXPECT_EQ(I8ToNativeEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 1u>, decltype(I8ToNativeEndian(val))>); |
| static_assert(I8ToNativeEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u}; |
| constexpr auto val = int16_t{0x34'12}; |
| EXPECT_EQ(I16ToNativeEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 2u>, |
| decltype(I16ToNativeEndian(val))>); |
| static_assert(I16ToNativeEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u}; |
| constexpr auto val = int32_t{0x78'56'34'12}; |
| EXPECT_EQ(I32ToNativeEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 4u>, |
| decltype(I32ToNativeEndian(val))>); |
| static_assert(I32ToNativeEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| constexpr auto val = int64_t{0x56'34'12'90'78'56'34'12}; |
| EXPECT_EQ(I64ToNativeEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 8u>, |
| decltype(I64ToNativeEndian(val))>); |
| static_assert(I64ToNativeEndian(val) == bytes); |
| } |
| |
| { |
| constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u}; |
| constexpr float val = 1.73782443614e+34f; |
| EXPECT_EQ(FloatToNativeEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 4u>, |
| decltype(FloatToNativeEndian(val))>); |
| static_assert(FloatToNativeEndian(val) == bytes); |
| } |
| |
| { |
| constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| constexpr double val = 1.84145159269283616391989849435e107; |
| EXPECT_EQ(DoubleToNativeEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 8u>, |
| decltype(DoubleToNativeEndian(val))>); |
| static_assert(DoubleToNativeEndian(val) == bytes); |
| } |
| } |
| |
| TEST(NumericsTest, ToLittleEndian) { |
| // The implementation of ToNativeEndian and ToLittleEndian assumes the native |
| // endian is little. If support of big endian is desired, compile-time |
| // branches will need to be added to the implementation, and the test results |
| // will differ there (they would match ToBigEndian in this test). |
| static_assert(std::endian::native == std::endian::little); |
| { |
| constexpr std::array<uint8_t, 1u> bytes = {0x12u}; |
| constexpr auto val = uint8_t{0x12u}; |
| EXPECT_EQ(U8ToLittleEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 1u>, decltype(U8ToLittleEndian(val))>); |
| static_assert(U8ToLittleEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u}; |
| constexpr auto val = uint16_t{0x34'12u}; |
| EXPECT_EQ(U16ToLittleEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 2u>, |
| decltype(U16ToLittleEndian(val))>); |
| static_assert(U16ToLittleEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u}; |
| constexpr auto val = uint32_t{0x78'56'34'12u}; |
| EXPECT_EQ(U32ToLittleEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 4u>, |
| decltype(U32ToLittleEndian(val))>); |
| static_assert(U32ToLittleEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| constexpr auto val = uint64_t{0x56'34'12'90'78'56'34'12u}; |
| EXPECT_EQ(U64ToLittleEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 8u>, |
| decltype(U64ToLittleEndian(val))>); |
| static_assert(U64ToLittleEndian(val) == bytes); |
| } |
| |
| { |
| constexpr std::array<uint8_t, 1u> bytes = {0x12u}; |
| constexpr auto val = int8_t{0x12}; |
| EXPECT_EQ(I8ToLittleEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 1u>, decltype(I8ToLittleEndian(val))>); |
| static_assert(I8ToLittleEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u}; |
| constexpr auto val = int16_t{0x34'12}; |
| EXPECT_EQ(I16ToLittleEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 2u>, |
| decltype(I16ToLittleEndian(val))>); |
| static_assert(I16ToLittleEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u}; |
| constexpr auto val = int32_t{0x78'56'34'12}; |
| EXPECT_EQ(I32ToLittleEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 4u>, |
| decltype(I32ToLittleEndian(val))>); |
| static_assert(I32ToLittleEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| constexpr auto val = int64_t{0x56'34'12'90'78'56'34'12}; |
| EXPECT_EQ(I64ToLittleEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 8u>, |
| decltype(I64ToLittleEndian(val))>); |
| static_assert(I64ToLittleEndian(val) == bytes); |
| } |
| |
| { |
| constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u}; |
| constexpr float val = 1.73782443614e+34f; |
| EXPECT_EQ(FloatToLittleEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 4u>, |
| decltype(FloatToLittleEndian(val))>); |
| static_assert(FloatToLittleEndian(val) == bytes); |
| } |
| |
| { |
| constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| constexpr double val = 1.84145159269283616391989849435e107; |
| EXPECT_EQ(DoubleToLittleEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 8u>, |
| decltype(DoubleToLittleEndian(val))>); |
| static_assert(DoubleToLittleEndian(val) == bytes); |
| } |
| } |
| |
| TEST(NumericsTest, ToBigEndian) { |
| // The implementation of ToBigEndian assumes the native endian is little. If |
| // support of big endian is desired, compile-time branches will need to be |
| // added to the implementation, and the test results will differ there (they |
| // would match ToLittleEndian in this test). |
| static_assert(std::endian::native == std::endian::little); |
| { |
| constexpr std::array<uint8_t, 1u> bytes = {0x12u}; |
| constexpr auto val = uint8_t{0x12u}; |
| EXPECT_EQ(U8ToBigEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 1u>, decltype(U8ToBigEndian(val))>); |
| static_assert(U8ToBigEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u}; |
| constexpr auto val = uint16_t{0x12'34u}; |
| EXPECT_EQ(U16ToBigEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 2u>, decltype(U16ToBigEndian(val))>); |
| static_assert(U16ToBigEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u}; |
| constexpr auto val = uint32_t{0x12'34'56'78u}; |
| EXPECT_EQ(U32ToBigEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 4u>, decltype(U32ToBigEndian(val))>); |
| static_assert(U32ToBigEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| constexpr auto val = uint64_t{0x12'34'56'78'90'12'34'56u}; |
| EXPECT_EQ(U64ToBigEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 8u>, decltype(U64ToBigEndian(val))>); |
| static_assert(U64ToBigEndian(val) == bytes); |
| } |
| |
| { |
| constexpr std::array<uint8_t, 1u> bytes = {0x12u}; |
| constexpr auto val = int8_t{0x12u}; |
| EXPECT_EQ(I8ToBigEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 1u>, decltype(I8ToBigEndian(val))>); |
| static_assert(I8ToBigEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 2u> bytes = {0x12u, 0x34u}; |
| constexpr auto val = int16_t{0x12'34u}; |
| EXPECT_EQ(I16ToBigEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 2u>, decltype(I16ToBigEndian(val))>); |
| static_assert(I16ToBigEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u}; |
| constexpr auto val = int32_t{0x12'34'56'78u}; |
| EXPECT_EQ(I32ToBigEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 4u>, decltype(I32ToBigEndian(val))>); |
| static_assert(I32ToBigEndian(val) == bytes); |
| } |
| { |
| constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| constexpr auto val = int64_t{0x12'34'56'78'90'12'34'56u}; |
| EXPECT_EQ(I64ToBigEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 8u>, decltype(I64ToBigEndian(val))>); |
| static_assert(I64ToBigEndian(val) == bytes); |
| } |
| |
| { |
| constexpr std::array<uint8_t, 4u> bytes = {0x12u, 0x34u, 0x56u, 0x78u}; |
| constexpr float val = 5.6904566139e-28f; |
| EXPECT_EQ(FloatToBigEndian(val), bytes); |
| static_assert( |
| std::same_as<std::array<uint8_t, 4u>, decltype(FloatToBigEndian(val))>); |
| static_assert(FloatToBigEndian(val) == bytes); |
| } |
| |
| { |
| constexpr std::array<uint8_t, 8u> bytes = {0x12u, 0x34u, 0x56u, 0x78u, |
| 0x90u, 0x12u, 0x34u, 0x56u}; |
| constexpr double val = 5.62634909901491201382066931077e-221; |
| EXPECT_EQ(DoubleToBigEndian(val), bytes); |
| static_assert(std::same_as<std::array<uint8_t, 8u>, |
| decltype(DoubleToBigEndian(val))>); |
| static_assert(DoubleToBigEndian(val) == bytes); |
| } |
| } |
| |
| } // namespace base::numerics |