6 #ifndef CPPIPC_IPC_DESERIALIZER_HPP 7 #define CPPIPC_IPC_DESERIALIZER_HPP 9 #ifdef DISABLE_TURI_CPPIPC_PROXY_GENERATION 10 #include <core/system/cppipc/common/ipc_deserializer_minimal.hpp> 14 #include <type_traits> 15 #include <core/storage/serialization/iarchive.hpp> 16 #include <core/system/cppipc/ipc_object_base.hpp> 23 extern void set_deserializer_to_server(comm_server* server);
24 extern void set_deserializer_to_client(comm_client* client);
25 extern void get_deserialization_type(comm_server** server, comm_client** client);
26 extern std::shared_ptr<void> get_server_object_ptr(comm_server* server,
size_t object_id);
38 namespace archive_detail {
44 template <
typename Server,
typename T>
45 size_t get_server_object_id(Server* server, std::shared_ptr<T> objectptr) {
46 return server->register_object(objectptr);
51 template <
typename OutArcType,
typename T>
52 struct serialize_impl<OutArcType,
std::shared_ptr<T>, false,
53 typename std::enable_if<std::is_convertible<T*, cppipc::ipc_object_base*>::value>::type
57 exec(OutArcType& oarc,
const std::shared_ptr<T> value) {
61 cppipc::detail::get_deserialization_type(&server, &client);
64 oarc << get_server_object_id(server, value);
72 template <
typename InArcType,
typename T>
73 struct deserialize_impl<InArcType,
std::shared_ptr<T>, false,
74 typename std::enable_if<std::is_convertible<T*, cppipc::ipc_object_base*>::value>::type
77 void exec(InArcType& iarc, std::shared_ptr<T>& value) {
80 cppipc::detail::get_deserialization_type(&server, &client);
84 std::shared_ptr<void> obj = cppipc::detail::get_server_object_ptr(server, object_id);
86 throw std::to_string(object_id) +
" Object not found";
88 value = std::static_pointer_cast<T>(obj);
92 value.reset(
new typename T::proxy_object_type(*client,
false, object_id));