Files
LNXRNT/Sources/data_map.h
2026-07-09 23:51:42 -07:00

70 lines
1.5 KiB
C++

#pragma once
#include <cstdint>
#include <cstdio>
#ifdef _WIN32
#include <Windows.h>
#else
#include <sys/mman.h>
#include <unistd.h>
#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<DataMap*>(deleter_data);
if (dm) dm->close();
delete dm;
}