// Copyright (c) OpenMMLab. All rights reserved. #ifndef MMDEPLOY_SRC_CORE_ARCHIVE_H_ #define MMDEPLOY_SRC_CORE_ARCHIVE_H_ #include "core/logger.h" #include "core/serialization.h" namespace mmdeploy { template using member_load_t = decltype(std::declval().load(std::declval())); template using member_save_t = decltype(std::declval().save(std::declval())); template using member_serialize_t = decltype(std::declval().serialize(std::declval())); template using has_member_load = detail::is_detected; template using has_member_save = detail::is_detected; template using has_member_serialize = detail::is_detected; template using adl_load_t = decltype(adl_serializer::load(std::declval(), std::declval())); template using has_adl_load = detail::is_detected; template using adl_save_t = decltype(adl_serializer::save(std::declval(), std::declval())); template using has_adl_save = detail::is_detected; template using adl_serialize_t = decltype(adl_serializer::serialize(std::declval(), std::declval())); template using has_adl_serialize = detail::is_detected; namespace detail { // ADL bridge for archives class ArchiveBase {}; } // namespace detail template class OutputArchive : public detail::ArchiveBase { public: template void operator()(Args&&... args) { (dispatch(std::forward(args)), ...); } private: template void dispatch(T&& v) { auto& archive = static_cast(*this); if constexpr (has_member_save::value) { std::forward(v).save(archive); } else if constexpr (has_member_serialize::value) { std::forward(v).serialize(archive); } else if constexpr (has_adl_save::value) { adl_serializer::save(archive, std::forward(v)); } else if constexpr (has_adl_serialize::value) { adl_serializer::serialize(archive, std::forward(v)); } else { archive.native(std::forward(v)); } } }; template class InputArchive : public detail::ArchiveBase { public: template void operator()(Args&&... args) { (dispatch(std::forward(args)), ...); } private: template void dispatch(T&& v) { auto& archive = static_cast(*this); if constexpr (has_member_load::value) { std::forward(v).load(archive); } else if constexpr (has_member_serialize::value) { std::forward(v).serialize(archive); } else if constexpr (has_adl_load::value) { adl_serializer::load(archive, std::forward(v)); } else if constexpr (has_adl_serialize::value) { adl_serializer::serialize(archive, std::forward(v)); } else { archive.native(std::forward(v)); } } }; } // namespace mmdeploy #endif // MMDEPLOY_SRC_CORE_ARCHIVE_H_