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 "../visitors/serialization.h"
15 
16 namespace ariles
17 {
18  namespace read
19  {
20  template <class t_Visitor, typename t_First, typename t_Second>
22  t_Visitor &visitor,
23  std::pair<t_First, t_Second> &entry,
24  const typename t_Visitor::Parameters &parameters)
25  {
27  visitor.template startMap<t_Visitor::SIZE_LIMIT_EQUAL>(2);
28 
29  ariles::ConfigurableFlags param = parameters;
31 
32  visitor(entry.first, "first", param);
33  visitor(entry.second, "second", param);
34  visitor.endMap();
35  }
36 
37 
38  template <class t_Visitor, typename t_Second>
40  t_Visitor &visitor,
41  std::pair<std::string, t_Second> &entry,
42  const typename t_Visitor::Parameters &parameters)
43  {
45  if (visitor.getSerializationFeatures().isSet(serialization::Features::SLOPPY_PAIRS_SUPPORTED)
46  && parameters.isSet(t_Visitor::Parameters::SLOPPY_PAIRS_IF_SUPPORTED))
47  {
48  std::vector<std::string> entry_names;
49  ARILES_ASSERT(true == visitor.getMapEntryNames(entry_names), "Could not read names of map entries.");
50  if (1 == entry_names.size())
51  {
52  ariles::ConfigurableFlags param = parameters;
53  // if entry is in the map, we should be able to read it
55 
56  visitor.template startMap<t_Visitor::SIZE_LIMIT_EQUAL>(1);
57 
58  if (true == visitor(entry.second, entry_names[0], param))
59  {
60  entry.first = entry_names[0];
61  }
62 
63  visitor.endMap();
64  }
65  else
66  {
67  // size = 0 is ok if missing entries are allowed.
68  // size > 1 is never ok, due to ambiguity.
69  ARILES_ASSERT(
70  0 == entry_names.size()
71  and true == parameters.isSet(t_Visitor::Parameters::ALLOW_MISSING_ENTRIES),
72  "Wrong number of pair entries for a sloppy pair.");
73  }
74  }
75  else
76  {
77  apply_read<t_Visitor, std::string, t_Second>(visitor, entry, parameters);
78  }
79  }
80  } // namespace read
81 } // namespace ariles
82 
83 
84 namespace ariles
85 {
86  namespace write
87  {
88  template <class t_Visitor, typename t_First, typename t_Second>
90  t_Visitor &writer,
91  const std::pair<t_First, t_Second> &entry,
92  const typename t_Visitor::Parameters &param)
93  {
95  writer.startMap(2);
96  writer(entry.first, "first", param);
97  writer(entry.second, "second", param);
98  writer.endMap();
99  }
100 
101 
102 
103  template <class t_Visitor, typename t_Second>
105  t_Visitor &writer,
106  const std::pair<std::string, t_Second> &entry,
107  const typename t_Visitor::Parameters &param)
108  {
110  if (writer.getSerializationFeatures().isSet(serialization::Features::SLOPPY_PAIRS_SUPPORTED)
111  && param.isSet(t_Visitor::Parameters::SLOPPY_PAIRS_IF_SUPPORTED))
112  {
113  writer.startMap(1);
114  writer(entry.second, entry.first, param);
115  writer.endMap();
116  }
117  else
118  {
119  // ? Gets mixed up with vector and fails.
120  // apply<t_Visitor, std::string, t_Second>(writer, entry, param);
121  writer.startMap(2);
122  writer(entry.first, "first", param);
123  writer(entry.second, "second", param);
124  writer.endMap();
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_First, typename t_Second>
137  t_Visitor &visitor,
138  const std::pair<t_First, t_Second> &left,
139  const std::pair<t_First, t_Second> &right,
140  const typename t_Visitor::Parameters &param)
141  {
143 
144  apply_compare(visitor, left.first, right.first, param);
145  apply_compare(visitor, left.second, right.second, param);
146  }
147  } // namespace compare
148 } // namespace ariles
149 
150 
151 
152 namespace ariles
153 {
154  namespace defaults
155  {
156  template <class t_Visitor, typename t_First, typename t_Second>
158  const t_Visitor &visitor,
159  std::pair<t_First, t_Second> &entry,
160  const typename t_Visitor::Parameters &param)
161  {
163  apply_defaults(visitor, entry.first, param);
164  apply_defaults(visitor, entry.second, param);
165  }
166  } // namespace defaults
167 } // namespace ariles
168 
169 
170 
171 namespace ariles
172 {
173  namespace process
174  {
175  template <class t_Visitor, typename t_First, typename t_Second>
177  const t_Visitor &visitor,
178  std::pair<t_First, t_Second> &entry,
179  const typename t_Visitor::Parameters &param)
180  {
182  apply_process(visitor, entry.first, param);
183  apply_process(visitor, entry.second, param);
184  }
185  } // namespace process
186 } // 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