template <typename LoaderDomain, typename SpecificLoader>
void BaseLoader<LoaderDomain, SpecificLoader>::BaseLoader::loadFromFile(const char *file_path)
{
- std::ifstream stream(file_path, std::fstream::ate | std::fstream::binary);
+ std::ifstream stream(file_path, std::fstream::in | std::fstream::binary);
+
+ stream.seekg(0, stream.end);
auto size = stream.tellg();
- stream.seekg(0);
+ stream.seekg(0, stream.beg);
- _buffer.reserve(size);
+ _buffer.resize(size);
stream.read(_buffer.data(), size);
stream.close();
template <typename LoaderDomain, typename SpecificLoader>
void BaseLoader<LoaderDomain, SpecificLoader>::loadModel()
{
+ static_cast<SpecificLoader *>(this)->verify();
_model = LoaderDomain::GetModel(_buffer.data());
// Version unused
// const auto version = _model->version();
(void)subgraph->data_format();
}
+
+ void verify()
+ {
+ flatbuffers::Verifier verifier(reinterpret_cast<const std::uint8_t *>(_buffer.data()),
+ _buffer.size());
+ if (!circle::VerifyModelBuffer(verifier))
+ throw std::runtime_error{"Invalid circle model"};
+ }
};
} // namespace
loadOperation(op);
}
}
+
+ void verify()
+ {
+ flatbuffers::Verifier verifier(reinterpret_cast<const std::uint8_t *>(_buffer.data()),
+ _buffer.size());
+ if (!tflite::VerifyModelBuffer(verifier))
+ throw std::runtime_error{"Invalid tflite model"};
+ }
};
} // namespace