100 reinterpret_cast<uintptr_t
>(dest) % 32 == 0 &&
reinterpret_cast<uintptr_t
>(src) % 32 == 0;
101 if (
sizeof(T) == 1) {
102 std::memcpy(dest, src, count);
103 }
else if (
sizeof(T) == 2) {
104 auto ps =
reinterpret_cast<const u16*
>(src);
105 auto pd =
reinterpret_cast<u16*
>(dest);
111 }
else if (
sizeof(T) == 4) {
112 auto ps =
reinterpret_cast<const u32*
>(src);
113 auto pd =
reinterpret_cast<u32*
>(dest);
119 }
else if (
sizeof(T) == 8) {
120 auto ps =
reinterpret_cast<const u64*
>(src);
121 auto pd =
reinterpret_cast<u64*
>(dest);
134inline T
load(
const void* mem) {
135 static_assert(std::is_trivially_copyable_v<T>,
"T must be trivially copyable");
137 std::memcpy(&result, mem,
sizeof(T));
160 for (i32 i = 0;; ++i) {
165 value.push_back(
static_cast<char>(c));
177 std::u16string value;
178 for (i32 i = 0;; ++i) {
183 value.push_back(
static_cast<wchar_t>(c));
190inline void store(
void* mem,
const T& value) {
191 static_assert(std::is_trivially_copyable_v<T>,
"T must be trivially copyable");
192 std::memcpy(mem, &value,
sizeof(T));
208 for (
size_t i = 0; i < value.size(); ++i) {
222 for (
size_t i = 0; i < value.size(); ++i) {
239 return (
static_cast<u32
>(p[0]) << 16) | (
static_cast<u32
>(p[1]) << 8) |
static_cast<u32
>(p[2]);
248 return (
static_cast<u32
>(p[2]) << 16) | (
static_cast<u32
>(p[1]) << 8) |
static_cast<u32
>(p[0]);
258 p[2] =
static_cast<u8
>((value >> 16) & 0xFF);
259 p[1] =
static_cast<u8
>((value >> 8) & 0xFF);
260 p[0] =
static_cast<u8
>(value & 0xFF);
274 return ((
static_cast<FourCCT>(a) << 24) | (
static_cast<FourCCT>(b) << 16) |
285 if (fourcc.length() != 4) {
286 throw std::runtime_error(
"Invalid fourcc length");
288 return make_fourcc(fourcc[0], fourcc[1], fourcc[2], fourcc[3]);
#define REX_ASSERT_ALWAYS(...)
Definition assert.h:102
void copy_and_swap_16_in_32_aligned(void *dest, const void *src, size_t count)
void copy_and_swap_32_unaligned(void *dest, const void *src, size_t count)
void store_and_swap< std::string_view >(void *mem, const std::string_view &value)
Definition endian.h:207
void copy_and_swap_64_aligned(void *dest, const void *src, size_t count)
u32 FourCCT
Definition endian.h:264
void store_and_swap(void *mem, const T &value)
Definition endian.h:201
void copy_and_swap_16_unaligned(void *dest, const void *src, size_t count)
std::string load_and_swap< std::string >(const void *mem)
Definition endian.h:158
void copy_and_swap(T *dest, const T *src, size_t count)
Definition endian.h:98
constexpr u32 LoadUint24LE(const u8 *p)
Definition endian.h:247
void copy_and_swap_64_unaligned(void *dest, const void *src, size_t count)
void store(void *mem, const T &value)
Definition endian.h:190
constexpr void StoreUint24LE(u8 *p, u32 value)
Definition endian.h:257
void copy_and_swap_32_aligned(void *dest, const void *src, size_t count)
void store_and_swap< std::string >(void *mem, const std::string &value)
Definition endian.h:215
void store_and_swap< std::u16string >(void *mem, const std::u16string &value)
Definition endian.h:229
void copy_and_swap_16_aligned(void *dest, const void *src, size_t count)
constexpr u32 LoadUint24BE(const u8 *p)
Definition endian.h:238
void Copy128Aligned(void *dest, const void *src, size_t count)
std::u16string load_and_swap< std::u16string >(const void *mem)
Definition endian.h:176
T load(const void *mem)
Definition endian.h:134
void store_and_swap< std::u16string_view >(void *mem, const std::u16string_view &value)
Definition endian.h:221
T load_and_swap(const void *mem)
Definition endian.h:148
void copy_and_swap_16_in_32_unaligned(void *dest, const void *src, size_t count)
constexpr FourCCT make_fourcc(char a, char b, char c, char d)
Definition endian.h:273
constexpr T byte_swap(T value) noexcept
Definition types.h:52
Integer types, byte order wrappers and size literals.