From decb820cf9a1f27acb871f8cae30e8df2a8e9cc6 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 22 Feb 2025 05:47:27 +0300 Subject: [PATCH] add memory_istream --- src/io/memory_istream.hpp | 34 ++++++++++++++++++++++++++++++++++ test/io/memory_istream.cpp | 19 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/io/memory_istream.hpp create mode 100644 test/io/memory_istream.cpp diff --git a/src/io/memory_istream.hpp b/src/io/memory_istream.hpp new file mode 100644 index 00000000..09f6f418 --- /dev/null +++ b/src/io/memory_istream.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include +#include "util/Buffer.hpp" + +class memory_istream : public std::istream { +public: + explicit memory_istream(util::Buffer buffer) + : std::istream(&buf), buf(std::move(buffer)) {} + +private: + class memory_streambuf : public std::streambuf { + public: + explicit memory_streambuf(util::Buffer buffer) + : buffer(std::move(buffer)) { + char* base = this->buffer.data(); + char* end = base + this->buffer.size(); + setg(base, base, end); + } + + memory_streambuf(const memory_streambuf&) = delete; + memory_streambuf& operator=(const memory_streambuf&) = delete; + + protected: + int_type underflow() override { + return traits_type::eof(); + } + + private: + util::Buffer buffer; + }; + + memory_streambuf buf; +}; diff --git a/test/io/memory_istream.cpp b/test/io/memory_istream.cpp new file mode 100644 index 00000000..faabd23c --- /dev/null +++ b/test/io/memory_istream.cpp @@ -0,0 +1,19 @@ +#include + +#include "io/memory_istream.hpp" + +TEST(io, memory_istream) { + const char data[] = "Hello, world!"; + const int n = std::strlen(data); + + util::Buffer buffer(data, n); + memory_istream stream(std::move(buffer)); + + ASSERT_TRUE(stream.good()); + + std::string text(n, '\0'); + stream.read(text.data(), n); + ASSERT_EQ(text, std::string(data)); + stream.read(text.data(), 1); + ASSERT_TRUE(stream.eof()); +}