xref: /aosp_15_r20/external/pytorch/caffe2/serialize/istream_adapter.cc (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
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