#pragma once #include #include #include #include struct IoResult { enum ErrorKind { ERR_None, ERR_PermissionDenied, ERR_UnexpectedEof, ERR_Unsupported, ERR_OutOfSpace, ERR_Other, }; ErrorKind Error; int32_t SystemError; size_t BytesMoved; }; class InputFileStream { private: alignas(void*) char mOsFileHandle[sizeof(void*)]; // mBuffer is always mReadInSize size std::unique_ptr mBuffer; int mReadInSize = 1024; int mFirstByteIdx = 0; int mAvailableBytes = 0; bool mEof = false; public: InputFileStream(const std::filesystem::path& path); ~InputFileStream(); InputFileStream(const InputFileStream&) = delete; InputFileStream& operator=(const InputFileStream&) = delete; InputFileStream(InputFileStream&&) = default; InputFileStream& operator=(InputFileStream&&) = default; int GetReadInSize() const; void SetReadInSize(int size); bool IsEof() const; IoResult ReadBytes(size_t bufferLength, std::byte* buffer); }; class OutputFileStream { public: enum WriteMode { AppendFile, TruncateFile, }; private: alignas(void*) char mOsFileHandle[sizeof(void*)]; std::unique_ptr mBuffer; int mMaxBufferSize = 1024; int mCurrentBufferSize = 0; public: OutputFileStream(const std::filesystem::path& path, WriteMode mode); ~OutputFileStream(); OutputFileStream(const OutputFileStream&) = delete; OutputFileStream& operator=(const OutputFileStream&) = delete; OutputFileStream(OutputFileStream&&) = default; OutputFileStream& operator=(OutputFileStream&&) = default; int GetMaxBufferSize() const; void SetMaxBufferSize(int maxSize); IoResult WriteBytes(size_t bufferLength, const std::byte* buffer); void FlushBuffer(); };