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>
22  void apply_read(
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>
36  void apply_read(
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 
61 namespace 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 
110 namespace 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 
131 namespace 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 
150 namespace 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 
168 namespace 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
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
#define CPPUT_TRACE_FUNCTION
Definition: trace.h:126