/* * Copyright (c) 2021, Ali Mohammad Pur * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace AK { struct ByteReader { template requires(IsTriviallyCopyable) static void store(u8* addr, T value) { __builtin_memcpy(addr, &value, sizeof(T)); } template requires(IsTriviallyConstructible) static void load(u8 const* addr, T& value) { __builtin_memcpy(&value, addr, sizeof(T)); } template static T* load_pointer(u8 const* address) { FlatPtr value; load(address, value); return reinterpret_cast(value); } static u16 load16(u8 const* address) { u16 value; load(address, value); return value; } static u32 load32(u8 const* address) { u32 value; load(address, value); return value; } static u64 load64(u8 const* address) { u64 value; load(address, value); return value; } }; } #if USING_AK_GLOBALLY using AK::ByteReader; #endif