Ariles
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 
17 namespace 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  {
27  ARILES2_TRACE_FUNCTION;
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  {
41  ARILES2_TRACE_FUNCTION;
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 (true == parameters.sloppy_pairs_ and true == visitor.startIteratedMap(t_Visitor::SIZE_LIMIT_EQUAL, 1))
45  {
46  ARILES2_ASSERT(
47  true == visitor.startIteratedMapElement(entry.first),
48  "Could not read first element of a sloppy pair.");
49  apply_read(visitor, entry.second, parameters);
50  visitor.endIteratedMapElement();
51  visitor.endIteratedMap();
52  }
53  else
54  {
55  apply_read<t_Visitor, std::string, t_Second>(visitor, entry, parameters);
56  }
57  }
58  } // namespace read
59 } // namespace ariles2
60 
61 
62 namespace ariles2
63 {
64  namespace write
65  {
66  template <class t_Visitor, typename t_First, typename t_Second>
68  t_Visitor &writer,
69  const std::pair<t_First, t_Second> &entry,
70  const typename t_Visitor::Parameters &param)
71  {
72  ARILES2_TRACE_FUNCTION;
73  writer.startMap(param, 2);
74  writer.visitMapEntry(entry.first, "first", param);
75  writer.visitMapEntry(entry.second, "second", param);
76  writer.endMap();
77  }
78 
79 
80 
81  template <class t_Visitor, typename t_Second>
83  t_Visitor &writer,
84  const std::pair<std::string, t_Second> &entry,
85  const typename t_Visitor::Parameters &param)
86  {
87  ARILES2_TRACE_FUNCTION;
88  if (true == param.sloppy_pairs_)
89  {
90  if (true == writer.startIteratedMap(1, param))
91  {
92  writer.startIteratedMapElement(entry.first);
93  apply_write(writer, entry.second, param);
94  writer.endIteratedMapElement();
95  writer.endIteratedMap();
96  return;
97  }
98  }
99 
100  // ? Gets mixed up with vector and fails.
101  // apply_write<t_Visitor, std::string, t_Second>(writer, entry, param);
102  writer.startMap(param, 2);
103  writer.visitMapEntry(entry.first, "first", param);
104  writer.visitMapEntry(entry.second, "second", param);
105  writer.endMap();
106  }
107  } // namespace write
108 } // namespace ariles2
109 
110 
111 namespace ariles2
112 {
113  namespace compare
114  {
115  template <class t_Visitor, typename t_First, typename t_Second>
117  t_Visitor &visitor,
118  const std::pair<t_First, t_Second> &left,
119  const std::pair<t_First, t_Second> &right,
120  const typename t_Visitor::Parameters &param)
121  {
122  ARILES2_TRACE_FUNCTION;
123 
124  apply_compare(visitor, left.first, right.first, param);
125  apply_compare(visitor, left.second, right.second, param);
126  }
127  } // namespace compare
128 } // namespace ariles2
129 
130 
131 
132 namespace ariles2
133 {
134  namespace defaults
135  {
136  template <class t_Visitor, typename t_First, typename t_Second>
138  const t_Visitor &visitor,
139  std::pair<t_First, t_Second> &entry,
140  const typename t_Visitor::Parameters &param)
141  {
142  ARILES2_TRACE_FUNCTION;
143  apply_defaults(visitor, entry.first, param);
144  apply_defaults(visitor, entry.second, param);
145  }
146  } // namespace defaults
147 } // namespace ariles2
148 
149 
150 
151 namespace ariles2
152 {
153  namespace process
154  {
155  template <class t_Visitor, typename t_First, typename t_Second>
157  const t_Visitor &visitor,
158  std::pair<t_First, t_Second> &entry,
159  const typename t_Visitor::Parameters &param)
160  {
161  ARILES2_TRACE_FUNCTION;
162  apply_process(visitor, entry.first, param);
163  apply_process(visitor, entry.second, param);
164  }
165  } // namespace process
166 } // namespace ariles2
167 
168 
169 namespace ariles2
170 {
171  namespace copyfrom
172  {
173  template <
174  class t_Visitor,
175  typename t_FirstLeft,
176  typename t_SecondLeft,
177  typename t_FirstRight,
178  typename t_SecondRight>
180  t_Visitor &visitor,
181  std::pair<t_FirstLeft, t_SecondLeft> &left,
182  const std::pair<t_FirstRight, t_SecondRight> &right,
183  const typename t_Visitor::Parameters &param)
184  {
185  ARILES2_TRACE_FUNCTION;
186 
187  apply_copyfrom(visitor, left.first, right.first, param);
188  apply_copyfrom(visitor, left.second, right.second, param);
189  }
190  } // namespace copyfrom
191 
192  namespace copyto
193  {
194  template <
195  class t_Visitor,
196  typename t_FirstLeft,
197  typename t_SecondLeft,
198  typename t_FirstRight,
199  typename t_SecondRight>
201  t_Visitor &visitor,
202  const std::pair<t_FirstLeft, t_SecondLeft> &left,
203  std::pair<t_FirstRight, t_SecondRight> &right,
204  const typename t_Visitor::Parameters &param)
205  {
206  ARILES2_TRACE_FUNCTION;
207 
208  apply_copyto(visitor, left.first, right.first, param);
209  apply_copyto(visitor, left.second, right.second, param);
210  }
211  } // namespace copyto
212 } // namespace ariles2
ariles2::copyfrom::apply_copyfrom
void ARILES2_VISIBILITY_ATTRIBUTE apply_copyfrom(t_Visitor &visitor, t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:323
ariles2
Definition: basic.h:16
ariles2::write::apply_write
void ARILES2_VISIBILITY_ATTRIBUTE 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:85
ariles2::process::apply_process
void ARILES2_VISIBILITY_ATTRIBUTE apply_process(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Entry))
Definition: basic.h:293
t_Visitor
ariles2::compare::apply_compare
void ARILES2_VISIBILITY_ATTRIBUTE apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:146
ARILES2_VISIBILITY_ATTRIBUTE
#define ARILES2_VISIBILITY_ATTRIBUTE
Definition: helpers.h:138
ariles2::read::apply_read
void ARILES2_VISIBILITY_ATTRIBUTE 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
ariles2::copyto::apply_copyto
void ARILES2_VISIBILITY_ATTRIBUTE apply_copyto(t_Visitor &visitor, const t_Left &left, t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:369
ariles2::defaults::apply_defaults
void ARILES2_VISIBILITY_ATTRIBUTE 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:237