diff --git a/src/io/memory_istream.hpp b/src/io/memory_istream.hpp index 0b2131d6..7c0aded6 100644 --- a/src/io/memory_istream.hpp +++ b/src/io/memory_istream.hpp @@ -32,3 +32,33 @@ public: private: memory_streambuf buf; }; + +class memory_view_streambuf : public std::streambuf { +public: + explicit memory_view_streambuf(const util::Buffer& buffer) + : buffer(std::move(buffer)) { + char* base = const_cast(this->buffer.data()); + char* end = base + this->buffer.size(); + setg(base, base, end); + } + + memory_view_streambuf(const memory_view_streambuf&) = delete; + memory_view_streambuf& operator=(const memory_view_streambuf&) = delete; + +protected: + int_type underflow() override { + return traits_type::eof(); + } + +private: + const util::Buffer& buffer; +}; + +class memory_view_istream : public std::istream { +public: + explicit memory_view_istream(const util::Buffer& buffer) + : std::istream(&buf), buf(buffer) {} + +private: + memory_view_streambuf buf; +};