25#ifndef ser20_optional_nvp_h
26#define ser20_optional_nvp_h
28#include <ser20/ser20.hpp>
29#include <ser20/details/traits.hpp>
33class JSONInputArchive;
35class YAMLInputArchive;
40template<
class Archive,
class T>
41typename std::enable_if_t<traits::is_same_archive_v<Archive, JSONInputArchive> ||
42 traits::is_same_archive_v<Archive, XMLInputArchive> ||
43 traits::is_same_archive_v<Archive, YAMLInputArchive>,
47 const auto node_name = ar.getNodeName();
50 if(node_name !=
nullptr && strcmp(
name, node_name) == 0)
52 ar(make_nvp(
name, std::forward<T>(value)));
59template<
class Archive,
class T>
62 ar(make_nvp(
name, std::forward<T>(value)));
66template<
class Archive,
class T,
class Predicate>
70 ar(make_nvp(
name, std::forward<T>(value)));
73template<
class Archive,
class T,
class Predicate>
74typename std::enable_if_t<traits::is_same_archive_v<Archive, JSONInputArchive> ||
75 traits::is_same_archive_v<Archive, XMLInputArchive> ||
76 traits::is_same_archive_v<Archive, YAMLInputArchive>,
86#define GET_CEREAL_OPTIONAL_NVP_MACRO(_1, _2, _3, NAME, ...) NAME
87#define CEREAL_OPTIONAL_NVP(...) \
88 EXPAND(GET_CEREAL_OPTIONAL_NVP_MACRO(__VA_ARGS__, CEREAL_OPTIONAL_NVP_3, CEREAL_OPTIONAL_NVP_2)(__VA_ARGS__))
90#define CEREAL_OPTIONAL_NVP_2(ar, T) ::ser20::make_optional_nvp(ar, #T, T)
91#define CEREAL_OPTIONAL_NVP_3(ar, T, P) ::ser20::make_optional_nvp(ar, #T, T, P)
std::enable_if_t< traits::is_same_archive_v< Archive, JSONInputArchive >||traits::is_same_archive_v< Archive, XMLInputArchive >||traits::is_same_archive_v< Archive, YAMLInputArchive >, bool > make_optional_nvp(Archive &ar, const char *name, T &&value)