27 #include <type_traits>
51 #define ENUM_SERIALIZATION(xType, xMap) \
52 inline const std::map<xType, std::string>& enum_serialization(xType) { \
53 static std::map<xType, std::string> data xMap; \
56 inline const std::map<std::string, xType>& enum_deserialization(xType) { \
57 static const std::map<std::string, xType> data = ::fable::invert(enum_serialization(xType())); \
60 inline void to_json(::fable::Json& j, const xType& v) { j = enum_serialization(v).at(v); } \
61 inline void from_json(const ::fable::Json& j, xType& v) { \
62 v = enum_deserialization(v).at(j.get<std::string>()); \
65 #define FABLE_ENUM_SERIALIZATION(xType, xMap) \
68 struct EnumSerializer<xType> { \
69 static const std::map<xType, std::string>& serialization() { \
70 static const std::map<xType, std::string> ser xMap; \
73 static const std::map<std::string, xType>& deserialization() { \
74 static std::map<std::string, xType> de = \
75 ::fable::invert(EnumSerializer<xType>::serialization()); \
80 namespace nlohmann { \
82 struct adl_serializer<xType> { \
83 static void to_json(json& j, const xType& e) { j = ::fable::to_string(e); } \
84 static void from_json(const json& j, xType& e) { \
85 e = ::fable::from_string<xType>(j.get<std::string>()); \
100 template <
typename X,
typename Y>
101 std::map<Y, X>
invert(
const std::map<X, Y>& m) {
102 std::map<Y, X> m_prime;
103 for (
const auto& kv : m) {
104 m_prime.insert(std::make_pair(kv.second, kv.first));
109 template <
typename T>
118 template <
typename T>
121 using two =
struct {
char x[2]; };
123 template <
typename C>
125 template <
typename C>
126 static two test(...);
129 enum { value =
sizeof(test<T>(0)) ==
sizeof(one) };
132 template <
typename T>
135 template <
typename T,
bool EnumSerializerPresent>
138 template <
typename T>
140 static const std::map<T, std::string>& serialization_impl() {
143 static const std::map<std::string, T>& deserialization_impl() {
148 template <
typename T>
150 static const std::map<T, std::string>& serialization_impl() {
return enum_serialization(T()); }
151 static const std::map<std::string, T>& deserialization_impl() {
152 return enum_deserialization(T());
156 template <
typename T, std::enable_if_t<std::is_enum_v<T>,
int> = 0>
157 const std::map<T, std::string>& enum_serialization() {
161 template <
typename T, std::enable_if_t<std::is_enum_v<T>,
int> = 0>
162 const std::map<std::string, T>& enum_deserialization() {
163 return EnumSerializerImpl<T, has_enum_serializer_v<T>>::deserialization_impl();
166 template <
typename T, std::enable_if_t<std::is_enum_v<T>,
int> = 0>
167 std::string to_string(T x) {
168 return enum_serialization<T>().at(x);
171 template <
typename T, std::enable_if_t<std::is_enum_v<T>,
int> = 0>
172 T from_string(
const std::string& s) {
173 return enum_deserialization<T>().at(s);
std::map< Y, X > invert(const std::map< X, Y > &m)
Definition: enum.hpp:101