Serenity Operating System
1/*
2 * Copyright (c) 2021, Ali Mohammad Pur <mpfard@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/StdLibExtraDetails.h>
10#include <AK/Types.h>
11
12namespace AK {
13
14struct ByteReader {
15 template<typename T>
16 requires(IsTriviallyCopyable<T>) static void store(u8* addr, T value)
17 {
18 __builtin_memcpy(addr, &value, sizeof(T));
19 }
20 template<typename T>
21 requires(IsTriviallyConstructible<T>) static void load(u8 const* addr, T& value)
22 {
23 __builtin_memcpy(&value, addr, sizeof(T));
24 }
25
26 template<typename T>
27 static T* load_pointer(u8 const* address)
28 {
29 FlatPtr value;
30 load<FlatPtr>(address, value);
31 return reinterpret_cast<T*>(value);
32 }
33
34 static u16 load16(u8 const* address)
35 {
36 u16 value;
37 load(address, value);
38 return value;
39 }
40
41 static u32 load32(u8 const* address)
42 {
43 u32 value;
44 load(address, value);
45 return value;
46 }
47
48 static u64 load64(u8 const* address)
49 {
50 u64 value;
51 load(address, value);
52 return value;
53 }
54};
55
56}
57
58#if USING_AK_GLOBALLY
59using AK::ByteReader;
60#endif