1*da0073e9SAndroid Build Coastguard Worker #include "caffe2/serialize/istream_adapter.h"
2*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Exception.h>
3*da0073e9SAndroid Build Coastguard Worker
4*da0073e9SAndroid Build Coastguard Worker namespace caffe2 {
5*da0073e9SAndroid Build Coastguard Worker namespace serialize {
6*da0073e9SAndroid Build Coastguard Worker
IStreamAdapter(std::istream * istream)7*da0073e9SAndroid Build Coastguard Worker IStreamAdapter::IStreamAdapter(std::istream* istream) : istream_(istream) {}
8*da0073e9SAndroid Build Coastguard Worker
size() const9*da0073e9SAndroid Build Coastguard Worker size_t IStreamAdapter::size() const {
10*da0073e9SAndroid Build Coastguard Worker auto prev_pos = istream_->tellg();
11*da0073e9SAndroid Build Coastguard Worker validate("getting the current position");
12*da0073e9SAndroid Build Coastguard Worker istream_->seekg(0, istream_->end);
13*da0073e9SAndroid Build Coastguard Worker validate("seeking to end");
14*da0073e9SAndroid Build Coastguard Worker auto result = istream_->tellg();
15*da0073e9SAndroid Build Coastguard Worker validate("getting size");
16*da0073e9SAndroid Build Coastguard Worker istream_->seekg(prev_pos);
17*da0073e9SAndroid Build Coastguard Worker validate("seeking to the original position");
18*da0073e9SAndroid Build Coastguard Worker return result;
19*da0073e9SAndroid Build Coastguard Worker }
20*da0073e9SAndroid Build Coastguard Worker
read(uint64_t pos,void * buf,size_t n,const char * what) const21*da0073e9SAndroid Build Coastguard Worker size_t IStreamAdapter::read(uint64_t pos, void* buf, size_t n, const char* what)
22*da0073e9SAndroid Build Coastguard Worker const {
23*da0073e9SAndroid Build Coastguard Worker istream_->seekg(pos);
24*da0073e9SAndroid Build Coastguard Worker validate(what);
25*da0073e9SAndroid Build Coastguard Worker istream_->read(static_cast<char*>(buf), n);
26*da0073e9SAndroid Build Coastguard Worker validate(what);
27*da0073e9SAndroid Build Coastguard Worker return n;
28*da0073e9SAndroid Build Coastguard Worker }
29*da0073e9SAndroid Build Coastguard Worker
validate(const char * what) const30*da0073e9SAndroid Build Coastguard Worker void IStreamAdapter::validate(const char* what) const {
31*da0073e9SAndroid Build Coastguard Worker if (!*istream_) {
32*da0073e9SAndroid Build Coastguard Worker AT_ERROR("istream reader failed: ", what, ".");
33*da0073e9SAndroid Build Coastguard Worker }
34*da0073e9SAndroid Build Coastguard Worker }
35*da0073e9SAndroid Build Coastguard Worker
36*da0073e9SAndroid Build Coastguard Worker // NOLINTNEXTLINE(modernize-use-equals-default)
~IStreamAdapter()37*da0073e9SAndroid Build Coastguard Worker IStreamAdapter::~IStreamAdapter() {}
38*da0073e9SAndroid Build Coastguard Worker
39*da0073e9SAndroid Build Coastguard Worker } // namespace serialize
40*da0073e9SAndroid Build Coastguard Worker } // namespace caffe2
41