#pragma once #include #include #include #include #include "nf7.hh" namespace yas::detail { template struct serializer< type_prop::not_a_fundamental, ser_case::use_internal_serializer, F, std::unique_ptr> { public: template static Archive& save(Archive& ar, const std::unique_ptr& f) { ar(std::string {f->type().name()}); typename Archive::ChunkGuard guard {ar}; f->Serialize(ar); return ar; } template static Archive& load(Archive& ar, std::unique_ptr& f) { std::string name; ar(name); auto& type = nf7::File::registry(name); try { typename Archive::ChunkGuard guard {ar}; f = type.Deserialize(ar); guard.ValidateEnd(); } catch (...) { f = nullptr; throw; } return ar; } }; template struct serializer< type_prop::not_a_fundamental, ser_case::use_internal_serializer, F, std::shared_ptr> { public: template static Archive& save(Archive& ar, const std::shared_ptr& f) { std::unique_ptr uf(f.get()); ar(uf); uf.release(); return ar; } template static Archive& load(Archive& ar, std::shared_ptr& f) { std::unique_ptr uf; ar(uf); f = std::move(uf); return ar; } }; template struct serializer< type_prop::not_a_fundamental, ser_case::use_internal_serializer, F, nf7::File::Path> { public: template static Archive& save(Archive& ar, const nf7::File::Path& p) { p.Serialize(ar); return ar; } template static Archive& load(Archive& ar, nf7::File::Path& p) { p = {ar}; return ar; } }; } // namespace detail