41 public std::basic_streambuf<char>
44 typedef std::basic_streambuf<char> base_class;
45 typedef typename base_class::traits_type traits_type;
46 typedef std::vector<char>::size_type datasize;
47 typedef std::streamsize streamsize;
50 std::vector<char> _data;
60 streamsize size()
const
62 return streamsize(_data.size());
68 _data_pos = datasize(0);
76 const char* data()
const
81 std::vector<char>& container()
86 const std::vector<char>& container()
const
92 virtual std::streamsize xsputn(
const char* ptr, std::streamsize count)
override
97 if(_data_pos + datasize(count) > _data.size())
98 _data.resize(_data_pos + datasize(count));
101 for(; copied < count; ++_data_pos, ++copied, ++ptr)
102 _data[_data_pos] = *ptr;
107 virtual std::streamsize xsgetn(
char* ptr, std::streamsize count)
override
109 streamsize copied(0);
110 datasize len(_data.size());
113 if(_data_pos + datasize(count) > len)
114 count = streamsize(len - _data_pos);
117 for(; copied < count; ++_data_pos, ++copied, ++ptr)
118 *ptr = _data[_data_pos];
123 virtual pos_type seekoff(
125 std::ios_base::seekdir way,
126 std::ios_base::openmode which = std::ios_base::in | std::ios_base::out)
override
128 if((which & (std::ios_base::in|std::ios_base::out)) == 0)
133 case std::ios_base::beg:
134 if((off < 0) || (off > off_type(_data.size())))
136 return pos_type(std::streamoff(_data_pos = datasize(off)));
138 case std::ios_base::cur:
139 if((off < 0) && (-off > off_type(_data_pos)))
141 if((off > 0) && (off_type(_data_pos) + off > off_type(_data.size())))
143 return pos_type(std::streamoff(_data_pos = datasize(off_type(_data_pos) + off)));
145 case std::ios_base::end:
146 if((off > 0) || (-off > off_type(_data.size())))
148 return pos_type(std::streamoff(_data_pos = datasize(off_type(_data.size()) + off)));
155 virtual pos_type seekpos(
157 std::ios_base::openmode which = std::ios_base::in | std::ios_base::out)
override
159 if((which & (std::ios_base::in|std::ios_base::out)) == 0)
163 if (pos >= pos_type(std::streamoff(_data.size())))
167 return pos_type(std::streamoff(_data_pos = datasize(pos)));
170 virtual int overflow(
int c = EOF)
override
176 const char cc = traits_type::to_char_type(c);
182 return traits_type::to_int_type(cc);
188 BinaryBuffer _buffer;
193 std::iostream(&_buffer)
203 return _buffer.size();
220 return _buffer.data();
229 return _buffer.data();
238 return _buffer.container();
247 return _buffer.container();
265 is.seekg(std::streamoff(0), std::ios_base::end);
268 const std::streampos filesize = is.tellg();
271 is.seekg(std::streamoff(0), std::ios_base::beg);
274 std::vector<char>& content = _buffer.container();
277 content.resize(std::size_t(filesize));
280 is.read(content.data(), filesize);
std::vector< char > & container()
Returns a reference to the internal vector container.
char * data()
Returns the data array of the stream.
const char * data() const
Returns the data array of the stream.
BinaryStream()
default CTOR
void read_stream(std::istream &is)
Reads the content of a binary input stream.
std::streamsize size() const
Returns the current size of the stream.
void clear()
Clears the current stream.
void write_stream(std::ostream &os) const
Writes the content to a binary output stream.
const std::vector< char > & container() const
Returns a reference to the internal vector container.