Ariles
std_vector.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 <vector>
14 #include "../internal/helpers.h"
15 
16 
17 namespace ariles2
18 {
19  template <class... t_Args>
20  bool isMissing(const std::vector<t_Args...> &entry)
21  {
22  return (entry.empty());
23  }
24 } // namespace ariles2
25 
26 
27 namespace ariles2
28 {
29  namespace read
30  {
31  template <class t_Visitor, class... t_Args>
32  void apply_read(t_Visitor &visitor, std::vector<t_Args...> &entry, const typename t_Visitor::Parameters &param)
33  {
35  entry.resize(visitor.startArray());
36  for (typename std::vector<t_Args...>::value_type &value : entry)
37  {
38  visitor.visitArrayElement(value, param);
39  }
40  visitor.endArray();
41  }
42 
43  template <class t_Visitor, class... t_Args>
44  void apply_read(
45  t_Visitor &visitor,
46  std::vector<bool, t_Args...> &entry,
47  const typename t_Visitor::Parameters &param)
48  {
50  entry.resize(visitor.startArray());
51  for (std::size_t i = 0; i < entry.size(); ++i)
52  {
53  bool value;
54  visitor.visitArrayElement(value, param);
55  entry[i] = value;
56  }
57  visitor.endArray();
58  }
59  } // namespace read
60 } // namespace ariles2
61 
62 
63 namespace ariles2
64 {
65  namespace write
66  {
67  template <class t_Visitor, class... t_Args>
69  t_Visitor &writer,
70  const std::vector<t_Args...> &entry,
71  const typename t_Visitor::Parameters &param)
72  {
74  writer.startArray(entry.size(), param.compact_arrays_);
75  for (const typename std::vector<t_Args...>::value_type &value : entry)
76  {
77  writer.visitArrayElement(value, param);
78  }
79  writer.endArray();
80  }
81  } // namespace write
82 } // namespace ariles2
83 
84 
85 namespace ariles2
86 {
87  namespace compare
88  {
89  template <class t_Visitor, class... t_Args>
91  t_Visitor &visitor,
92  const std::vector<t_Args...> &left,
93  const std::vector<t_Args...> &right,
94  const typename t_Visitor::Parameters &param)
95  {
97 
98  visitor.equal_ &= (left.size() == right.size());
99 
100  for (std::size_t i = 0; i < left.size() and visitor.equal_; ++i)
101  {
102  apply_compare(visitor, left[i], right[i], param);
103  }
104  }
105  } // namespace compare
106 } // namespace ariles2
107 
108 
109 namespace ariles2
110 {
111  namespace defaults
112  {
113  template <class t_Visitor, class... t_Args>
115  const t_Visitor & /*visitor*/,
116  std::vector<t_Args...> &entry,
117  const typename t_Visitor::Parameters & /*param*/)
118  {
120  entry.clear();
121  }
122  } // namespace defaults
123 } // namespace ariles2
124 
125 
126 
127 namespace ariles2
128 {
129  namespace process
130  {
131  template <class t_Visitor, class... t_Args>
133  const t_Visitor &visitor,
134  std::vector<t_Args...> &entry,
135  const typename t_Visitor::Parameters &param)
136  {
138  for (typename std::vector<t_Args...>::value_type &value : entry)
139  {
140  apply_process(visitor, value, param);
141  }
142  }
143 
144  template <class t_Visitor, class... t_Args>
146  const t_Visitor &visitor,
147  std::vector<bool, t_Args...> &entry,
148  const typename t_Visitor::Parameters &param)
149  {
151  for (std::size_t i = 0; i < entry.size(); ++i)
152  {
153  bool value = entry[i];
154  apply_process(visitor, value, param);
155  entry[i] = value;
156  }
157  }
158  } // namespace process
159 } // namespace ariles2
160 
161 
162 namespace ariles2
163 {
164  namespace copyfrom
165  {
166  template <class t_Visitor, class... t_LeftArgs, class... t_RightArgs>
168  t_Visitor &visitor,
169  std::vector<t_LeftArgs...> &left,
170  const std::vector<t_RightArgs...> &right,
171  const typename t_Visitor::Parameters &param)
172  {
174 
175  left.clear();
176  left.reserve(right.size());
177  for (const typename std::vector<t_RightArgs...>::value_type &right_value : right)
178  {
179  typename std::vector<t_LeftArgs...>::value_type left_value;
180  apply_copyfrom(visitor, left_value, right_value, param);
181  left.push_back(std::move(left_value));
182  }
183  }
184  } // namespace copyfrom
185 
186 
187  namespace copyto
188  {
189  template <class t_Visitor, class... t_LeftArgs, class... t_RightArgs>
191  t_Visitor &visitor,
192  const std::vector<t_LeftArgs...> &left,
193  std::vector<t_RightArgs...> &right,
194  const typename t_Visitor::Parameters &param)
195  {
197 
198  right.clear();
199  right.reserve(left.size());
200  for (const typename std::vector<t_LeftArgs...>::value_type &left_value : left)
201  {
202  typename std::vector<t_RightArgs...>::value_type right_value;
203  apply_copyto(visitor, left_value, right_value, param);
204  right.push_back(std::move(right_value));
205  }
206  }
207  } // namespace copyto
208 } // 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
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
bool isMissing(const ARILES2_POINTER_TYPE< t_Entry > &entry)
#define CPPUT_TRACE_FUNCTION
Definition: trace.h:126