1 #ifndef GENESIS_UTILS_IO_INPUT_BUFFER_H_
2 #define GENESIS_UTILS_IO_INPUT_BUFFER_H_
72 : source_name_(
"invalid source" )
78 explicit InputBuffer( std::shared_ptr<BaseInputSource> input_source )
80 init_( input_source );
94 *
this = std::move( other );
101 if(
this == &other ) {
105 input_reader_ = std::move( other.input_reader_ );
106 source_name_ = std::move( other.source_name_ );
114 buffer_ = other.buffer_;
115 data_pos_ = other.data_pos_;
116 data_end_ = other.data_end_;
119 other.buffer_ =
nullptr;
130 operator bool()
const
132 return data_pos_ < data_end_;
137 if( data_pos_ + ahead < data_end_ ) {
141 return buffer_[ data_pos_ + ahead ];
147 throw std::runtime_error(
148 "Cannot peek ahead more than one block length of the Input Buffer."
157 if( data_pos_ + ahead < data_end_ ) {
158 return buffer_[ data_pos_ + ahead ];
165 size_t read(
char* target,
size_t size )
169 if( data_pos_ <
BlockLength && size < data_end_ - data_pos_ ) {
170 std::memcpy( target, buffer_ + data_pos_, size );
176 size_t done_reading = 0;
177 size_t yet_to_read = size;
187 std::memcpy( target + done_reading, buffer_ + data_pos_,
BlockLength );
197 assert( data_pos_ < data_end_ );
201 size_t const buffered = data_end_ - data_pos_;
204 if( yet_to_read > buffered ) {
205 yet_to_read = buffered;
209 assert( yet_to_read <= buffered );
213 std::memcpy( target + done_reading, buffer_ + data_pos_, yet_to_read );
214 data_pos_ += yet_to_read;
217 done_reading += yet_to_read;
231 void update_blocks_()
234 if( data_pos_ == data_end_ ) {
237 assert( data_pos_ < data_end_ );
252 if( input_reader_ && input_reader_->valid() ) {
253 data_end_ += input_reader_->finish_reading();
266 void init_( std::shared_ptr<BaseInputSource> input_source )
269 if( input_source ==
nullptr ) {
270 source_name_ =
"invalid source";
284 source_name_ = input_source->source_name();
288 data_end_ = input_source->read( buffer_, 2 *
BlockLength );
296 input_reader_ = utils::make_unique<InputReader>( input_source );
314 std::unique_ptr<InputReader> input_reader_ =
nullptr;
315 std::string source_name_;
335 #endif // include guard