1#ifndef FPMAS_MODEL_JSON_SERIALIZER_H
2#define FPMAS_MODEL_JSON_SERIALIZER_H
40#define FPMAS_BASE_JSON_SET_UP(...)\
42 void adl_serializer<fpmas::api::model::AgentPtr>\
43 ::to_json(json& j, const fpmas::api::model::AgentPtr& data) {\
44 fpmas::io::json::AgentPtrSerializer<json, __VA_ARGS__ , void>::to_json(j, data);\
46 fpmas::api::model::AgentPtr adl_serializer<fpmas::api::model::AgentPtr>\
47 ::from_json(const json& j) {\
48 return {fpmas::io::json::AgentPtrSerializer<json, __VA_ARGS__ , void>::from_json(j)};\
51 void adl_serializer<fpmas::api::model::WeakAgentPtr>\
52 ::to_json(json& j, const fpmas::api::model::WeakAgentPtr& data) {\
53 fpmas::io::json::AgentPtrSerializer<json, __VA_ARGS__ , void>::to_json(j, data);\
55 fpmas::api::model::WeakAgentPtr adl_serializer<fpmas::api::model::WeakAgentPtr>\
56 ::from_json(const json& j) {\
57 return fpmas::io::json::AgentPtrSerializer<json, __VA_ARGS__ , void>::from_json(j);\
60 namespace fpmas { namespace io { namespace json {\
61 void light_serializer<fpmas::api::model::AgentPtr>::to_json(light_json& j, const fpmas::api::model::AgentPtr& data) {\
62 AgentPtrSerializer<light_json, __VA_ARGS__ , void>::to_json(j, data);\
64 fpmas::api::model::AgentPtr light_serializer<fpmas::api::model::AgentPtr>::from_json(const light_json& j) {\
65 return {AgentPtrSerializer<light_json, __VA_ARGS__ , void>::from_json(j)};\
68 void light_serializer<fpmas::api::model::WeakAgentPtr>\
69 ::to_json(light_json& j, const fpmas::api::model::WeakAgentPtr& data) {\
70 AgentPtrSerializer<light_json, __VA_ARGS__ , void>::to_json(j, data);\
72 fpmas::api::model::WeakAgentPtr light_serializer<fpmas::api::model::WeakAgentPtr>\
73 ::from_json(const light_json& j) {\
74 return AgentPtrSerializer<light_json, __VA_ARGS__ , void>::from_json(j);\
82#define FPMAS_BASE_DEFAULT_JSON_SET_UP()\
84 void adl_serializer<fpmas::api::model::AgentPtr>\
85 ::to_json(json& j, const fpmas::api::model::AgentPtr& data) {\
86 fpmas::io::json::AgentPtrSerializer<json, void>::to_json(j, data);\
88 fpmas::api::model::AgentPtr adl_serializer<fpmas::api::model::AgentPtr>\
89 ::from_json(const json& j) {\
90 return {fpmas::io::json::AgentPtrSerializer<json, void>::from_json(j)};\
93 void adl_serializer<fpmas::api::model::WeakAgentPtr>\
94 ::to_json(json& j, const fpmas::api::model::WeakAgentPtr& data) {\
95 fpmas::io::json::AgentPtrSerializer<json, void>::to_json(j, data);\
97 fpmas::api::model::WeakAgentPtr adl_serializer<fpmas::api::model::WeakAgentPtr>\
98 ::from_json(const json& j) {\
99 return fpmas::io::json::AgentPtrSerializer<json, void>::from_json(j);\
102 namespace fpmas { namespace io { namespace json {\
103 void light_serializer<fpmas::api::model::AgentPtr>::to_json(light_json& j, const fpmas::api::model::AgentPtr& data) {\
104 AgentPtrSerializer<light_json, void>::to_json(j, data);\
106 fpmas::api::model::AgentPtr light_serializer<fpmas::api::model::AgentPtr>::from_json(const light_json& j) {\
107 return {AgentPtrSerializer<light_json, void>::from_json(j)};\
110 void light_serializer<fpmas::api::model::WeakAgentPtr>\
111 ::to_json(light_json& j, const fpmas::api::model::WeakAgentPtr& data) {\
112 AgentPtrSerializer<light_json, void>::to_json(j, data);\
114 fpmas::api::model::WeakAgentPtr light_serializer<fpmas::api::model::WeakAgentPtr>\
115 ::from_json(const light_json& j) {\
116 return AgentPtrSerializer<light_json, void>::from_json(j);\
127#define FPMAS_DEFAULT_JSON(AGENT) \
128 namespace nlohmann {\
133 struct adl_serializer<fpmas::api::utils::PtrWrapper<AGENT>> {\
139 template<typename JsonType>\
140 static void to_json(JsonType& j, const fpmas::api::utils::PtrWrapper<AGENT>&) {\
149 template<typename JsonType>\
150 static void from_json(const JsonType&, fpmas::api::utils::PtrWrapper<AGENT>& ptr) {\
151 ptr = fpmas::api::utils::PtrWrapper<AGENT>(new AGENT);\
167 struct adl_serializer<std::type_index> {
170 static std::unordered_map<FPMAS_TYPE_INDEX, std::type_index> id_to_type;
171 static std::unordered_map<std::type_index, FPMAS_TYPE_INDEX> type_to_id;
189 type_to_id.insert({type, new_id});
190 id_to_type.insert({new_id, type});
201 template<
typename JsonType>
202 static std::type_index from_json(
const JsonType& j) {
204 auto _type = id_to_type.find(
id);
205 if(_type != id_to_type.end())
206 return _type->second;
219 template<
typename JsonType>
220 static void to_json(JsonType& j,
const std::type_index& type) {
221 auto _id = type_to_id.find(type);
222 if(_id != type_to_id.end())
322 template<
typename AgentType>
323 struct adl_serializer<
fpmas::api::utils::PtrWrapper<AgentType>> {
330 template<
typename JsonType>
332 return AgentType::from_json(j);
341 template<
typename JsonType>
343 AgentType::to_json(j, agent_ptr.
get());
348namespace fpmas {
namespace io {
namespace json {
387 template<
typename AgentType>
388 struct light_serializer<
389 fpmas::api::utils::PtrWrapper<AgentType>,
390 typename std::enable_if<
391 std::is_base_of<fpmas::api::model::Agent, AgentType>::value
392 && !std::is_default_constructible<AgentType>::value
393 && std::is_same<AgentType, typename AgentType::FinalAgentType>::value>::type
406 static bool warn_print =
false;
409 FPMAS_LOGW(0,
"light_serializer",
410 "Type %s does not define a default constructor or "
411 "a light_serializer specialization."
416 nlohmann::json _j = agent;
417 j = light_json::parse(_j.dump());
430 nlohmann::json _j = nlohmann::json::parse(j.dump());
454 template<
typename AgentType>
455 struct light_serializer<
457 typename std::enable_if<
458 std::is_base_of<fpmas::api::model::Agent, AgentType>::value
459 && std::is_default_constructible<AgentType>::value
460 && std::is_same<AgentType, typename AgentType::FinalAgentType>::value>::type
482 return new AgentType;
488namespace fpmas {
namespace io {
namespace json {
489 using api::utils::PtrWrapper;
493 template<
typename JsonType,
typename Type,
typename... AgentTypes>
499 template<
typename JsonType>
520 template<
typename JsonType>
523 FPMAS_LOGE(-1,
"AGENT_SERIALIZER",
524 "Invalid agent type : %s. Make sure to properly register "
525 "the Agent type with FPMAS_JSON_SET_UP and FPMAS_REGISTER_AGENT_TYPES.",
526 ptr->typeId().name());
530 template<
typename JsonType>
532 std::size_t
id = j.at(
"type").template get<std::size_t>();
533 FPMAS_LOGE(-1,
"AGENT_SERIALIZER",
534 "Invalid agent type id : %lu. Make sure to properly register "
535 "the Agent type with FPMAS_JSON_SET_UP and FPMAS_REGISTER_AGENT_TYPES.",
549 template<
typename JsonType,
typename Type,
typename... AgentTypes>
550 struct AgentPtrSerializer {
573 if(ptr->typeId() == Type::TYPE_ID) {
574 j[
"type"] = Type::TYPE_ID;
575 j[
"gids"] = ptr->groupIds();
577 const_cast<Type*
>(
static_cast<const Type*
>(ptr.get()))
606 .template get<fpmas::api::model::TypeId>();
607 if(
id == Type::TYPE_ID) {
608 auto agent = j.at(
"agent").template get<TypedAgentPtr<Type>>();
609 for(
auto gid : j.at(
"gids")
610 .template get<std::vector<fpmas::api::model::GroupId>>())
611 agent->addGroupId(gid);
Definition: ptr_wrapper.h:21
T * get()
Definition: ptr_wrapper.h:58
Definition: serializer_set_up.h:67
Definition: serializer_set_up.h:97
api::utils::PtrWrapper< api::model::Agent > WeakAgentPtr
Definition: model.h:160
std::type_index TypeId
Definition: model.h:82
nlohmann::basic_json< std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, double, std::allocator, light_serializer > light_json
Definition: json.h:14
#define FPMAS_TYPE_INDEX
Definition: serializer_set_up.h:38
#define FPMAS_TYPE_STR(T)
Definition: serializer_set_up.h:16
Definition: json_serializer.h:540
static WeakAgentPtr from_json(const JsonType &j)
Definition: json_serializer.h:594
static void to_json(JsonType &j, const WeakAgentPtr &ptr)
Definition: json_serializer.h:561
static void from_json(const light_json &j, T &data)
Definition: json.h:123
static void to_json(light_json &j, const T &data)
Definition: json.h:107