#pragma once #include "Interface/Memory/SharedMem.h" #include #include #include namespace FEXCore::Context { struct Context; } namespace FEXCore::Memory { class MemMapper final { friend struct FEXCore::Context::Context; public: void SetBaseRegion(FEXCore::SHM::SHMObject *NewSHM) { SHM = reinterpret_cast(NewSHM); } void *MapRegion(uint64_t Offset, size_t Size, bool Fixed = true); void *MapRegion(uint64_t Offset, size_t Size, uint32_t Flags, bool Fixed = true); void *ChangeMappedRegion(uint64_t Offset, size_t Size, uint32_t Flags, bool Fixed = true); void UnmapRegion(void *Ptr, size_t Size); void *GetMemoryBase() { return SHM->Object.Ptr; } void *GetPointer(uint64_t Offset); #ifndef NDEBUG void *GetPointerSizeCheck(uint64_t Offset, uint64_t Size); #else void *GetPointerSizeCheck(uint64_t Offset, uint64_t Size) { return GetPointer(Offset); } #endif template T GetPointer(uint64_t Offset) { return reinterpret_cast(GetPointer(Offset)); } template T GetBaseOffset(uint64_t Offset) { return reinterpret_cast((reinterpret_cast(GetMemoryBase()) + Offset)); } private: FEXCore::SHM::InternalSHMObject *SHM; std::vector MappedRegions{}; }; }