cereal_binary.h
Go to the documentation of this file.
1 #pragma once
2 
3 
4 // STD
5 #include <cassert>
6 #include <cstdint>
7 #include <iomanip>
8 #include <istream>
9 #include <iterator>
10 #include <memory>
11 #include <ostream>
12 #include <stdexcept>
13 #include <string>
14 #include <tuple>
15 #include <type_traits>
16 #include <utility>
17 #include <vector>
18 
19 // NANORPC
21 #include "nanorpc/core/exception.h"
22 #include "nanorpc/core/type.h"
23 
24 // cereal
25 #include "cereal/cereal.hpp"
26 #include "cereal/archives/binary.hpp"
27 #include <cereal/types/vector.hpp>
28 #include <cereal/types/unordered_map.hpp>
29 #include <cereal/types/memory.hpp>
30 #include <cereal/types/tuple.hpp>
31 #include <cereal/types/string.hpp>
32 #include <cereal/types/utility.hpp>
33 
34 
35 // Workaround for cereal not supporting serializing const char*
36 namespace cereal {
37 
39  template <class Archive, class ... Types> inline
40  void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, const char* c_str )
41  {
42  ar(std::string(c_str));
43  }
44 }
45 
46 namespace nanorpc
47 {
48 namespace packer
49 {
50 
51 
52 class cereal_binary final
53 {
54 private:
55  class serializer;
56  class deserializer;
57 
58 public:
61 
62  template <typename T>
63  serializer pack(T const &value)
64  {
65  return serializer{}.pack(value);
66  }
67 
69  {
70  return deserializer{std::move(buffer)};
71  }
72 
73 private:
74  class serializer final
75  {
76  public:
77  serializer(serializer &&) noexcept = default;
78  serializer& operator = (serializer &&) noexcept = default;
79  ~serializer() noexcept = default;
80 
81  template <typename T>
82  serializer pack(T const &value)
83  {
84  assert(stream_ && "Empty stream.");
85  if (!stream_)
86  throw core::exception::packer{"[nanorpc::packer::cereal_binary::serializer::pack] Empty stream."};
87 
88  pack_value(value);
89  return std::move(*this);
90  }
91 
93  {
94  assert(stream_ && "Empty stream.");
95  if (!stream_)
96  throw core::exception::packer{"[nanorpc::packer::cereal_binary::serializer::to_buffer] Empty stream."};
97 
98  archive_ = nullptr;
99  auto str = std::move(stream_->str());
100  return {begin(str), end(str)};
101  }
102 
103  private:
104 
105  using stream_type = std::stringstream;
106  using stream_type_ptr = std::unique_ptr<stream_type>;
107 
108  stream_type_ptr stream_{std::make_unique<std::stringstream>()};
109  std::unique_ptr<cereal::BinaryOutputArchive> archive_;
110 
111  friend class cereal_binary;
113  archive_ = std::make_unique<cereal::BinaryOutputArchive>(*stream_);
114  }
115 
116  serializer(serializer const &) = delete;
117  serializer& operator = (serializer const &) = delete;
118 
119 
120  template <typename T>
121  void pack_value(T const &value)
122  {
123  (*archive_)(value);
124  }
125 
126  // c string specialization
127  void pack_value(const char* value)
128  {
129  (*archive_)(std::string(value));
130  }
131 
132  };
133 
134  class deserializer final
135  {
136  public:
137  deserializer(deserializer &&) noexcept = default;
138  deserializer& operator = (deserializer &&) noexcept = default;
139  ~deserializer() noexcept = default;
140 
141  template <typename T>
143  {
144  assert(stream_ && "Empty stream.");
145  if (!stream_)
146  throw core::exception::packer{"[nanorpc::packer::plain_text::deserializer] Empty stream."};
147 
148  unpack_value(value);
149  return std::move(*this);
150  }
151 
152  private:
153 
154  using stream_type = std::stringstream;
155  using stream_type_ptr = std::unique_ptr<stream_type>;
156  stream_type_ptr stream_{std::make_unique<stream_type>()};
157 
158  std::unique_ptr<cereal::BinaryInputArchive> archive_;
159 
160 
161  friend class cereal_binary;
162 
163  deserializer(deserializer const &) = delete;
164  deserializer& operator = (deserializer const &) = delete;
165 
167  : stream_{std::make_unique<stream_type>(std::string{begin(buffer), end(buffer)})}
168  {
169  archive_ = std::make_unique<cereal::BinaryInputArchive>(*stream_);
170  }
171 
172 
173  template <typename T>
174  void unpack_value(T &value)
175  {
176  (*archive_)(value);
177  }
178 
179  // c string specialization
180  void pack_value(char* value)
181  {
182  std::string val;
183  (*archive_)(val);
184  strcpy(value, val.c_str());
185  }
186 
187  };
188 
189 };
190 
191 } // namespace packer
192 } // namespace nanorpc
nanorpc
Definition: client.h:30
nanorpc::packer::cereal_binary::deserializer::stream_
stream_type_ptr stream_
Definition: cereal_binary.h:156
nanorpc::packer::cereal_binary::serializer::stream_type_ptr
std::unique_ptr< stream_type > stream_type_ptr
Definition: cereal_binary.h:106
nanorpc::packer::cereal_binary::deserializer::unpack
deserializer unpack(T &value)
Definition: cereal_binary.h:142
cereal
Definition: cereal_binary.h:36
nanorpc::packer::cereal_binary::deserializer::archive_
std::unique_ptr< cereal::BinaryInputArchive > archive_
Definition: cereal_binary.h:158
nanorpc::packer::cereal_binary::serializer::stream_
stream_type_ptr stream_
Definition: cereal_binary.h:108
nanorpc::packer::cereal_binary::serializer::operator=
serializer & operator=(serializer &&) noexcept=default
nanorpc::packer::cereal_binary::serializer::serializer
serializer()
Definition: cereal_binary.h:112
nanorpc::packer::cereal_binary::deserializer::operator=
deserializer & operator=(deserializer &&) noexcept=default
nanorpc::packer::cereal_binary::serializer::to_buffer
core::type::buffer to_buffer()
Definition: cereal_binary.h:92
nanorpc::packer::cereal_binary::serializer::archive_
std::unique_ptr< cereal::BinaryOutputArchive > archive_
Definition: cereal_binary.h:109
nanorpc::packer::cereal_binary::pack
serializer pack(T const &value)
Definition: cereal_binary.h:63
type.h
nanorpc::core::type::buffer
std::vector< std::uint8_t > buffer
Definition: type.h:28
nanorpc::packer::cereal_binary::deserializer::deserializer
deserializer(deserializer &&) noexcept=default
nanorpc::packer::cereal_binary::serializer::stream_type
std::stringstream stream_type
Definition: cereal_binary.h:105
nanorpc::packer::cereal_binary
Definition: cereal_binary.h:52
nanorpc::packer::cereal_binary::serializer
Definition: cereal_binary.h:74
nanorpc::packer::cereal_binary::serializer::pack_value
void pack_value(const char *value)
Definition: cereal_binary.h:127
nanorpc::packer::cereal_binary::deserializer::deserializer
deserializer(core::type::buffer buffer)
Definition: cereal_binary.h:166
nanorpc::packer::cereal_binary::deserializer
Definition: cereal_binary.h:134
nanorpc::packer::cereal_binary::deserializer::pack_value
void pack_value(char *value)
Definition: cereal_binary.h:180
nanorpc::packer::cereal_binary::serializer::pack
serializer pack(T const &value)
Definition: cereal_binary.h:82
nanorpc::packer::cereal_binary::from_buffer
deserializer from_buffer(core::type::buffer buffer)
Definition: cereal_binary.h:68
nanorpc::packer::cereal_binary::serializer::~serializer
~serializer() noexcept=default
nanorpc::packer::cereal_binary::deserializer::unpack_value
void unpack_value(T &value)
Definition: cereal_binary.h:174
cereal::CEREAL_SERIALIZE_FUNCTION_NAME
void CEREAL_SERIALIZE_FUNCTION_NAME(Archive &ar, const char *c_str)
Serializing for const char*.
Definition: cereal_binary.h:40
nanorpc::packer::cereal_binary::serializer::pack_value
void pack_value(T const &value)
Definition: cereal_binary.h:121
config.h
nanorpc::packer::cereal_binary::deserializer::~deserializer
~deserializer() noexcept=default
nanorpc::packer::cereal_binary::deserializer::stream_type
std::stringstream stream_type
Definition: cereal_binary.h:154
exception.h
nanorpc::packer::cereal_binary::deserializer::stream_type_ptr
std::unique_ptr< stream_type > stream_type_ptr
Definition: cereal_binary.h:155


depthai
Author(s): Martin Peterlin
autogenerated on Sat Mar 22 2025 02:58:18