28#include "iceberg/compat/byte_swap.h"
41template <EndianConvertible T>
43 if constexpr (
sizeof(T) <= 1) {
45 }
else if constexpr (std::is_integral_v<T>) {
46 return static_cast<T
>(
47 internal::ByteSwapUnsigned(
static_cast<std::make_unsigned_t<T>
>(value)));
48 }
else if constexpr (std::is_floating_point_v<T>) {
49 if constexpr (
sizeof(T) ==
sizeof(uint16_t)) {
50 return std::bit_cast<T>(internal::ByteSwapUnsigned(std::bit_cast<uint16_t>(value)));
51 }
else if constexpr (
sizeof(T) ==
sizeof(uint32_t)) {
52 return std::bit_cast<T>(internal::ByteSwapUnsigned(std::bit_cast<uint32_t>(value)));
53 }
else if constexpr (
sizeof(T) ==
sizeof(uint64_t)) {
54 return std::bit_cast<T>(internal::ByteSwapUnsigned(std::bit_cast<uint64_t>(value)));
56 static_assert(
sizeof(T) == 0,
57 "Unsupported floating-point size for endian conversion.");
63template <EndianConvertible T>
65 if constexpr (std::endian::native == std::endian::little) {
73template <EndianConvertible T>
75 if constexpr (std::endian::native == std::endian::little) {
83template <EndianConvertible T>
85 if constexpr (std::endian::native == std::endian::big) {
93template <EndianConvertible T>
95 if constexpr (std::endian::native == std::endian::big) {
104template <EndianConvertible T>
107 std::memcpy(output, &le,
sizeof(le));
112template <EndianConvertible T>
115 std::memcpy(&value, input,
sizeof(value));
121template <EndianConvertible T>
124 std::memcpy(output, &be,
sizeof(be));
129template <EndianConvertible T>
132 std::memcpy(&value, input,
sizeof(value));
Concept for values that can be converted to/from another endian format.
Definition endian.h:37
Core Apache Iceberg C++ APIs.
Definition arrow_io_util.h:34
constexpr T ToLittleEndian(T value)
Convert a value to little-endian format.
Definition endian.h:64
constexpr T FromLittleEndian(T value)
Convert a value from little-endian format.
Definition endian.h:74
T ReadBigEndian(const void *input)
Read a value in big-endian format from a buffer.
Definition endian.h:130
constexpr T ByteSwap(T value)
Byte-swap a value. For floating-point types, only support 32-bit and 64-bit floats.
Definition endian.h:42
constexpr T ToBigEndian(T value)
Convert a value to big-endian format.
Definition endian.h:84
void WriteLittleEndian(T value, void *output)
Write a value in little-endian format to a buffer.
Definition endian.h:105
T ReadLittleEndian(const void *input)
Read a value in little-endian format from a buffer.
Definition endian.h:113
void WriteBigEndian(T value, void *output)
Write a value in big-endian format to a buffer.
Definition endian.h:122
constexpr T FromBigEndian(T value)
Convert a value from big-endian format.
Definition endian.h:94