// Copyright (c) OpenMMLab. All rights reserved. #ifndef MMDEPLOY_SRC_ARCHIVE_VALUE_ARCHIVE_H_ #define MMDEPLOY_SRC_ARCHIVE_VALUE_ARCHIVE_H_ #include "core/archive.h" #include "core/value.h" namespace mmdeploy { template Value to_value(T&& val); // save to Value class ValueOutputArchive : public OutputArchive { public: explicit ValueOutputArchive(Value& data) : data_(data) {} template void init(array_tag) { data_ = ValueType::kArray; } template void init(object_tag) { data_ = ValueType::kObject; } template void named_value(const std::string& name, T&& val) { data_[name] = to_value(std::forward(val)); } template void item(T&& val) { data_.push_back(to_value(std::forward(val))); } template , int> = 0> void native(T&& val) { data_ = std::forward(val); }; private: Value& data_; }; template inline Value to_value(T&& val) { Value value; ValueOutputArchive archive(value); archive(std::forward(val)); return value; } template void from_value(const Value& value, T&& x); template T from_value(const Value& value); // load from Value class ValueInputArchive : public InputArchive { public: explicit ValueInputArchive(const Value& data) : data_(data) {} template void init(SizeType& size) { size = static_cast(data_.size()); iter_ = data_.begin(); } template void named_value(std::string& name, T& val) { name = iter_.key(); from_value(*iter_, std::forward(val)); ++iter_; } template void named_value(const std::string& name, T&& val) { from_value(data_[name], std::forward(val)); } template void item(T&& val) { from_value(*iter_, std::forward(val)); ++iter_; } template void native(T&& val) { data_.get_to(val); } template void value(T&& value) {} private: const Value& data_; Value::const_iterator iter_; }; template void from_value(const Value& value, T&& x) { ValueInputArchive archive(value); archive(std::forward(x)); } template inline T from_value(const Value& value) { T x{}; from_value(value, x); return x; } namespace detail { inline void load(ValueInputArchive& archive, Value& v) { archive.native(v); } template , Value>::value, bool> = true> inline void save(ValueOutputArchive& archive, T&& v) { archive.native(std::forward(v)); } } // namespace detail } // namespace mmdeploy #endif // MMDEPLOY_SRC_ARCHIVE_VALUE_ARCHIVE_H_