Add io::expanding_memory_ostream that writes to std::vector<char>
All checks were successful
Run tests / Run tests (push) Successful in 7m34s
All checks were successful
Run tests / Run tests (push) Successful in 7m34s
This commit is contained in:
parent
ae3b91e7b1
commit
664b1d613e
2 changed files with 58 additions and 0 deletions
|
|
@ -3,6 +3,7 @@
|
|||
#include <psemek/io/stream.hpp>
|
||||
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
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<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_;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue