blob: 11a7ebc4aea6accf0fed02a1bb8dd3f6af4bc8dc [file] [log] [blame]
// 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