refactor file2 and add span with ownership
This commit is contained in:
parent
2420af464f
commit
f2f001b190
@ -5,6 +5,29 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
|
||||||
|
// TODO: move to/next-to span
|
||||||
|
// a span that can also represent its ownership
|
||||||
|
template<typename T>
|
||||||
|
struct SpanWithOwnership : public Span<T> {
|
||||||
|
// TODO: allow for different owners
|
||||||
|
std::vector<T> _data_owner;
|
||||||
|
|
||||||
|
// self interactions
|
||||||
|
SpanWithOwnership(void) = delete;
|
||||||
|
constexpr SpanWithOwnership(const SpanWithOwnership&) = delete;
|
||||||
|
constexpr SpanWithOwnership(SpanWithOwnership&&) = default;
|
||||||
|
|
||||||
|
// non-owning
|
||||||
|
constexpr SpanWithOwnership(const Span<T>& span) : Span<T>(span) {}
|
||||||
|
constexpr SpanWithOwnership(const Span<T>&& span) : Span<T>(span) {}
|
||||||
|
|
||||||
|
// owning
|
||||||
|
constexpr SpanWithOwnership(std::vector<T>&& data) : Span<T>(data), _data_owner(std::move(data)) {}
|
||||||
|
|
||||||
|
bool isOwning(void) const { return !_data_owner.empty(); }
|
||||||
|
};
|
||||||
|
using ByteSpanWithOwnership = SpanWithOwnership<uint8_t>;
|
||||||
|
|
||||||
struct File2I {
|
struct File2I {
|
||||||
// read only
|
// read only
|
||||||
uint64_t _file_size {0};
|
uint64_t _file_size {0};
|
||||||
@ -20,6 +43,7 @@ struct File2I {
|
|||||||
|
|
||||||
// pos -1 means stream, append to last written, or read position (independent, like FILE*s)
|
// pos -1 means stream, append to last written, or read position (independent, like FILE*s)
|
||||||
virtual bool write(const ByteSpan data, int64_t pos = -1) = 0;
|
virtual bool write(const ByteSpan data, int64_t pos = -1) = 0;
|
||||||
[[nodiscard]] virtual std::variant<ByteSpan, std::vector<uint8_t>> read(uint64_t size, int64_t pos = -1) = 0;
|
//[[nodiscard]] virtual std::variant<ByteSpan, std::vector<uint8_t>> read(uint64_t size, int64_t pos = -1) = 0;
|
||||||
|
[[nodiscard]] virtual ByteSpanWithOwnership read(uint64_t size, int64_t pos = -1) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -25,8 +25,8 @@ bool File2MemW::write(const ByteSpan data, int64_t pos) {
|
|||||||
return isGood();
|
return isGood();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::variant<ByteSpan, std::vector<uint8_t>> File2MemW::read(uint64_t size, int64_t pos) {
|
ByteSpanWithOwnership File2MemW::read(uint64_t size, int64_t pos) {
|
||||||
return {};
|
return ByteSpan{};
|
||||||
}
|
}
|
||||||
|
|
||||||
File2MemR::File2MemR(ByteSpan mem) : File2I(false, true), _mem(mem) {
|
File2MemR::File2MemR(ByteSpan mem) : File2I(false, true), _mem(mem) {
|
||||||
@ -44,9 +44,9 @@ bool File2MemR::write(const ByteSpan data, int64_t pos) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::variant<ByteSpan, std::vector<uint8_t>> File2MemR::read(uint64_t size, int64_t pos) {
|
ByteSpanWithOwnership File2MemR::read(uint64_t size, int64_t pos) {
|
||||||
if (_read_pos >= _mem.size) {
|
if (_read_pos >= _mem.size) {
|
||||||
return {};
|
return ByteSpan{};
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteSpan ret {
|
ByteSpan ret {
|
||||||
@ -54,6 +54,7 @@ std::variant<ByteSpan, std::vector<uint8_t>> File2MemR::read(uint64_t size, int6
|
|||||||
std::min(size, _mem.size - _read_pos)
|
std::min(size, _mem.size - _read_pos)
|
||||||
};
|
};
|
||||||
_read_pos += ret.size;
|
_read_pos += ret.size;
|
||||||
|
// return non-owning
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ struct File2MemW : public File2I {
|
|||||||
bool isGood(void) override;
|
bool isGood(void) override;
|
||||||
|
|
||||||
bool write(const ByteSpan data, int64_t pos = -1) override;
|
bool write(const ByteSpan data, int64_t pos = -1) override;
|
||||||
std::variant<ByteSpan, std::vector<uint8_t>> read(uint64_t size, int64_t pos = -1) override;
|
ByteSpanWithOwnership read(uint64_t size, int64_t pos = -1) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct File2MemR : public File2I {
|
struct File2MemR : public File2I {
|
||||||
@ -27,6 +27,6 @@ struct File2MemR : public File2I {
|
|||||||
bool isGood(void) override;
|
bool isGood(void) override;
|
||||||
|
|
||||||
bool write(const ByteSpan data, int64_t pos = -1) override;
|
bool write(const ByteSpan data, int64_t pos = -1) override;
|
||||||
std::variant<ByteSpan, std::vector<uint8_t>> read(uint64_t size, int64_t pos = -1) override;
|
ByteSpanWithOwnership read(uint64_t size, int64_t pos = -1) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
32
solanaceae/file/file2_stack.hpp
Normal file
32
solanaceae/file/file2_stack.hpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "./file2.hpp"
|
||||||
|
|
||||||
|
#include <stack>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
// wrapper/container for a file "stack"
|
||||||
|
// has no file functionallity by itself
|
||||||
|
|
||||||
|
struct File2Stack : public File2I {
|
||||||
|
std::stack<std::unique_ptr<File2I>> _stack;
|
||||||
|
|
||||||
|
// TODO: change interface again and make r/w non const data members!
|
||||||
|
File2Stack(void) : File2I(false, false), _stack() {}
|
||||||
|
File2Stack(std::stack<std::unique_ptr<File2I>>&& stack) : File2I(false, false), _stack(std::move(stack)) {}
|
||||||
|
File2Stack(std::unique_ptr<File2I>&& file) : File2I(false, false), _stack({std::move(file)}) {}
|
||||||
|
virtual ~File2Stack(void) {}
|
||||||
|
|
||||||
|
bool isGood(void) override {
|
||||||
|
return _stack.top()->isGood();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool write(const ByteSpan data, int64_t pos = -1) override {
|
||||||
|
return _stack.top()->write(data, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
ByteSpanWithOwnership read(uint64_t size, int64_t pos = -1) override {
|
||||||
|
return _stack.top()->read(size, pos);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
@ -32,7 +32,6 @@ bool File2WFile::isGood(void) {
|
|||||||
return _file.is_open() && _file.good();
|
return _file.is_open() && _file.good();
|
||||||
}
|
}
|
||||||
|
|
||||||
//bool write(const ByteSpan data, int64_t pos = -1) override;
|
|
||||||
bool File2WFile::write(const ByteSpan data, int64_t pos) {
|
bool File2WFile::write(const ByteSpan data, int64_t pos) {
|
||||||
if (pos != -1) {
|
if (pos != -1) {
|
||||||
//std::cerr << "invalid pos\n";
|
//std::cerr << "invalid pos\n";
|
||||||
@ -49,7 +48,7 @@ bool File2WFile::write(const ByteSpan data, int64_t pos) {
|
|||||||
return _file.good();
|
return _file.good();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::variant<ByteSpan, std::vector<uint8_t>> File2WFile::read(uint64_t, int64_t) {
|
ByteSpanWithOwnership File2WFile::read(uint64_t, int64_t) {
|
||||||
return ByteSpan{};
|
return ByteSpan{};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,7 +101,7 @@ bool File2RWFile::write(const ByteSpan data, int64_t pos) {
|
|||||||
return _file.good();
|
return _file.good();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::variant<ByteSpan, std::vector<uint8_t>> File2RWFile::read(uint64_t size, int64_t pos) {
|
ByteSpanWithOwnership File2RWFile::read(uint64_t size, int64_t pos) {
|
||||||
if (pos >= int64_t(_file_size)) {
|
if (pos >= int64_t(_file_size)) {
|
||||||
return ByteSpan{};
|
return ByteSpan{};
|
||||||
}
|
}
|
||||||
@ -124,6 +123,8 @@ std::variant<ByteSpan, std::vector<uint8_t>> File2RWFile::read(uint64_t size, in
|
|||||||
chunk.clear();
|
chunk.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
return chunk;
|
// return owning
|
||||||
|
return ByteSpanWithOwnership{std::move(chunk)};
|
||||||
|
//return chunk; // is this the same?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ struct File2WFile : public File2I {
|
|||||||
bool isGood(void) override;
|
bool isGood(void) override;
|
||||||
|
|
||||||
bool write(const ByteSpan data, int64_t pos = -1) override;
|
bool write(const ByteSpan data, int64_t pos = -1) override;
|
||||||
std::variant<ByteSpan, std::vector<uint8_t>> read(uint64_t size, int64_t pos = -1) override;
|
ByteSpanWithOwnership read(uint64_t size, int64_t pos = -1) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
// read write, requires an existing file, file size is fixed
|
// read write, requires an existing file, file size is fixed
|
||||||
@ -35,7 +35,7 @@ struct File2RWFile : public File2I {
|
|||||||
bool isGood(void) override;
|
bool isGood(void) override;
|
||||||
|
|
||||||
bool write(const ByteSpan data, int64_t pos = -1) override;
|
bool write(const ByteSpan data, int64_t pos = -1) override;
|
||||||
std::variant<ByteSpan, std::vector<uint8_t>> read(uint64_t size, int64_t pos = -1) override;
|
ByteSpanWithOwnership read(uint64_t size, int64_t pos = -1) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
// cut down interface (write disabled)
|
// cut down interface (write disabled)
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
// non owning view
|
// non owning view
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct Span final {
|
struct Span {
|
||||||
const T* ptr {nullptr};
|
const T* ptr {nullptr};
|
||||||
uint64_t size {0};
|
uint64_t size {0};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user