diff options
author | Andrew Kaster <akaster@serenityos.org> | 2021-07-10 14:22:37 -0600 |
---|---|---|
committer | Ali Mohammad Pur <Ali.mpfard@gmail.com> | 2021-07-12 18:42:45 +0430 |
commit | fac4eab415c9066679f85699aa0a4c2bd4240bcd (patch) | |
tree | 13d98acdff96a4179068e1e7500b8d5e97df03d9 | |
parent | 19d34414bccc62202064077f8150cc8b57fc64b6 (diff) | |
download | serenity-fac4eab415c9066679f85699aa0a4c2bd4240bcd.zip |
AK: Add load64 and load_pointer to AK::ByteReader
This lets us load misaligned 64 bit integers, and misaligned pointers
in a platform agnostic way.
-rw-r--r-- | AK/ByteReader.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/AK/ByteReader.h b/AK/ByteReader.h index 5c2a4a8bba..c0da52fe9b 100644 --- a/AK/ByteReader.h +++ b/AK/ByteReader.h @@ -49,6 +49,27 @@ struct ByteReader { value = v._32; } + static void load(const u8* address, u64& value) + { + union { + u64 _64; + u8 _8[8]; + } v { ._64 = 0 }; + __builtin_memcpy(&v._8, address, 8); + value = v._64; + } + + template<typename T> + static T* load_pointer(const u8* address) + { + if constexpr (sizeof(T*) == 4) { + return reinterpret_cast<T*>(load32(address)); + } else { + static_assert(sizeof(T*) == 8, "sizeof(T*) must be either 4 or 8"); + return reinterpret_cast<T*>(load64(address)); + } + } + static u16 load16(const u8* address) { u16 value; @@ -62,6 +83,13 @@ struct ByteReader { load(address, value); return value; } + + static u64 load64(const u8* address) + { + u64 value; + load(address, value); + return value; + } }; } |