58 lines
1.3 KiB
C++
58 lines
1.3 KiB
C++
#ifndef RABIT_LEARN_IO_BUFFER_READER_INL_H_
|
|
#define RABIT_LEARN_IO_BUFFER_READER_INL_H_
|
|
/*!
|
|
* \file buffer_reader-inl.h
|
|
* \brief implementation of stream buffer reader
|
|
* \author Tianqi Chen
|
|
*/
|
|
#include "./io.h"
|
|
|
|
namespace rabit {
|
|
namespace io {
|
|
/*! \brief buffer reader of the stream that allows you to get */
|
|
class StreamBufferReader {
|
|
public:
|
|
StreamBufferReader(size_t buffer_size)
|
|
:stream_(NULL),
|
|
read_len_(1), read_ptr_(1) {
|
|
buffer_.resize(buffer_size);
|
|
}
|
|
/*!
|
|
* \brief set input stream
|
|
*/
|
|
inline void set_stream(IStream *stream) {
|
|
stream_ = stream;
|
|
read_len_ = read_ptr_ = 1;
|
|
}
|
|
/*!
|
|
* \brief allows quick read using get char
|
|
*/
|
|
inline char GetChar(void) {
|
|
while (true) {
|
|
if (read_ptr_ < read_len_) {
|
|
return buffer_[read_ptr_++];
|
|
} else {
|
|
read_len_ = stream_->Read(&buffer_[0], buffer_.length());
|
|
if (read_len_ == 0) return EOF;
|
|
read_ptr_ = 0;
|
|
}
|
|
}
|
|
}
|
|
inline bool AtEnd(void) const {
|
|
return read_len_ == 0;
|
|
}
|
|
|
|
private:
|
|
/*! \brief the underlying stream */
|
|
IStream *stream_;
|
|
/*! \brief buffer to hold data */
|
|
std::string buffer_;
|
|
/*! \brief length of valid data in buffer */
|
|
size_t read_len_;
|
|
/*! \brief pointer in the buffer */
|
|
size_t read_ptr_;
|
|
};
|
|
} // namespace io
|
|
} // namespace rabit
|
|
#endif // RABIT_LEARN_IO_BUFFER_READER_INL_H_
|