13#ifndef WPIUTIL_WPI_ENDIAN_H
14#define WPIUTIL_WPI_ENDIAN_H
16#include "wpi/util/bit.hpp"
17#include "wpi/util/Compiler.hpp"
34template<
class T,
int alignment>
36 enum {
value = alignment == 0 ?
alignof(T) : alignment };
43template <
typename value_type>
45 if (
endian != wpi::util::endianness::native)
51template <
typename value_type, endianness endian>
52[[nodiscard]]
inline value_type
byte_swap(value_type value) {
53 if constexpr (
endian != wpi::util::endianness::native)
59template <
typename value_type, std::
size_t alignment = unaligned>
60[[nodiscard]]
inline value_type
read(
const void *memory, endianness
endian) {
63 memcpy(
static_cast<void *
>(&ret),
70template <
typename value_type, endianness endian, std::
size_t alignment>
71[[nodiscard]]
inline value_type
read(
const void *memory) {
77template <
typename value_type, std::size_t alignment =
unaligned,
79[[nodiscard]]
inline value_type
readNext(
const CharT *&memory,
82 memory +=
sizeof(value_type);
86template <
typename value_type, endianness
endian,
87 std::size_t alignment =
unaligned,
typename CharT>
88[[nodiscard]]
inline value_type
readNext(
const CharT *&memory) {
93template <
typename value_type, std::
size_t alignment = unaligned>
94inline void write(
void *memory, value_type value, endianness
endian) {
96 memcpy(LLVM_ASSUME_ALIGNED(
98 &value,
sizeof(value_type));
101template<
typename value_type,
103 std::size_t alignment>
104inline void write(
void *memory, value_type value) {
110template <
typename value_type, std::size_t alignment =
unaligned,
114 memory +=
sizeof(value_type);
117template <
typename value_type, endianness
endian,
118 std::size_t alignment =
unaligned,
typename CharT>
119inline void writeNext(CharT *&memory, value_type value) {
123template <
typename value_type>
128template <
typename value_type, endianness endian, std::
size_t alignment>
131 assert(startBit < 8);
140 sizeof(value_type) * 2);
148 (
sizeof(value_type) * 8) - startBit;
155 upperVal <<= numBitsFirstVal;
157 return lowerVal | upperVal;
163template <
typename value_type, endianness endian, std::
size_t alignment>
166 assert(startBit < 8);
175 sizeof(value_type) * 2);
183 (
sizeof(value_type) * 8) - startBit;
191 lowerVal <<= startBit;
207 memcpy(LLVM_ASSUME_ALIGNED(
209 &val[0],
sizeof(value_type) * 2);
217template <
typename ValueType, endianness Endian, std::size_t Alignment,
221 static constexpr endianness
endian = Endian;
230 (
const void*)Value.buffer);
235 (
void*)Value.buffer, newValue);
239 *
this = *
this + newValue;
244 *
this = *
this - newValue;
249 *
this = *
this | newValue;
254 *
this = *
this & newValue;
265 explicit ref(
void *Ptr) : Ptr(Ptr) {}
400template <
typename T, endianness E> [[nodiscard]]
inline T
read(
const void *P) {
404[[nodiscard]]
inline uint16_t
read16(
const void *P, endianness E) {
407[[nodiscard]]
inline uint32_t
read32(
const void *P, endianness E) {
410[[nodiscard]]
inline uint64_t
read64(
const void *P, endianness E) {
414template <endianness E> [[nodiscard]]
inline uint16_t
read16(
const void *P) {
417template <endianness E> [[nodiscard]]
inline uint32_t
read32(
const void *P) {
420template <endianness E> [[nodiscard]]
inline uint64_t
read64(
const void *P) {
424[[nodiscard]]
inline uint16_t
read16le(
const void *P) {
427[[nodiscard]]
inline uint32_t
read32le(
const void *P) {
430[[nodiscard]]
inline uint64_t
read64le(
const void *P) {
433[[nodiscard]]
inline uint16_t
read16be(
const void *P) {
436[[nodiscard]]
inline uint32_t
read32be(
const void *P) {
439[[nodiscard]]
inline uint64_t
read64be(
const void *P) {
443template <
typename T, endianness E>
inline void write(
void *P, T V) {
447inline void write16(
void *P, uint16_t V, endianness E) {
450inline void write32(
void *P, uint32_t V, endianness E) {
453inline void write64(
void *P, uint64_t V, endianness E) {
457template <endianness E>
inline void write16(
void *P, uint16_t V) {
460template <endianness E>
inline void write32(
void *P, uint32_t V) {
463template <endianness E>
inline void write64(
void *P, uint64_t V) {
Converts a string literal into a format string that will be parsed at compile time and converted into...
Definition printf.h:50
void write32be(void *P, uint32_t V)
Definition Endian.hpp:479
uint16_t read16be(const void *P)
Definition Endian.hpp:433
void write16(void *P, uint16_t V, endianness E)
Definition Endian.hpp:447
void writeNext(CharT *&memory, value_type value, endianness endian)
Write a value of a particular endianness, and increment the buffer past that value.
Definition Endian.hpp:112
uint32_t read32le(const void *P)
Definition Endian.hpp:427
void write32le(void *P, uint32_t V)
Definition Endian.hpp:470
uint32_t read32(const void *P, endianness E)
Definition Endian.hpp:407
void write16le(void *P, uint16_t V)
Definition Endian.hpp:467
std::make_unsigned_t< value_type > make_unsigned_t
Definition Endian.hpp:124
void write16be(void *P, uint16_t V)
Definition Endian.hpp:476
uint64_t read64(const void *P, endianness E)
Definition Endian.hpp:410
void write(void *memory, value_type value, endianness endian)
Write a value to memory with a particular endianness.
Definition Endian.hpp:94
value_type readAtBitAlignment(const void *memory, uint64_t startBit)
Read a value of a particular endianness from memory, for a location that starts at the given bit offs...
Definition Endian.hpp:129
uint64_t read64be(const void *P)
Definition Endian.hpp:439
void writeAtBitAlignment(void *memory, value_type value, uint64_t startBit)
Write a value to memory with a particular endianness, for a location that starts at the given bit off...
Definition Endian.hpp:164
void write64(void *P, uint64_t V, endianness E)
Definition Endian.hpp:453
uint32_t read32be(const void *P)
Definition Endian.hpp:436
uint64_t read64le(const void *P)
Definition Endian.hpp:430
void write64le(void *P, uint64_t V)
Definition Endian.hpp:473
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
Definition Endian.hpp:60
uint16_t read16le(const void *P)
Definition Endian.hpp:424
void write32(void *P, uint32_t V, endianness E)
Definition Endian.hpp:450
value_type byte_swap(value_type value, endianness endian)
Definition Endian.hpp:44
uint16_t read16(const void *P, endianness E)
Definition Endian.hpp:404
void write64be(void *P, uint64_t V)
Definition Endian.hpp:482
value_type readNext(const CharT *&memory, endianness endian)
Read a value of a particular endianness from a buffer, and increment the buffer past that value.
Definition Endian.hpp:79
detail::packed_endian_specific_integral< uint64_t, wpi::util::endianness::big, aligned > aligned_ubig64_t
Definition Endian.hpp:348
detail::packed_endian_specific_integral< int64_t, wpi::util::endianness::big, unaligned > big64_t
Definition Endian.hpp:338
detail::packed_endian_specific_integral< int16_t, wpi::util::endianness::little, unaligned > little16_t
Definition Endian.hpp:292
detail::packed_endian_specific_integral< int32_t, wpi::util::endianness::little, aligned > aligned_little32_t
Definition Endian.hpp:315
detail::packed_endian_specific_integral< uint16_t, wpi::util::endianness::little, unaligned > ulittle16_t
Definition Endian.hpp:282
detail::packed_endian_specific_integral< T, wpi::util::endianness::big, aligned > aligned_big_t
Definition Endian.hpp:395
detail::packed_endian_specific_integral< int16_t, wpi::util::endianness::native, unaligned > unaligned_int16_t
Definition Endian.hpp:372
detail::packed_endian_specific_integral< int16_t, wpi::util::endianness::big, aligned > aligned_big16_t
Definition Endian.hpp:352
detail::packed_endian_specific_integral< uint16_t, wpi::util::endianness::big, unaligned > ubig16_t
Definition Endian.hpp:322
detail::packed_endian_specific_integral< uint64_t, wpi::util::endianness::native, unaligned > unaligned_uint64_t
Definition Endian.hpp:368
detail::packed_endian_specific_integral< T, wpi::util::endianness::big, unaligned > big_t
Definition Endian.hpp:387
detail::packed_endian_specific_integral< uint32_t, wpi::util::endianness::little, aligned > aligned_ulittle32_t
Definition Endian.hpp:305
detail::packed_endian_specific_integral< int16_t, wpi::util::endianness::big, unaligned > big16_t
Definition Endian.hpp:332
@ unaligned
Definition Endian.hpp:29
@ aligned
Definition Endian.hpp:29
detail::packed_endian_specific_integral< T, wpi::util::endianness::little, unaligned > little_t
Definition Endian.hpp:383
detail::packed_endian_specific_integral< uint64_t, wpi::util::endianness::little, aligned > aligned_ulittle64_t
Definition Endian.hpp:308
detail::packed_endian_specific_integral< int64_t, wpi::util::endianness::little, aligned > aligned_little64_t
Definition Endian.hpp:318
detail::packed_endian_specific_integral< uint32_t, wpi::util::endianness::big, aligned > aligned_ubig32_t
Definition Endian.hpp:345
detail::packed_endian_specific_integral< int16_t, wpi::util::endianness::little, aligned > aligned_little16_t
Definition Endian.hpp:312
detail::packed_endian_specific_integral< uint64_t, wpi::util::endianness::big, unaligned > ubig64_t
Definition Endian.hpp:328
detail::packed_endian_specific_integral< int32_t, wpi::util::endianness::little, unaligned > little32_t
Definition Endian.hpp:295
detail::packed_endian_specific_integral< int64_t, wpi::util::endianness::native, unaligned > unaligned_int64_t
Definition Endian.hpp:378
detail::packed_endian_specific_integral< int32_t, wpi::util::endianness::big, aligned > aligned_big32_t
Definition Endian.hpp:355
detail::packed_endian_specific_integral< int32_t, wpi::util::endianness::big, unaligned > big32_t
Definition Endian.hpp:335
detail::packed_endian_specific_integral< T, wpi::util::endianness::little, aligned > aligned_little_t
Definition Endian.hpp:391
detail::packed_endian_specific_integral< uint32_t, wpi::util::endianness::big, unaligned > ubig32_t
Definition Endian.hpp:325
detail::packed_endian_specific_integral< int64_t, wpi::util::endianness::little, unaligned > little64_t
Definition Endian.hpp:298
detail::packed_endian_specific_integral< uint16_t, wpi::util::endianness::native, unaligned > unaligned_uint16_t
Definition Endian.hpp:362
detail::packed_endian_specific_integral< uint16_t, wpi::util::endianness::big, aligned > aligned_ubig16_t
Definition Endian.hpp:342
detail::packed_endian_specific_integral< uint16_t, wpi::util::endianness::little, aligned > aligned_ulittle16_t
Definition Endian.hpp:302
detail::packed_endian_specific_integral< int32_t, wpi::util::endianness::native, unaligned > unaligned_int32_t
Definition Endian.hpp:375
detail::packed_endian_specific_integral< uint64_t, wpi::util::endianness::little, unaligned > ulittle64_t
Definition Endian.hpp:288
detail::packed_endian_specific_integral< uint32_t, wpi::util::endianness::native, unaligned > unaligned_uint32_t
Definition Endian.hpp:365
detail::packed_endian_specific_integral< uint32_t, wpi::util::endianness::little, unaligned > ulittle32_t
Definition Endian.hpp:285
detail::packed_endian_specific_integral< int64_t, wpi::util::endianness::big, aligned > aligned_big64_t
Definition Endian.hpp:358
void swapByteOrder(T &Value)
Definition SwapByteOrder.hpp:61
Definition raw_os_ostream.hpp:19
value is either alignment, or alignof(T) if alignment is 0.
Definition Endian.hpp:35
@ value
Definition Endian.hpp:36
void operator=(value_type NewValue)
Definition Endian.hpp:271
ref(void *Ptr)
Definition Endian.hpp:265
Definition Endian.hpp:219
packed_endian_specific_integral(value_type val)
Definition Endian.hpp:226
packed_endian_specific_integral & operator|=(value_type newValue)
Definition Endian.hpp:248
packed_endian_specific_integral & operator+=(value_type newValue)
Definition Endian.hpp:238
void operator=(value_type newValue)
Definition Endian.hpp:233
ValueType value_type
Definition Endian.hpp:220
char buffer[sizeof(value_type)]
Definition Endian.hpp:260
packed_endian_specific_integral()=default
static constexpr endianness endian
Definition Endian.hpp:221
packed_endian_specific_integral & operator&=(value_type newValue)
Definition Endian.hpp:253
packed_endian_specific_integral & operator-=(value_type newValue)
Definition Endian.hpp:243
static constexpr std::size_t alignment
Definition Endian.hpp:222