retdec
std.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_SERDES_STD_H
8 #define RETDEC_SERDES_STD_H
9 
10 #include <map>
11 #include <type_traits>
12 
13 #include <rapidjson/document.h>
14 #include <rapidjson/encodings.h>
15 
16 namespace retdec {
17 namespace serdes {
18 
26 #define SERIALIZE_EXPLICIT_INSTANTIATION(T) \
27  template void serialize( \
28  rapidjson::PrettyWriter<rapidjson::StringBuffer>&, \
29  const T&); \
30  template void serialize( \
31  rapidjson::PrettyWriter<rapidjson::StringBuffer, rapidjson::ASCII<>>&, \
32  const T&);
33 
34 int64_t deserializeInt64(
35  const rapidjson::Value& val,
36  const std::string& key,
37  int64_t defaultValue = 0);
38 
39 uint64_t deserializeUint64(
40  const rapidjson::Value& val,
41  const std::string& key,
42  uint64_t defaultValue = 0);
43 
44 bool deserializeBool(
45  const rapidjson::Value& val,
46  const std::string& key,
47  bool defaultValue = false);
48 
50  const rapidjson::Value& val,
51  const std::string& key,
52  double defaultValue = 0.0);
53 
54 std::string deserializeString(
55  const rapidjson::Value& val,
56  const std::string& key,
57  const std::string& defaultValue = "");
58 
59 void deserialize(const rapidjson::Value& val, const char*& str);
60 void deserialize(const rapidjson::Value& val, std::string& s);
61 
62 template<typename ContainerOfDeserializableObjects>
64  const rapidjson::Value& val,
65  const std::string& key,
66  ContainerOfDeserializableObjects& objs)
67 {
68  objs.clear();
69 
70  auto array = val.FindMember(key);
71  if (array != val.MemberEnd() && array->value.IsArray())
72  {
73  for (auto i = array->value.Begin(), e = array->value.End(); i != e; ++i)
74  {
75  auto& obj = *i;
76  if (!obj.IsNull())
77  {
78  typename ContainerOfDeserializableObjects::value_type v;
79  deserialize(obj, v);
80  objs.insert(objs.end(), v);
81  }
82  }
83  }
84 }
85 
86 template <typename DeserializableObject>
88  const rapidjson::Value& val,
89  const std::string& key,
90  DeserializableObject& obj)
91 {
92  auto res = val.FindMember(key);
93  if (res != val.MemberEnd())
94  {
95  deserialize(res->value, obj);
96  }
97 }
98 
99 template <typename Writer>
101  Writer& writer,
102  const std::string& key,
103  int64_t value,
104  bool doSerialize = true)
105 {
106  if (doSerialize)
107  {
108  writer.String(key);
109  writer.Int64(value);
110  }
111 }
112 
113 template <typename Writer>
115  Writer& writer,
116  const std::string& key,
117  uint64_t value,
118  bool doSerialize = true)
119 {
120  if (doSerialize)
121  {
122  writer.String(key);
123  writer.Uint64(value);
124  }
125 }
126 
127 template <typename Writer>
129  Writer& writer,
130  const std::string& key,
131  bool value,
132  bool serializeIfFalse = true)
133 {
134  if (value || serializeIfFalse)
135  {
136  writer.String(key);
137  writer.Bool(value);
138  }
139 }
140 
141 template <typename Writer>
142 void serializeDouble(Writer& writer, const std::string& key, double value)
143 {
144  writer.String(key);
145  writer.Double(value);
146 }
147 
148 template <typename Writer>
150  Writer& writer,
151  const std::string& key,
152  const std::string& value,
153  bool serializeIfValueEmpty = false)
154 {
155  if (!value.empty() || serializeIfValueEmpty)
156  {
157  writer.String(key);
158  writer.String(value);
159  }
160 }
161 
162 template <typename Writer>
164  Writer& writer,
165  const std::string& value)
166 {
167  writer.String(value);
168 }
169 
170 template<typename Writer, typename ContainerOfSerializableObjects>
172  Writer& writer,
173  const std::string& key,
174  const ContainerOfSerializableObjects& objs,
175  bool serializeIfContainerEmpty = false)
176 {
177  if (!objs.empty() || serializeIfContainerEmpty)
178  {
179  writer.String(key);
180  writer.StartArray();
181  for (auto& obj : objs)
182  {
183  serialize(writer, obj);
184  }
185  writer.EndArray();
186  }
187 }
188 
189 template <typename Writer, typename SerializableObject>
191  Writer& writer,
192  const std::string& key,
193  const SerializableObject& obj,
194  bool doSerialize = true)
195 {
196  if (doSerialize)
197  {
198  writer.String(key);
199  serialize(writer, obj);
200  }
201 }
202 
203 } // namespace serdes
204 } // namespace retdec
205 
206 #endif
void serialize(Writer &writer, const common::Address &a)
Definition: address.cpp:24
void serializeBool(Writer &writer, const std::string &key, bool value, bool serializeIfFalse=true)
Definition: std.h:128
void deserializeContainer(const rapidjson::Value &val, const std::string &key, ContainerOfDeserializableObjects &objs)
Definition: std.h:63
uint64_t deserializeUint64(const rapidjson::Value &val, const std::string &key, uint64_t defaultValue=0)
Definition: std.cpp:35
void serializeString(Writer &writer, const std::string &key, const std::string &value, bool serializeIfValueEmpty=false)
Definition: std.h:149
void serializeDouble(Writer &writer, const std::string &key, double value)
Definition: std.h:142
void deserialize(const rapidjson::Value &val, common::Address &a)
Definition: address.cpp:30
std::string deserializeString(const rapidjson::Value &val, const std::string &key, const std::string &defaultValue="")
Definition: std.cpp:68
int64_t deserializeInt64(const rapidjson::Value &val, const std::string &key, int64_t defaultValue=0)
Definition: std.cpp:24
void serializeContainer(Writer &writer, const std::string &key, const ContainerOfSerializableObjects &objs, bool serializeIfContainerEmpty=false)
Definition: std.h:171
void serializeUint64(Writer &writer, const std::string &key, uint64_t value, bool doSerialize=true)
Definition: std.h:114
bool deserializeDouble(const rapidjson::Value &val, const std::string &key, double defaultValue=0.0)
Definition: std.cpp:57
void serializeInt64(Writer &writer, const std::string &key, int64_t value, bool doSerialize=true)
Definition: std.h:100
bool deserializeBool(const rapidjson::Value &val, const std::string &key, bool defaultValue=false)
Definition: std.cpp:46
Definition: archive_wrapper.h:19