Ariles
Loading...
Searching...
No Matches
std_pair.h
Go to the documentation of this file.
1/**
2 @file
3 @author Alexander Sherikov
4
5 @copyright 2017-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 <utility>
14#include "../internal/helpers.h"
15#include "../visitors/serialization.h"
16
17namespace ariles2
18{
19 namespace read
20 {
21 template <class t_Visitor, typename t_First, typename t_Second>
23 t_Visitor &visitor,
24 std::pair<t_First, t_Second> &entry,
25 const typename t_Visitor::Parameters &parameters)
26 {
28 visitor.startMap(t_Visitor::SIZE_LIMIT_EQUAL, 2);
29 visitor.visitMapEntry(entry.first, "first", parameters, true);
30 visitor.visitMapEntry(entry.second, "second", parameters, true);
31 visitor.endMap();
32 }
33
34
35 template <class t_Visitor, typename t_Second>
37 t_Visitor &visitor,
38 std::pair<std::string, t_Second> &entry,
39 const typename t_Visitor::Parameters &parameters)
40 {
42 // size = 0 is ok if missing entries are allowed (fallback to standard logic which is going to fail)
43 // size > 1 is never ok, due to ambiguity.
44 if (parameters.sloppy_pairs_ and visitor.startIteratedMap(t_Visitor::SIZE_LIMIT_EQUAL, 1))
45 {
47 visitor.startIteratedMapElement(entry.first), "Could not read first element of a sloppy pair.");
48 apply_read(visitor, entry.second, parameters);
49 visitor.endIteratedMapElement();
50 visitor.endIteratedMap();
51 }
52 else
53 {
54 apply_read<t_Visitor, std::string, t_Second>(visitor, entry, parameters);
55 }
56 }
57 } // namespace read
58} // namespace ariles2
59
60
61namespace ariles2
62{
63 namespace write
64 {
65 template <class t_Visitor, typename t_First, typename t_Second>
67 t_Visitor &writer,
68 const std::pair<t_First, t_Second> &entry,
69 const typename t_Visitor::Parameters &param)
70 {
72 writer.startMap(param, 2);
73 writer.visitMapEntry(entry.first, "first", param);
74 writer.visitMapEntry(entry.second, "second", param);
75 writer.endMap();
76 }
77
78
79
80 template <class t_Visitor, typename t_Second>
82 t_Visitor &writer,
83 const std::pair<std::string, t_Second> &entry,
84 const typename t_Visitor::Parameters &param)
85 {
87 if (param.sloppy_pairs_)
88 {
89 if (writer.startIteratedMap(1, param))
90 {
91 writer.startIteratedMapElement(entry.first);
92 apply_write(writer, entry.second, param);
93 writer.endIteratedMapElement();
94 writer.endIteratedMap();
95 return;
96 }
97 }
98
99 // ? Gets mixed up with vector and fails.
100 // apply_write<t_Visitor, std::string, t_Second>(writer, entry, param);
101 writer.startMap(param, 2);
102 writer.visitMapEntry(entry.first, "first", param);
103 writer.visitMapEntry(entry.second, "second", param);
104 writer.endMap();
105 }
106 } // namespace write
107} // namespace ariles2
108
109
110namespace ariles2
111{
112 namespace compare
113 {
114 template <class t_Visitor, typename t_First, typename t_Second>
116 t_Visitor &visitor,
117 const std::pair<t_First, t_Second> &left,
118 const std::pair<t_First, t_Second> &right,
119 const typename t_Visitor::Parameters &param)
120 {
122
123 apply_compare(visitor, left.first, right.first, param);
124 apply_compare(visitor, left.second, right.second, param);
125 }
126 } // namespace compare
127} // namespace ariles2
128
129
130
131namespace ariles2
132{
133 namespace defaults
134 {
135 template <class t_Visitor, typename t_First, typename t_Second>
137 const t_Visitor &visitor,
138 std::pair<t_First, t_Second> &entry,
139 const typename t_Visitor::Parameters &param)
140 {
142 apply_defaults(visitor, entry.first, param);
143 apply_defaults(visitor, entry.second, param);
144 }
145 } // namespace defaults
146} // namespace ariles2
147
148
149
150namespace ariles2
151{
152 namespace process
153 {
154 template <class t_Visitor, typename t_First, typename t_Second>
156 const t_Visitor &visitor,
157 std::pair<t_First, t_Second> &entry,
158 const typename t_Visitor::Parameters &param)
159 {
161 apply_process(visitor, entry.first, param);
162 apply_process(visitor, entry.second, param);
163 }
164 } // namespace process
165} // namespace ariles2
166
167
168namespace ariles2
169{
170 namespace copyfrom
171 {
172 template <
173 class t_Visitor,
174 typename t_FirstLeft,
175 typename t_SecondLeft,
176 typename t_FirstRight,
177 typename t_SecondRight>
179 t_Visitor &visitor,
180 std::pair<t_FirstLeft, t_SecondLeft> &left,
181 const std::pair<t_FirstRight, t_SecondRight> &right,
182 const typename t_Visitor::Parameters &param)
183 {
185
186 apply_copyfrom(visitor, left.first, right.first, param);
187 apply_copyfrom(visitor, left.second, right.second, param);
188 }
189 } // namespace copyfrom
190
191 namespace copyto
192 {
193 template <
194 class t_Visitor,
195 typename t_FirstLeft,
196 typename t_SecondLeft,
197 typename t_FirstRight,
198 typename t_SecondRight>
200 t_Visitor &visitor,
201 const std::pair<t_FirstLeft, t_SecondLeft> &left,
202 std::pair<t_FirstRight, t_SecondRight> &right,
203 const typename t_Visitor::Parameters &param)
204 {
206
207 apply_copyto(visitor, left.first, right.first, param);
208 apply_copyto(visitor, left.second, right.second, param);
209 }
210 } // namespace copyto
211} // namespace ariles2
#define CPPUT_ASSERT(condition,...)
Definition exception.h:32
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
#define CPPUT_TRACE_FUNCTION
Definition trace.h:126