From 659b410caa556fce58e5a1abe0b7977b069c85df Mon Sep 17 00:00:00 2001 From: Green Sky Date: Wed, 3 Apr 2024 21:03:04 +0200 Subject: [PATCH] add in memory read and write for file2 --- CMakeLists.txt | 2 ++ solanaceae/file/file2_mem.cpp | 59 +++++++++++++++++++++++++++++++++++ solanaceae/file/file2_mem.hpp | 32 +++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 solanaceae/file/file2_mem.cpp create mode 100644 solanaceae/file/file2_mem.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ca32343..e07f3b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,8 @@ add_library(solanaceae_file2 ./solanaceae/file/file2.hpp ./solanaceae/file/file2_std.hpp ./solanaceae/file/file2_std.cpp + ./solanaceae/file/file2_mem.hpp + ./solanaceae/file/file2_mem.cpp ) target_include_directories(solanaceae_file2 PUBLIC .) diff --git a/solanaceae/file/file2_mem.cpp b/solanaceae/file/file2_mem.cpp new file mode 100644 index 0000000..9944157 --- /dev/null +++ b/solanaceae/file/file2_mem.cpp @@ -0,0 +1,59 @@ +#include "./file2_mem.hpp" + +File2MemW::File2MemW(std::vector& mem) : File2I(true, false), _mem(mem) { +} + +File2MemW::~File2MemW(void) { +} + +bool File2MemW::isGood(void) { + // TODO: are there any error cases? + return true; +} + +bool File2MemW::write(const ByteSpan data, int64_t pos) { + if (pos != -1) { // only support streaming + return false; + } + + if (data.empty()) { + return false; // true instead? + } + + _mem.insert(_mem.cend(), data.cbegin(), data.cend()); + + return isGood(); +} + +std::variant> File2MemW::read(uint64_t size, int64_t pos) { + return {}; +} + +File2MemR::File2MemR(ByteSpan mem) : File2I(false, true), _mem(mem) { +} + +File2MemR::~File2MemR(void) { +} + +bool File2MemR::isGood(void) { + // TODO: return false if eof? + return true; +} + +bool File2MemR::write(const ByteSpan data, int64_t pos) { + return false; +} + +std::variant> File2MemR::read(uint64_t size, int64_t pos) { + if (_read_pos >= _mem.size) { + return {}; + } + + ByteSpan ret { + _mem.ptr + _read_pos, + std::min(size, _mem.size - _read_pos) + }; + _read_pos += ret.size; + return ret; +} + diff --git a/solanaceae/file/file2_mem.hpp b/solanaceae/file/file2_mem.hpp new file mode 100644 index 0000000..5b24383 --- /dev/null +++ b/solanaceae/file/file2_mem.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include "./file2.hpp" + +// write to vector or read from span +// no seeking for now (could make sense for read) + +struct File2MemW : public File2I { + std::vector& _mem; + + File2MemW(std::vector& mem); + virtual ~File2MemW(void); + + bool isGood(void) override; + + bool write(const ByteSpan data, int64_t pos = -1) override; + std::variant> read(uint64_t size, int64_t pos = -1) override; +}; + +struct File2MemR : public File2I { + ByteSpan _mem; + int64_t _read_pos{0}; + + File2MemR(ByteSpan mem); + virtual ~File2MemR(void); + + bool isGood(void) override; + + bool write(const ByteSpan data, int64_t pos = -1) override; + std::variant> read(uint64_t size, int64_t pos = -1) override; +}; +