#pragma once #include #include #ifdef _WIN32 #include #else #include #include #endif struct DataMap { void* data = nullptr; size_t size = 0; #ifdef _WIN32 HANDLE map_handle = nullptr; #endif bool map_from_reader(void* reader_data, size_t reader_size) { size = reader_size; if (size == 0) return true; #ifdef _WIN32 HANDLE file_handle = reader_data; map_handle = CreateFileMappingA(file_handle, nullptr, PAGE_READONLY, 0, 0, nullptr); if (!map_handle) return false; data = MapViewOfFile(map_handle, FILE_MAP_READ, 0, 0, 0); if (!data) { CloseHandle(map_handle); map_handle = nullptr; return false; } return true; #else int fd = fileno((FILE*)reader_data); if (fd < 0) return false; data = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); if (data == MAP_FAILED) { data = nullptr; return false; } return true; #endif } void close() { if (data) { #ifdef _WIN32 UnmapViewOfFile(data); #else munmap(data, size); #endif data = nullptr; } #ifdef _WIN32 if (map_handle) { CloseHandle(map_handle); map_handle = nullptr; } #endif size = 0; } ~DataMap() { close(); } }; inline void delete_map(void* ptr, size_t length, void* deleter_data) { DataMap* dm = static_cast(deleter_data); if (dm) dm->close(); delete dm; }