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 #include "../visitors/serialization.h"
15 
16 namespace ariles
17 {
18  namespace read
19  {
20  template <class t_Visitor, typename t_Key, typename t_Value, class t_Compare, class t_Allocator>
22  t_Visitor &visitor,
23  std::map<t_Key, t_Value, t_Compare, t_Allocator> &entry,
24  const typename t_Visitor::Parameters &param)
25  {
27  std::size_t size = visitor.startArray();
28  entry.clear();
29  for (std::size_t i = 0; i < size; ++i)
30  {
31  std::pair<t_Key, t_Value> map_entry;
32 
33  apply_read(visitor, map_entry, param);
34 
35  entry.insert(map_entry);
36 
37  visitor.shiftArray();
38  }
39  visitor.endArray();
40  }
41 
42 
43  template <class t_Visitor, typename t_Value, class t_Compare, class t_Allocator>
45  t_Visitor &visitor,
46  std::map<std::string, t_Value, t_Compare, t_Allocator> &entry,
47  const typename t_Visitor::Parameters &parameters)
48  {
50  if (visitor.getSerializationFeatures().isSet(serialization::Features::SLOPPY_MAPS_SUPPORTED)
51  && parameters.isSet(t_Visitor::Parameters::SLOPPY_MAPS_IF_SUPPORTED))
52  {
53  std::vector<std::string> entry_names;
54  ARILES_ASSERT(true == visitor.getMapEntryNames(entry_names), "Could not read names of map entries.");
55  entry.clear();
56  visitor.template startMap<t_Visitor::SIZE_LIMIT_NONE>();
57 
58  ariles::ConfigurableFlags param = parameters;
59  // if entry is in the map, we should be able to read it
61 
62  for (std::size_t i = 0; i < entry_names.size(); ++i)
63  {
64  if (false == visitor(entry[entry_names[i]], entry_names[i], param))
65  {
66  entry.erase(entry_names[i]);
67  }
68  }
69  visitor.endMap();
70  }
71  else
72  {
73  apply_read<t_Visitor, std::string, t_Value, t_Compare, t_Allocator>(visitor, entry, parameters);
74  }
75  }
76  } // namespace read
77 } // namespace ariles
78 
79 
80 namespace ariles
81 {
82  namespace write
83  {
84  template <class t_Visitor, typename t_Key, typename t_Value, class t_Compare, class t_Allocator>
86  t_Visitor &writer,
87  const std::map<t_Key, t_Value, t_Compare, t_Allocator> &entry,
88  const typename t_Visitor::Parameters &param)
89  {
91  writer.startArray(entry.size(), param.isSet(t_Visitor::Parameters::COMPACT_ARRAYS_IF_SUPPORTED));
92  for (typename std::map<t_Key, t_Value, t_Compare, t_Allocator>::const_iterator it = entry.begin();
93  it != entry.end();
94  ++it)
95  {
96  apply_write(writer, *it, param);
97  writer.shiftArray();
98  }
99  writer.endArray();
100  }
101 
102 
103  template <class t_Visitor, typename t_Value, class t_Compare, class t_Allocator>
105  t_Visitor &writer,
106  const std::map<std::string, t_Value, t_Compare, t_Allocator> &entry,
107  const typename t_Visitor::Parameters &param)
108  {
110  if (writer.getSerializationFeatures().isSet(serialization::Features::SLOPPY_MAPS_SUPPORTED)
111  && param.isSet(t_Visitor::Parameters::SLOPPY_MAPS_IF_SUPPORTED))
112  {
113  writer.startMap(entry.size());
114  for (typename std::map<std::string, t_Value, t_Compare, t_Allocator>::const_iterator it = entry.begin();
115  it != entry.end();
116  ++it)
117  {
118  writer(it->second, it->first, param);
119  }
120  writer.endMap();
121  }
122  else
123  {
124  apply_write<t_Visitor, std::string, t_Value, t_Compare, t_Allocator>(writer, entry, param);
125  }
126  }
127  } // namespace write
128 } // namespace ariles
129 
130 
131 namespace ariles
132 {
133  namespace compare
134  {
135  template <class t_Visitor, typename t_Key, typename t_Value, class t_Compare, class t_Allocator>
137  t_Visitor &visitor,
138  const std::map<t_Key, t_Value, t_Compare, t_Allocator> &left,
139  const std::map<t_Key, t_Value, t_Compare, t_Allocator> &right,
140  const typename t_Visitor::Parameters &param)
141  {
143 
144  visitor.equal_ &= (left.size() == right.size());
145 
146  typename std::map<t_Key, t_Value, t_Compare, t_Allocator>::const_iterator left_it = left.begin();
147  typename std::map<t_Key, t_Value, t_Compare, t_Allocator>::const_iterator right_it = right.begin();
148 
149  for (; (left_it != left.end()) and (right_it != right.end()) and (true == visitor.equal_);
150  ++left_it, ++right_it)
151  {
152  apply_compare(visitor, left_it->first, right_it->first, param);
153  apply_compare(visitor, left_it->second, right_it->second, param);
154  }
155  }
156  } // namespace compare
157 } // namespace ariles
158 
159 
160 
161 namespace ariles
162 {
163  namespace defaults
164  {
165  template <class t_Visitor, typename t_Key, typename t_Value, class t_Compare, class t_Allocator>
167  const t_Visitor & /*visitor*/,
168  std::map<t_Key, t_Value, t_Compare, t_Allocator> &entry,
169  const typename t_Visitor::Parameters & /*param*/)
170  {
172  entry.clear();
173  }
174  } // namespace defaults
175 } // namespace ariles
176 
177 
178 namespace ariles
179 {
180  namespace process
181  {
182  template <class t_Visitor, typename t_Key, typename t_Value, class t_Compare, class t_Allocator>
184  const t_Visitor &visitor,
185  std::map<t_Key, t_Value, t_Compare, t_Allocator> &entry,
186  const typename t_Visitor::Parameters &param)
187  {
189  for (typename std::map<t_Key, t_Value, t_Compare, t_Allocator>::iterator it = entry.begin();
190  it != entry.end();
191  ++it)
192  {
193  apply_process(visitor, it->first, param);
194  apply_process(visitor, it->second, param);
195  }
196  }
197  } // namespace process
198 } // namespace ariles
void ARILES_VISIBILITY_ATTRIBUTE apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::Ariles, t_Left))
Definition: basic.h:149
#define ARILES_TRACE_FUNCTION
Definition: trace.h:118
void ARILES_VISIBILITY_ATTRIBUTE apply_process(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::Ariles, t_Entry))
Definition: basic.h:278
void ARILES_VISIBILITY_ATTRIBUTE apply_defaults(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::defaults::Base, t_Entry))
Definition: basic.h:234
void ARILES_VISIBILITY_ATTRIBUTE apply_write(t_Visitor &writer, const t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::write::Base, t_Entry))
Definition: basic.h:96
#define ARILES_VISIBILITY_ATTRIBUTE
Definition: helpers.h:69
void ARILES_VISIBILITY_ATTRIBUTE apply_read(t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &parameters, ARILES_IS_BASE_ENABLER(ariles::read::Base, t_Entry))
Definition: basic.h:22
Definition: basic.h:17