#pragma once #include #include #include // TODO: move to/next-to span // a span that can also represent its ownership template struct SpanWithOwnership : public Span { // TODO: allow for different owners std::vector _data_owner; // self interactions SpanWithOwnership(void) = delete; constexpr SpanWithOwnership(const SpanWithOwnership&) = delete; constexpr SpanWithOwnership(SpanWithOwnership&&) = default; // non-owning constexpr SpanWithOwnership(const Span& span) : Span(span) {} constexpr SpanWithOwnership(const Span&& span) : Span(span) {} // owning constexpr SpanWithOwnership(std::vector&& data) : Span(data), _data_owner(std::move(data)) {} bool isOwning(void) const { return !_data_owner.empty(); } }; using ByteSpanWithOwnership = SpanWithOwnership; struct File2I { // read only uint64_t _file_size {0}; const bool can_write {false}; const bool can_read {false}; // TODO: non-seekable files? explicit File2I(bool can_write_, bool can_read_) : can_write(can_write_), can_read(can_read_) {} virtual ~File2I(void) {} virtual bool isGood(void) = 0; // 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; [[nodiscard]] virtual ByteSpanWithOwnership read(uint64_t size, int64_t pos = -1) = 0; };