1#ifndef FPMAS_MODEL_DATAPACK_SERIALIZER_H
2#define FPMAS_MODEL_DATAPACK_SERIALIZER_H
42#define FPMAS_BASE_DATAPACK_SET_UP(...)\
43 namespace fpmas { namespace io { namespace datapack {\
44 std::size_t Serializer<api::model::AgentPtr>\
45 ::size(const ObjectPack& p, const api::model::AgentPtr& data) {\
46 return AgentPtrSerializer<ObjectPack, __VA_ARGS__ , void>::size(p, data);\
48 void Serializer<api::model::AgentPtr>\
49 ::to_datapack(ObjectPack& p, const api::model::AgentPtr& data) {\
50 AgentPtrSerializer<ObjectPack, __VA_ARGS__ , void>::to_datapack(p, data);\
52 api::model::AgentPtr Serializer<api::model::AgentPtr>\
53 ::from_datapack(const ObjectPack& p) {\
54 return {AgentPtrSerializer<ObjectPack, __VA_ARGS__ , void>::from_datapack(p)};\
57 std::size_t Serializer<api::model::WeakAgentPtr>\
58 ::size(const ObjectPack& p, const api::model::WeakAgentPtr& data) {\
59 return AgentPtrSerializer<ObjectPack, __VA_ARGS__ , void>::size(p, data);\
61 void Serializer<api::model::WeakAgentPtr>\
62 ::to_datapack(ObjectPack& p, const api::model::WeakAgentPtr& data) {\
63 AgentPtrSerializer<ObjectPack, __VA_ARGS__ , void>::to_datapack(p, data);\
65 api::model::WeakAgentPtr Serializer<api::model::WeakAgentPtr>\
66 ::from_datapack(const ObjectPack& p) {\
67 return AgentPtrSerializer<ObjectPack, __VA_ARGS__ , void>::from_datapack(p);\
70 std::size_t LightSerializer<api::model::AgentPtr>\
71 ::size(const LightObjectPack& p, const api::model::AgentPtr& data) {\
72 return AgentPtrSerializer<LightObjectPack, __VA_ARGS__ , void>::size(p, data);\
74 void LightSerializer<api::model::AgentPtr>\
75 ::to_datapack(LightObjectPack& p, const api::model::AgentPtr& data) {\
76 AgentPtrSerializer<LightObjectPack, __VA_ARGS__ , void>::to_datapack(p, data);\
78 api::model::AgentPtr LightSerializer<api::model::AgentPtr>::from_datapack(const LightObjectPack& p) {\
79 return {AgentPtrSerializer<LightObjectPack, __VA_ARGS__ , void>::from_datapack(p)};\
82 std::size_t LightSerializer<api::model::WeakAgentPtr>\
83 ::size(const LightObjectPack& p, const api::model::WeakAgentPtr& data) {\
84 return AgentPtrSerializer<LightObjectPack, __VA_ARGS__ , void>::size(p, data);\
86 void LightSerializer<api::model::WeakAgentPtr>\
87 ::to_datapack(LightObjectPack& p, const api::model::WeakAgentPtr& data) {\
88 AgentPtrSerializer<LightObjectPack, __VA_ARGS__ , void>::to_datapack(p, data);\
90 api::model::WeakAgentPtr LightSerializer<api::model::WeakAgentPtr>\
91 ::from_datapack(const LightObjectPack& p) {\
92 return AgentPtrSerializer<LightObjectPack, __VA_ARGS__ , void>::from_datapack(p);\
100#define FPMAS_BASE_DEFAULT_DATAPACK_SET_UP() \
101 namespace fpmas { namespace io { namespace datapack {\
102 std::size_t Serializer<fpmas::api::model::AgentPtr>::size(const ObjectPack& o, const fpmas::api::model::AgentPtr& data) {\
103 return AgentPtrSerializer<ObjectPack, void>::size(o, data);\
105 void Serializer<fpmas::api::model::AgentPtr>::to_datapack(ObjectPack& o, const fpmas::api::model::AgentPtr& data) {\
106 AgentPtrSerializer<ObjectPack, void>::to_datapack(o, data);\
108 fpmas::api::model::AgentPtr Serializer<fpmas::api::model::AgentPtr>::from_datapack(const ObjectPack& o) {\
109 return {AgentPtrSerializer<ObjectPack, void>::from_datapack(o)};\
112 std::size_t Serializer<fpmas::api::model::WeakAgentPtr>::size(const ObjectPack& o, const fpmas::api::model::WeakAgentPtr& data) {\
113 return AgentPtrSerializer<ObjectPack, void>::size(o, data);\
115 void Serializer<fpmas::api::model::WeakAgentPtr>\
116 ::to_datapack(ObjectPack& o, const fpmas::api::model::WeakAgentPtr& data) {\
117 AgentPtrSerializer<ObjectPack, void>::to_datapack(o, data);\
119 fpmas::api::model::WeakAgentPtr Serializer<fpmas::api::model::WeakAgentPtr>\
120 ::from_datapack(const ObjectPack& o) {\
121 return AgentPtrSerializer<ObjectPack, void>::from_datapack(o);\
124 std::size_t LightSerializer<fpmas::api::model::AgentPtr>::size(const LightObjectPack& o, const fpmas::api::model::AgentPtr& data) {\
125 return AgentPtrSerializer<LightObjectPack, void>::size(o, data);\
127 void LightSerializer<fpmas::api::model::AgentPtr>::to_datapack(LightObjectPack& o, const fpmas::api::model::AgentPtr& data) {\
128 AgentPtrSerializer<LightObjectPack, void>::to_datapack(o, data);\
130 fpmas::api::model::AgentPtr LightSerializer<fpmas::api::model::AgentPtr>::from_datapack(const LightObjectPack& o) {\
131 return {AgentPtrSerializer<LightObjectPack, void>::from_datapack(o)};\
134 std::size_t LightSerializer<fpmas::api::model::WeakAgentPtr>::size(const LightObjectPack& o, const fpmas::api::model::WeakAgentPtr& data) {\
135 return AgentPtrSerializer<LightObjectPack, void>::size(o, data);\
137 void LightSerializer<fpmas::api::model::WeakAgentPtr>\
138 ::to_datapack(LightObjectPack& o, const fpmas::api::model::WeakAgentPtr& data) {\
139 AgentPtrSerializer<LightObjectPack, void>::to_datapack(o, data);\
141 fpmas::api::model::WeakAgentPtr LightSerializer<fpmas::api::model::WeakAgentPtr>\
142 ::from_datapack(const LightObjectPack& o) {\
143 return AgentPtrSerializer<LightObjectPack, void>::from_datapack(o);\
154#define FPMAS_DEFAULT_DATAPACK(AGENT) \
155 namespace fpmas { namespace io { namespace datapack {\
160 struct Serializer<fpmas::api::utils::PtrWrapper<AGENT>> {\
161 template<typename PackType>\
162 static std::size_t size(const PackType&, const fpmas::api::utils::PtrWrapper<AGENT>&) {\
171 template<typename PackType>\
172 static void to_datapack(PackType&, const fpmas::api::utils::PtrWrapper<AGENT>&) {\
180 template<typename PackType>\
181 static fpmas::api::utils::PtrWrapper<AGENT> from_datapack(const PackType&) {\
187namespace fpmas {
namespace io {
namespace datapack {
189 using api::model::AgentPtr;
204 static std::unordered_map<FPMAS_TYPE_INDEX, std::type_index> id_to_type;
205 static std::unordered_map<std::type_index, FPMAS_TYPE_INDEX> type_to_id;
223 type_to_id.insert({type, new_id});
224 id_to_type.insert({new_id, type});
232 template<
typename PackType>
234 return pack.template size<FPMAS_TYPE_INDEX>();
240 template<
typename PackType>
242 return o.template size<FPMAS_TYPE_INDEX>();
254 template<
typename PackType>
255 static void to_datapack(PackType& pack,
const std::type_index& index) {
256 auto _id = type_to_id.find(index);
257 if(_id != type_to_id.end())
258 pack.put(_id->second);
271 template<
typename PackType>
272 static std::type_index from_datapack(
const PackType& pack) {
274 auto _type = id_to_type.find(type_id);
275 if(_type != id_to_type.end())
276 return _type->second;
378 template<
typename AgentType>
379 struct Serializer<api::utils::PtrWrapper<AgentType>> {
385 template<
typename PackType>
387 return AgentType::size(p, agent_ptr.
get());
396 template<
typename PackType>
398 AgentType::to_datapack(pack, agent_ptr.
get());
408 template<
typename PackType>
410 return AgentType::from_datapack(pack);
452 template<
typename AgentType>
453 struct LightSerializer<
455 typename std::enable_if<
456 std::is_base_of<fpmas::api::model::Agent, AgentType>::value
457 && !std::is_default_constructible<AgentType>::value
458 && std::is_same<AgentType, typename AgentType::FinalAgentType>::value>::type
487 static bool warn_print =
false;
490 FPMAS_LOGW(0,
"LightSerializer",
491 "Type %s does not define a default constructor or "
492 "a LightSerializer specialization."
534 template<
typename AgentType>
535 struct LightSerializer<
537 typename std::enable_if<
538 std::is_base_of<api::model::Agent, AgentType>::value
539 && std::is_default_constructible<AgentType>::value
540 && std::is_same<AgentType, typename AgentType::FinalAgentType>::value>::type
551 static std::size_t
size(
577 return new AgentType;
581 template<
typename PackType,
typename Type,
typename... AgentTypes>
582 struct AgentPtrSerializer;
587 template<
typename PackType>
588 struct AgentPtrSerializer<PackType, void> {
619 template<
typename PackType>
622 FPMAS_LOGE(-1,
"AGENT_SERIALIZER",
623 "Invalid agent type : %s. Make sure to properly register "
624 "the Agent type with FPMAS_DATAPACK_SET_UP and FPMAS_REGISTER_AGENT_TYPES.",
625 ptr->typeId().name());
629 template<
typename PackType>
632 FPMAS_LOGE(-1,
"AGENT_SERIALIZER",
633 "Invalid agent type : %s. Make sure to properly register "
634 "the Agent type with FPMAS_DATAPACK_SET_UP and FPMAS_REGISTER_AGENT_TYPES.",
635 ptr->typeId().name());
639 template<
typename PackType>
641 std::size_t
id = p.template get<std::size_t>();
642 FPMAS_LOGE(-1,
"AGENT_SERIALIZER",
643 "Invalid agent type id : %lu. Make sure to properly register "
644 "the Agent type with FPMAS_DATAPACK_SET_UP and FPMAS_REGISTER_AGENT_TYPES.",
658 template<
typename PackType,
typename Type,
typename... AgentTypes>
659 struct AgentPtrSerializer {
665 if(ptr->typeId() == Type::TYPE_ID) {
666 return p.template size<api::model::TypeId>()
668 const_cast<Type*
>(
static_cast<const Type*
>(ptr.get()))
670 + p.template
size(ptr->groupIds());
694 if(ptr->typeId() == Type::TYPE_ID) {
695 p.put(Type::TYPE_ID);
696 p.put(TypedAgentPtr<Type>(
697 const_cast<Type*
>(
static_cast<const Type*
>(ptr.get()))
699 p.put(ptr->groupIds());
723 std::size_t pos = p.readOffset();
725 .template get<fpmas::api::model::TypeId>();
726 if(
id == Type::TYPE_ID) {
728 .template get<TypedAgentPtr<Type>>();
730 p.template get<std::vector<api::model::GroupId>>())
731 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
Definition: datapack.h:301
std::size_t size() const
Definition: datapack.h:367
void put(const T &item)
Definition: datapack.h:447
T get() const
Definition: datapack.h:459
api::utils::PtrWrapper< api::model::Agent > WeakAgentPtr
Definition: model.h:160
std::type_index TypeId
Definition: model.h:82
BasicObjectPack< Serializer > ObjectPack
Definition: datapack.h:1393
#define FPMAS_TYPE_INDEX
Definition: serializer_set_up.h:38
#define FPMAS_TYPE_STR(T)
Definition: serializer_set_up.h:16
static WeakAgentPtr from_datapack(const PackType &p)
Definition: datapack_serializer.h:712
static void to_datapack(PackType &p, const WeakAgentPtr &ptr)
Definition: datapack_serializer.h:682
static std::size_t size(const PackType &p, const WeakAgentPtr &ptr)
Definition: datapack_serializer.h:654
static void to_datapack(LightObjectPack &pack, const T &item)
Definition: datapack.h:1438
static std::size_t size(const LightObjectPack &p)
Definition: datapack.h:1418
static T from_datapack(const LightObjectPack &pack)
Definition: datapack.h:1451
Definition: datapack.h:55