module; #include export module FileSystem; import std; export { struct FileHandle { std::size_t id = 0; std::size_t size = 0; std::size_t bufferSize = 0; std::uint8_t *data = nullptr; std::uint8_t *buffer = nullptr; #ifndef NDEBUG std::filesystem::path debugPath; #endif #ifdef _WIN32 HANDLE win32Handle = INVALID_HANDLE_VALUE; OVERLAPPED overlapped; #endif #ifdef __linux__ #endif }; class IFileSystem { public: static constexpr std::uint32_t FILE_OPEN_NONE = 0; static constexpr std::uint32_t FILE_OPEN_READ = (1 << 0); static constexpr std::uint32_t FILE_OPEN_WRITE = (1 << 1); static constexpr std::uint32_t FILE_OPEN_MMAP = (1 << 2); static constexpr std::uint32_t FILE_READ_SEQUENTIAL = 0; static constexpr std::uint32_t FILE_READ_RANDOM_ACCESS = (1 << 0); virtual FileHandle& Open(const std::filesystem::path& path, std::uint32_t flags) = 0; virtual void ReadAsync(FileHandle& file, std::uint32_t bufferSize, std::uint32_t flags) = 0; virtual bool PollReady(FileHandle& file) = 0; virtual void Close(FileHandle& file) = 0; virtual ~IFileSystem(); protected: std::vector activeFiles; std::vector failedFiles; std::vector freeFileSlots; }; class NativeFileSystem final : public IFileSystem { public: FileHandle& Open(const std::filesystem::path& path, std::uint32_t flags) override; void ReadAsync(FileHandle& file, std::uint32_t bufferSize, std::uint32_t flags) override; bool PollReady(FileHandle& file) override; void Close(FileHandle& file) override; }; }