13#include <unordered_map>
16#include "../internal/helpers.h"
17#include "../visitors/serialization.h"
23 template <
class... t_Args>
24 bool isMissing(
const std::unordered_map<t_Args...> &entry)
26 return (entry.empty());
35 template <
class t_Visitor,
class... t_Args>
38 std::unordered_map<t_Args...> &entry,
39 const typename t_Visitor::Parameters ¶m)
42 const std::size_t size = visitor.startArray();
44 for (std::size_t i = 0; i < size; ++i)
47 typename std::unordered_map<t_Args...>::key_type,
48 typename std::unordered_map<t_Args...>::mapped_type>
51 visitor.startArrayElement();
53 entry.insert(map_entry);
54 visitor.endArrayElement();
60 template <
class t_Visitor,
class... t_Args>
63 std::unordered_map<std::string, t_Args...> &entry,
64 const typename t_Visitor::Parameters ¶meters)
67 if (parameters.sloppy_maps_ and visitor.startIteratedMap(t_Visitor::SIZE_LIMIT_MIN, 1))
70 std::string entry_name;
71 while (visitor.startIteratedMapElement(entry_name))
73 apply_read(visitor, entry[entry_name], parameters);
74 visitor.endIteratedMapElement();
76 visitor.endIteratedMap();
80 apply_read<t_Visitor, std::string, t_Args...>(visitor, entry, parameters);
91 template <
class t_Visitor,
class... t_Args>
94 const std::unordered_map<t_Args...> &entry,
95 const typename t_Visitor::Parameters ¶m)
98 writer.startArray(entry.size(), param.compact_arrays_);
99 for (
const typename std::unordered_map<t_Args...>::value_type &value : entry)
101 writer.visitArrayElement(value, param);
107 template <
class t_Visitor,
class... t_Args>
110 const std::unordered_map<std::string, t_Args...> &entry,
111 const typename t_Visitor::Parameters ¶m)
114 if (param.sloppy_maps_)
116 if (writer.startIteratedMap(entry.size(), param))
118 for (
const typename std::unordered_map<std::string, t_Args...>::value_type &value : entry)
120 writer.startIteratedMapElement(value.first);
122 writer.endIteratedMapElement();
124 writer.endIteratedMap();
128 apply_write<t_Visitor, std::string, t_Args...>(writer, entry, param);
138 template <
class t_Visitor,
class... t_Args>
141 const std::unordered_map<t_Args...> &left,
142 const std::unordered_map<t_Args...> &right,
143 const typename t_Visitor::Parameters ¶m)
147 visitor.equal_ &= (left.size() == right.size());
149 if (visitor.equal_ && !left.empty())
151 for (
const typename std::unordered_map<t_Args...>::value_type &left_pair : left)
153 typename std::unordered_map<t_Args...>::const_iterator right_it = right.find(left_pair.first);
154 if (right_it == right.end())
156 visitor.equal_ =
false;
159 apply_compare(visitor, left_pair.second, right_it->second, param);
172 template <
class t_Visitor,
class... t_Args>
175 std::unordered_map<t_Args...> &entry,
176 const typename t_Visitor::Parameters & )
189 template <
class t_Visitor,
class... t_Args>
191 const t_Visitor &visitor,
192 std::unordered_map<t_Args...> &entry,
193 const typename t_Visitor::Parameters ¶m)
196 for (
typename std::unordered_map<t_Args...>::reference value : entry)
210 template <
class t_Visitor,
class... t_ArgsLeft,
class... t_ArgsRight>
213 std::unordered_map<t_ArgsLeft...> &left,
214 const std::unordered_map<t_ArgsRight...> &right,
215 const typename t_Visitor::Parameters ¶m)
221 for (
const typename std::unordered_map<t_ArgsRight...>::value_type &right_pair : right)
223 typename std::unordered_map<t_ArgsLeft...>::key_type left_key;
225 apply_copyfrom(visitor, left[left_key], right_pair.second, param);
233 template <
class t_Visitor,
class... t_ArgsLeft,
class... t_ArgsRight>
236 const std::unordered_map<t_ArgsLeft...> &left,
237 std::unordered_map<t_ArgsRight...> &right,
238 const typename t_Visitor::Parameters ¶m)
244 for (
const typename std::unordered_map<t_ArgsLeft...>::value_type &left_pair : left)
246 typename std::unordered_map<t_ArgsRight...>::key_type right_key;
247 apply_copyto(visitor, left_pair.first, right_key, param);
248 apply_copyto(visitor, left_pair.second, right[right_key], param);
void apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters ¶m)
void apply_copyfrom(t_Visitor &visitor, t_Left &left, const t_Right &right, const typename t_Visitor::Parameters ¶m)
void apply_copyto(t_Visitor &visitor, const t_Left &left, t_Right &right, const typename t_Visitor::Parameters ¶m)
void apply_defaults(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters ¶m, ARILES2_IS_BASE_ENABLER(ariles2::defaults::Base, t_Entry))
void apply_process(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters ¶m)
void apply_read(t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters ¶meters, ARILES2_IS_BASE_ENABLER(ariles2::read::Base, t_Entry))
void apply_write(t_Visitor &writer, const t_Entry &entry, const typename t_Visitor::Parameters ¶meters, ARILES2_IS_BASE_ENABLER(ariles2::write::Base, t_Entry))
bool isMissing(const ARILES2_POINTER_TYPE< t_Entry > &entry)
#define CPPUT_TRACE_FUNCTION