pytorch/caffe2/serialize/istream_adapter.cc
Lu Fang a918f1d9af Adding a hook (wrapper) for non-std stream reader in PyTorchStreamReader (#15551)
Summary:
To implement a stream is very annoying, since it is closely defined with the underlying storage streambuffer.

So in this PR, we add ReadAdapterInterface and PyTorchStreamReader will use it. We implement IStreamAdapter as a wrapper of std::istream. And keep the user interface unchanged.
Pull Request resolved: https://github.com/pytorch/pytorch/pull/15551

Reviewed By: zrphercule

Differential Revision: D13568907

Pulled By: houseroad

fbshipit-source-id: 93708cb801248a6c101f35cb14d1631029365c3c
2019-01-04 22:50:07 -08:00

40 lines
979 B
C++

#include "caffe2/serialize/istream_adapter.h"
#include <c10/util/Exception.h>
namespace caffe2 {
namespace serialize {
IStreamAdapter::IStreamAdapter(std::istream* istream) : istream_(istream) {}
size_t IStreamAdapter::size() const {
auto prev_pos = istream_->tellg();
validate("getting the current position");
istream_->seekg(0, istream_->end);
validate("seeking to end");
auto result = istream_->tellg();
validate("getting size");
istream_->seekg(prev_pos);
validate("seeking to the original position");
return result;
}
size_t IStreamAdapter::read(uint64_t pos, void* buf, size_t n, const char* what)
const {
istream_->seekg(pos);
validate(what);
istream_->read(static_cast<char*>(buf), n);
validate(what);
return n;
}
void IStreamAdapter::validate(const char* what) const {
if (!*istream_) {
AT_ERROR("istream reader failed: ", what, ".");
}
}
IStreamAdapter::~IStreamAdapter() {}
} // namespace serialize
} // namespace caffe2