Ariles
Loading...
Searching...
No Matches
std_map.h
Go to the documentation of this file.
1/**
2 @file
3 @author Alexander Sherikov
4
5 @copyright 2018 Alexander Sherikov, Licensed under the Apache License, Version 2.0.
6 (see @ref LICENSE or http://www.apache.org/licenses/LICENSE-2.0)
7
8 @brief
9*/
10
11#pragma once
12
13#include <map>
14
15#include "../internal/helpers.h"
16#include "../visitors/serialization.h"
17#include "std_pair.h"
18
19
20namespace ariles2
21{
22 template <class... t_Args>
23 bool isMissing(const std::map<t_Args...> &entry)
24 {
25 return (entry.empty());
26 }
27} // namespace ariles2
28
29
30namespace ariles2
31{
32 namespace read
33 {
34 template <class t_Visitor, class... t_Args>
35 void apply_read(t_Visitor &visitor, std::map<t_Args...> &entry, const typename t_Visitor::Parameters &param)
36 {
38 const std::size_t size = visitor.startArray();
39 entry.clear();
40 for (std::size_t i = 0; i < size; ++i)
41 {
42 std::pair<typename std::map<t_Args...>::key_type, typename std::map<t_Args...>::mapped_type> map_entry;
43
44 visitor.startArrayElement();
45 apply_read(visitor, map_entry, param);
46 entry.insert(map_entry);
47 visitor.endArrayElement();
48 }
49 visitor.endArray();
50 }
51
52
53 template <class t_Visitor, class... t_Args>
55 t_Visitor &visitor,
56 std::map<std::string, t_Args...> &entry,
57 const typename t_Visitor::Parameters &parameters)
58 {
60 if (parameters.sloppy_maps_ and visitor.startIteratedMap(t_Visitor::SIZE_LIMIT_MIN, 1))
61 {
62 entry.clear();
63 std::string entry_name;
64 while (visitor.startIteratedMapElement(entry_name))
65 {
66 apply_read(visitor, entry[entry_name], parameters);
67 visitor.endIteratedMapElement();
68 }
69 visitor.endIteratedMap();
70 }
71 else
72 {
73 apply_read<t_Visitor, std::string, t_Args...>(visitor, entry, parameters);
74 }
75 }
76 } // namespace read
77} // namespace ariles2
78
79
80namespace ariles2
81{
82 namespace write
83 {
84 template <class t_Visitor, class... t_Args>
86 t_Visitor &writer,
87 const std::map<t_Args...> &entry,
88 const typename t_Visitor::Parameters &param)
89 {
91 writer.startArray(entry.size(), param.compact_arrays_);
92 for (const typename std::map<t_Args...>::value_type &value : entry)
93 {
94 writer.visitArrayElement(value, param);
95 }
96 writer.endArray();
97 }
98
99
100 template <class t_Visitor, class... t_Args>
102 t_Visitor &writer,
103 const std::map<std::string, t_Args...> &entry,
104 const typename t_Visitor::Parameters &param)
105 {
107 if (param.sloppy_maps_)
108 {
109 if (writer.startIteratedMap(entry.size(), param))
110 {
111 for (const typename std::map<std::string, t_Args...>::value_type &value : entry)
112 {
113 writer.startIteratedMapElement(value.first);
114 apply_write(writer, value.second, param);
115 writer.endIteratedMapElement();
116 }
117 writer.endIteratedMap();
118 return;
119 }
120 }
121 apply_write<t_Visitor, std::string, t_Args...>(writer, entry, param);
122 }
123 } // namespace write
124} // namespace ariles2
125
126
127namespace ariles2
128{
129 namespace compare
130 {
131 template <class t_Visitor, class... t_Args>
133 t_Visitor &visitor,
134 const std::map<t_Args...> &left,
135 const std::map<t_Args...> &right,
136 const typename t_Visitor::Parameters &param)
137 {
139
140 visitor.equal_ &= (left.size() == right.size());
141
142 typename std::map<t_Args...>::const_iterator left_it = left.begin();
143 typename std::map<t_Args...>::const_iterator right_it = right.begin();
144
145 for (; (left_it != left.end()) and (right_it != right.end()) and (visitor.equal_); ++left_it, ++right_it)
146 {
147 apply_compare(visitor, left_it->first, right_it->first, param);
148 apply_compare(visitor, left_it->second, right_it->second, param);
149 }
150 }
151 } // namespace compare
152} // namespace ariles2
153
154
155
156namespace ariles2
157{
158 namespace defaults
159 {
160 template <class t_Visitor, class... t_Args>
162 const t_Visitor & /*visitor*/,
163 std::map<t_Args...> &entry,
164 const typename t_Visitor::Parameters & /*param*/)
165 {
167 entry.clear();
168 }
169 } // namespace defaults
170} // namespace ariles2
171
172
173namespace ariles2
174{
175 namespace process
176 {
177 template <class t_Visitor, class... t_Args>
179 const t_Visitor &visitor,
180 std::map<t_Args...> &entry,
181 const typename t_Visitor::Parameters &param)
182 {
184 for (typename std::map<t_Args...>::value_type &value : entry)
185 {
186 apply_process(visitor, value.first, param);
187 apply_process(visitor, value.second, param);
188 }
189 }
190 } // namespace process
191} // namespace ariles2
192
193
194namespace ariles2
195{
196 namespace copyfrom
197 {
198 template <class t_Visitor, class... t_ArgsLeft, class... t_ArgsRight>
200 t_Visitor &visitor,
201 std::map<t_ArgsLeft...> &left,
202 const std::map<t_ArgsRight...> &right,
203 const typename t_Visitor::Parameters &param)
204 {
206
207 typename std::map<t_ArgsRight...>::const_iterator right_it = right.begin();
208
209 left.clear();
210
211 for (; right_it != right.end(); ++right_it)
212 {
213 typename std::map<t_ArgsLeft...>::key_type left_key;
214
215 apply_copyfrom(visitor, left_key, right_it->first, param);
216 apply_copyfrom(visitor, left[std::move(left_key)], right_it->second, param);
217 }
218 }
219 } // namespace copyfrom
220
221
222 namespace copyto
223 {
224 template <class t_Visitor, class... t_ArgsLeft, class... t_ArgsRight>
226 t_Visitor &visitor,
227 const std::map<t_ArgsLeft...> &left,
228 std::map<t_ArgsRight...> &right,
229 const typename t_Visitor::Parameters &param)
230 {
232
233 typename std::map<t_ArgsLeft...>::const_iterator left_it = left.begin();
234
235 right.clear();
236
237 for (; left_it != left.end(); ++left_it)
238 {
239 typename std::map<t_ArgsRight...>::key_type right_key;
240
241 apply_copyto(visitor, left_it->first, right_key, param);
242 apply_copyto(visitor, left_it->second, right[std::move(right_key)], param);
243 }
244 }
245 } // namespace copyto
246} // namespace ariles2
void apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param)
Definition basic.h:140
void apply_copyfrom(t_Visitor &visitor, t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param)
Definition basic.h:307
void apply_copyto(t_Visitor &visitor, const t_Left &left, t_Right &right, const typename t_Visitor::Parameters &param)
Definition basic.h:353
void apply_defaults(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::defaults::Base, t_Entry))
Definition basic.h:232
void apply_process(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param)
Definition basic.h:289
void apply_read(t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &parameters, ARILES2_IS_BASE_ENABLER(ariles2::read::Base, t_Entry))
Definition basic.h:21
void apply_write(t_Visitor &writer, const t_Entry &entry, const typename t_Visitor::Parameters &parameters, ARILES2_IS_BASE_ENABLER(ariles2::write::Base, t_Entry))
Definition basic.h:82
bool isMissing(const ARILES2_POINTER_TYPE< t_Entry > &entry)
#define CPPUT_TRACE_FUNCTION
Definition trace.h:126