From 664b1d613ed1feeed91b755f28845275dc2070e1 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 6 Jul 2026 22:41:38 +0300 Subject: [PATCH] Add io::expanding_memory_ostream that writes to std::vector --- libs/io/include/psemek/io/memory_stream.hpp | 52 +++++++++++++++++++++ libs/io/source/memory_stream.cpp | 6 +++ 2 files changed, 58 insertions(+) diff --git a/libs/io/include/psemek/io/memory_stream.hpp b/libs/io/include/psemek/io/memory_stream.hpp index 988d0ceb..4b32f9df 100644 --- a/libs/io/include/psemek/io/memory_stream.hpp +++ b/libs/io/include/psemek/io/memory_stream.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace psemek::io { @@ -131,4 +132,55 @@ namespace psemek::io char * end_ = nullptr; }; + struct expanding_memory_ostream + : ostream + { + expanding_memory_ostream() = default; + + expanding_memory_ostream(std::vector & storage) + : buffer_(&storage) + {} + + expanding_memory_ostream(expanding_memory_ostream && s) + : storage_(std::move(s.storage_)) + , buffer_(s.buffer_) + { + s.reset(); + } + + expanding_memory_ostream & operator = (expanding_memory_ostream && s) + { + if (this != &s) + { + storage_ = std::move(s.storage_); + buffer_ = s.buffer_; + s.reset(); + } + + return *this; + } + + void reset() + { + storage_.clear(); + buffer_ = &storage_; + } + + void swap(expanding_memory_ostream & s) + { + std::swap(storage_, s.storage_); + std::swap(buffer_, s.buffer_); + } + + char * data() const { return buffer_->data(); } + + std::vector & buffer() { return *buffer_; } + + std::size_t write(char const * p, std::size_t size) override; + + private: + std::vector storage_; + std::vector * buffer_ = &storage_; + }; + } diff --git a/libs/io/source/memory_stream.cpp b/libs/io/source/memory_stream.cpp index 7d0bf59a..68847b91 100644 --- a/libs/io/source/memory_stream.cpp +++ b/libs/io/source/memory_stream.cpp @@ -23,4 +23,10 @@ namespace psemek::io return size; } + std::size_t expanding_memory_ostream::write(char const * p, std::size_t size) + { + buffer_->insert(buffer_->end(), p, p + size); + return size; + } + }