Add io::expanding_memory_ostream that writes to std::vector<char>
All checks were successful
Run tests / Run tests (push) Successful in 7m34s

This commit is contained in:
Nikita Lisitsa 2026-07-06 22:41:38 +03:00
parent ae3b91e7b1
commit 664b1d613e
2 changed files with 58 additions and 0 deletions

View file

@ -3,6 +3,7 @@
#include <psemek/io/stream.hpp> #include <psemek/io/stream.hpp>
#include <string_view> #include <string_view>
#include <vector>
namespace psemek::io namespace psemek::io
{ {
@ -131,4 +132,55 @@ namespace psemek::io
char * end_ = nullptr; char * end_ = nullptr;
}; };
struct expanding_memory_ostream
: ostream
{
expanding_memory_ostream() = default;
expanding_memory_ostream(std::vector<char> & 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<char> & buffer() { return *buffer_; }
std::size_t write(char const * p, std::size_t size) override;
private:
std::vector<char> storage_;
std::vector<char> * buffer_ = &storage_;
};
} }

View file

@ -23,4 +23,10 @@ namespace psemek::io
return size; 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;
}
} }