Ariles
Loading...
Searching...
No Matches
std_unordered_map.h
Go to the documentation of this file.
1/**
2 @file
3 @author Alexander Sherikov
4
5 @copyright 2026 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 <unordered_map>
14#include <utility>
15
16#include "../internal/helpers.h"
17#include "../visitors/serialization.h"
18#include "std_pair.h"
19
20
21namespace ariles2
22{
23 template <class... t_Args>
24 bool isMissing(const std::unordered_map<t_Args...> &entry)
25 {
26 return (entry.empty());
27 }
28} // namespace ariles2
29
30
31namespace ariles2
32{
33 namespace read
34 {
35 template <class t_Visitor, class... t_Args>
37 t_Visitor &visitor,
38 std::unordered_map<t_Args...> &entry,
39 const typename t_Visitor::Parameters &param)
40 {
42 const std::size_t size = visitor.startArray();
43 entry.clear();
44 for (std::size_t i = 0; i < size; ++i)
45 {
46 std::pair<
47 typename std::unordered_map<t_Args...>::key_type,
48 typename std::unordered_map<t_Args...>::mapped_type>
49 map_entry;
50
51 visitor.startArrayElement();
52 apply_read(visitor, map_entry, param);
53 entry.insert(map_entry);
54 visitor.endArrayElement();
55 }
56 visitor.endArray();
57 }
58
59
60 template <class t_Visitor, class... t_Args>
62 t_Visitor &visitor,
63 std::unordered_map<std::string, t_Args...> &entry,
64 const typename t_Visitor::Parameters &parameters)
65 {
67 if (parameters.sloppy_maps_ and visitor.startIteratedMap(t_Visitor::SIZE_LIMIT_MIN, 1))
68 {
69 entry.clear();
70 std::string entry_name;
71 while (visitor.startIteratedMapElement(entry_name))
72 {
73 apply_read(visitor, entry[entry_name], parameters);
74 visitor.endIteratedMapElement();
75 }
76 visitor.endIteratedMap();
77 }
78 else
79 {
80 apply_read<t_Visitor, std::string, t_Args...>(visitor, entry, parameters);
81 }
82 }
83 } // namespace read
84} // namespace ariles2
85
86
87namespace ariles2
88{
89 namespace write
90 {
91 template <class t_Visitor, class... t_Args>
93 t_Visitor &writer,
94 const std::unordered_map<t_Args...> &entry,
95 const typename t_Visitor::Parameters &param)
96 {
98 writer.startArray(entry.size(), param.compact_arrays_);
99 for (const typename std::unordered_map<t_Args...>::value_type &value : entry)
100 {
101 writer.visitArrayElement(value, param);
102 }
103 writer.endArray();
104 }
105
106
107 template <class t_Visitor, class... t_Args>
109 t_Visitor &writer,
110 const std::unordered_map<std::string, t_Args...> &entry,
111 const typename t_Visitor::Parameters &param)
112 {
114 if (param.sloppy_maps_)
115 {
116 if (writer.startIteratedMap(entry.size(), param))
117 {
118 for (const typename std::unordered_map<std::string, t_Args...>::value_type &value : entry)
119 {
120 writer.startIteratedMapElement(value.first);
121 apply_write(writer, value.second, param);
122 writer.endIteratedMapElement();
123 }
124 writer.endIteratedMap();
125 return;
126 }
127 }
128 apply_write<t_Visitor, std::string, t_Args...>(writer, entry, param);
129 }
130 } // namespace write
131} // namespace ariles2
132
133
134namespace ariles2
135{
136 namespace compare
137 {
138 template <class t_Visitor, class... t_Args>
140 t_Visitor &visitor,
141 const std::unordered_map<t_Args...> &left,
142 const std::unordered_map<t_Args...> &right,
143 const typename t_Visitor::Parameters &param)
144 {
146
147 visitor.equal_ &= (left.size() == right.size());
148
149 if (visitor.equal_ && !left.empty())
150 {
151 for (const typename std::unordered_map<t_Args...>::value_type &left_pair : left)
152 {
153 typename std::unordered_map<t_Args...>::const_iterator right_it = right.find(left_pair.first);
154 if (right_it == right.end())
155 {
156 visitor.equal_ = false;
157 break;
158 }
159 apply_compare(visitor, left_pair.second, right_it->second, param);
160 }
161 }
162 }
163 } // namespace compare
164} // namespace ariles2
165
166
167
168namespace ariles2
169{
170 namespace defaults
171 {
172 template <class t_Visitor, class... t_Args>
174 const t_Visitor & /*visitor*/,
175 std::unordered_map<t_Args...> &entry,
176 const typename t_Visitor::Parameters & /*param*/)
177 {
179 entry.clear();
180 }
181 } // namespace defaults
182} // namespace ariles2
183
184
185namespace ariles2
186{
187 namespace process
188 {
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 &param)
194 {
196 for (typename std::unordered_map<t_Args...>::reference value : entry)
197 {
198 apply_process(visitor, value.first, param);
199 apply_process(visitor, value.second, param);
200 }
201 }
202 } // namespace process
203} // namespace ariles2
204
205
206namespace ariles2
207{
208 namespace copyfrom
209 {
210 template <class t_Visitor, class... t_ArgsLeft, class... t_ArgsRight>
212 t_Visitor &visitor,
213 std::unordered_map<t_ArgsLeft...> &left,
214 const std::unordered_map<t_ArgsRight...> &right,
215 const typename t_Visitor::Parameters &param)
216 {
218
219 left.clear();
220
221 for (const typename std::unordered_map<t_ArgsRight...>::value_type &right_pair : right)
222 {
223 typename std::unordered_map<t_ArgsLeft...>::key_type left_key;
224 apply_copyfrom(visitor, left_key, right_pair.first, param);
225 apply_copyfrom(visitor, left[left_key], right_pair.second, param);
226 }
227 }
228 } // namespace copyfrom
229
230
231 namespace copyto
232 {
233 template <class t_Visitor, class... t_ArgsLeft, class... t_ArgsRight>
235 t_Visitor &visitor,
236 const std::unordered_map<t_ArgsLeft...> &left,
237 std::unordered_map<t_ArgsRight...> &right,
238 const typename t_Visitor::Parameters &param)
239 {
241
242 right.clear();
243
244 for (const typename std::unordered_map<t_ArgsLeft...>::value_type &left_pair : left)
245 {
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);
249 }
250 }
251 } // namespace copyto
252} // 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