middle version

This commit is contained in:
tqchen
2014-10-16 10:38:49 -07:00
parent 6680bffaae
commit aefe58a207
8 changed files with 188 additions and 64 deletions

View File

@@ -92,11 +92,49 @@ class IStream {
class ISeekStream: public IStream {
public:
/*! \brief seek to certain position of the file */
virtual void Seek(long pos) = 0;
virtual void Seek(size_t pos) = 0;
/*! \brief tell the position of the stream */
virtual long Tell(void) = 0;
virtual size_t Tell(void) = 0;
};
/*! \brief a in memory buffer that can be read and write as stream interface */
struct MemoryBufferStream : public ISeekStream {
public:
MemoryBufferStream(std::string *p_buffer)
: p_buffer_(p_buffer) {
curr_ptr_ = 0;
}
virtual ~MemoryBufferStream(void) {}
virtual size_t Read(void *ptr, size_t size) {
utils::Assert(curr_ptr_ <= p_buffer_->length(),
"read can not have position excceed buffer length");
size_t nread = std::min(p_buffer_->length() - curr_ptr_, size);
if (nread != 0) memcpy(ptr, &(*p_buffer_)[0] + curr_ptr_, nread);
curr_ptr_ += nread;
return nread;
}
virtual void Write(const void *ptr, size_t size) {
if (size == 0) return;
if (curr_ptr_ + size > p_buffer_->length()) {
p_buffer_->resize(curr_ptr_+size);
}
memcpy(&(*p_buffer_)[0] + curr_ptr_, ptr, size);
curr_ptr_ += size;
}
virtual void Seek(size_t pos) {
curr_ptr_ = static_cast<size_t>(pos);
}
virtual size_t Tell(void) {
return curr_ptr_;
}
private:
/*! \brief in memory buffer */
std::string *p_buffer_;
/*! \brief current pointer */
size_t curr_ptr_;
}; // class MemoryBufferStream
/*! \brief implementation of file i/o stream */
class FileStream : public ISeekStream {
public:
@@ -110,10 +148,10 @@ class FileStream : public ISeekStream {
virtual void Write(const void *ptr, size_t size) {
std::fwrite(ptr, size, 1, fp);
}
virtual void Seek(long pos) {
virtual void Seek(size_t pos) {
std::fseek(fp, pos, SEEK_SET);
}
virtual long Tell(void) {
virtual size_t Tell(void) {
return std::ftell(fp);
}
inline void Close(void) {