#pragma once
#include <stdint.h>
#include <system_error>
namespace fs {
#if defined(_WIN32)
using file_t = void*;
#else
using file_t = int;
#endif
}
namespace wpi {
class MappedFileRegion {
public:
enum MapMode {
kReadOnly, kReadWrite, kPriv };
MappedFileRegion() = default;
MappedFileRegion(fs::file_t f, uint64_t length, uint64_t offset,
MapMode mapMode, std::error_code& ec);
~MappedFileRegion() { Unmap(); }
MappedFileRegion(const MappedFileRegion&) = delete;
MappedFileRegion& operator=(const MappedFileRegion&) = delete;
MappedFileRegion(MappedFileRegion&& rhs)
: m_size(rhs.m_size), m_mapping(rhs.m_mapping) {
rhs.m_mapping = nullptr;
#ifdef _WIN32
m_fileHandle = rhs.m_fileHandle;
rhs.m_fileHandle = nullptr;
#endif
}
MappedFileRegion& operator=(MappedFileRegion&& rhs) {
if (m_mapping) {
Unmap();
}
m_size = rhs.m_size;
m_mapping = rhs.m_mapping;
rhs.m_mapping = nullptr;
#ifdef _WIN32
m_fileHandle = rhs.m_fileHandle;
rhs.m_fileHandle = nullptr;
#endif
return *this;
}
explicit operator bool() const { return m_mapping != nullptr; }
void Flush();
void Unmap();
uint64_t size() const { return m_size; }
uint8_t* data() const { return static_cast<uint8_t*>(m_mapping); }
const uint8_t* const_data() const {
return static_cast<const uint8_t*>(m_mapping);
}
static size_t GetAlignment();
private:
uint64_t m_size = 0;
void* m_mapping = nullptr;
#ifdef _WIN32
fs::file_t m_fileHandle = nullptr;
#endif
};
}