Ariles
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 
20 namespace 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 
30 namespace 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>
54  void apply_read(
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 
80 namespace 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 
127 namespace 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 
156 namespace 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 
173 namespace 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 
194 namespace 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
visitor::Parameters Parameters
Definition: count.h:26
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
Definition: basic.h:17
bool isMissing(const ARILES2_POINTER_TYPE< t_Entry > &entry)
#define CPPUT_TRACE_FUNCTION
Definition: trace.h:126