Serenity Operating System
at master 60 lines 1.2 kB view raw
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