aboutsummaryrefslogtreecommitdiff
path: root/core/src/Utils/IO/FileStream.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/Utils/IO/FileStream.hpp')
-rw-r--r--core/src/Utils/IO/FileStream.hpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/core/src/Utils/IO/FileStream.hpp b/core/src/Utils/IO/FileStream.hpp
new file mode 100644
index 0000000..224f3b6
--- /dev/null
+++ b/core/src/Utils/IO/FileStream.hpp
@@ -0,0 +1,86 @@
+#pragma once
+
+#include <cstddef>
+#include <cstdint>
+#include <filesystem>
+#include <memory>
+
+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<std::byte[]> 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<std::byte[]> 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();
+};