Ariles
generic_pointer.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 namespace ariles2
12 {
13  namespace read
14  {
15  template <class t_Visitor, typename t_Entry>
17  t_Visitor &reader,
18  ARILES2_POINTER_TYPE<t_Entry> &entry,
19  const typename t_Visitor::Parameters &parameters)
20  {
21  ARILES2_TRACE_FUNCTION;
22  const bool is_null = reader.startPointer(parameters);
23  if (true == is_null)
24  {
25  PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::reset(entry);
26  }
27  else
28  {
29  PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::allocate(entry);
30  apply_read(reader, *entry, parameters);
31  }
32  reader.endPointer(is_null);
33  }
34  } // namespace read
35 } // namespace ariles2
36 
37 
38 namespace ariles2
39 {
40  namespace write
41  {
42  template <class t_Visitor, typename t_Entry>
44  t_Visitor &writer,
45  const ARILES2_POINTER_TYPE<t_Entry> &entry,
46  const typename t_Visitor::Parameters &param)
47  {
48  ARILES2_TRACE_FUNCTION;
49 
50  const bool is_null = PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::isNull(entry);
51 
52  writer.startPointer(is_null, param);
53  if (false == is_null)
54  {
55  apply_write(writer, *entry, param);
56  }
57  writer.endPointer(is_null);
58  }
59  } // namespace write
60 } // namespace ariles2
61 
62 
63 namespace ariles2
64 {
65  namespace compare
66  {
67  template <class t_Visitor, typename t_Entry>
69  t_Visitor &visitor,
70  const ARILES2_POINTER_TYPE<t_Entry> &left,
71  const ARILES2_POINTER_TYPE<t_Entry> &right,
72  const typename t_Visitor::Parameters &param)
73  {
74  ARILES2_TRACE_FUNCTION;
75  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::isNull(left))
76  {
77  if (false == PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::isNull(right))
78  {
79  visitor.equal_ = false;
80  }
81  }
82  else
83  {
84  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::isNull(right))
85  {
86  visitor.equal_ = false;
87  }
88  else
89  {
90  apply_compare(visitor, *left, *right, param);
91  }
92  }
93  }
94  } // namespace compare
95 } // namespace ariles2
96 
97 
98 namespace ariles2
99 {
100  namespace defaults
101  {
102  template <class t_Visitor, typename t_Entry>
104  const t_Visitor & /*visitor*/,
105  ARILES2_POINTER_TYPE<t_Entry> &entry,
106  const typename t_Visitor::Parameters & /*param*/)
107  {
108  ARILES2_TRACE_FUNCTION;
109  PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::reset(entry);
110  }
111  } // namespace defaults
112 } // namespace ariles2
113 
114 
115 namespace ariles2
116 {
117  namespace process
118  {
119  template <class t_Visitor, typename t_Entry>
121  const t_Visitor &visitor,
122  ARILES2_POINTER_TYPE<t_Entry> &entry,
123  const typename t_Visitor::Parameters &param)
124  {
125  ARILES2_TRACE_FUNCTION;
126  if (false == (PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::isNull(entry)))
127  {
128  apply_process(visitor, *entry, param);
129  }
130  }
131  } // namespace process
132 } // namespace ariles2
133 
134 
135 namespace ariles2
136 {
137  namespace copyfrom
138  {
139  template <class t_Visitor, typename t_Entry>
141  t_Visitor &visitor,
142  ARILES2_POINTER_TYPE<t_Entry> &left,
143  const ARILES2_POINTER_TYPE<t_Entry> &right,
144  const typename t_Visitor::Parameters &param)
145  {
146  ARILES2_TRACE_FUNCTION;
147  if (true == param.deep_copy_)
148  {
149  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::isNull(right))
150  {
151  PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::reset(left);
152  }
153  else
154  {
155  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::isNull(left))
156  {
157  PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::allocate(left);
158  }
159 
160  apply_copyfrom(visitor, *left, *right, param);
161  }
162  }
163  else
164  {
165  left = right;
166  }
167  }
168 
169  template <class t_Visitor, typename t_Left, typename t_Right>
171  t_Visitor &visitor,
172  ARILES2_POINTER_TYPE<t_Left> &left,
173  const ARILES2_POINTER_TYPE<t_Right> &right,
174  const typename t_Visitor::Parameters &param)
175  {
176  ARILES2_TRACE_FUNCTION;
177  if (true == param.deep_copy_)
178  {
179  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Right> >::isNull(right))
180  {
181  PointerHandler<ARILES2_POINTER_TYPE<t_Left> >::reset(left);
182  }
183  else
184  {
185  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Left> >::isNull(left))
186  {
187  PointerHandler<ARILES2_POINTER_TYPE<t_Left> >::allocate(left);
188  }
189 
190  apply_copyfrom(visitor, *left, *right, param);
191  }
192  }
193  else
194  {
195  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Right> >::isNull(right))
196  {
197  PointerHandler<ARILES2_POINTER_TYPE<t_Left> >::reset(left);
198  }
199  else
200  {
201  ARILES2_THROW("Shallow copies of pointers of different types are not supported.");
202  }
203  }
204  }
205  } // namespace copyfrom
206 
207 
208  namespace copyto
209  {
210  template <class t_Visitor, typename t_Entry>
212  t_Visitor &visitor,
213  const ARILES2_POINTER_TYPE<t_Entry> &left,
214  ARILES2_POINTER_TYPE<t_Entry> &right,
215  const typename t_Visitor::Parameters &param)
216  {
217  ARILES2_TRACE_FUNCTION;
218  if (true == param.deep_copy_)
219  {
220  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::isNull(left))
221  {
222  PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::reset(right);
223  }
224  else
225  {
226  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::isNull(right))
227  {
228  PointerHandler<ARILES2_POINTER_TYPE<t_Entry> >::allocate(right);
229  }
230 
231  apply_copyto(visitor, *left, *right, param);
232  }
233  }
234  else
235  {
236  right = left;
237  }
238  }
239 
240  template <class t_Visitor, typename t_Left, typename t_Right>
242  t_Visitor &visitor,
243  const ARILES2_POINTER_TYPE<t_Left> &left,
244  ARILES2_POINTER_TYPE<t_Right> &right,
245  const typename t_Visitor::Parameters &param)
246  {
247  ARILES2_TRACE_FUNCTION;
248  if (true == param.deep_copy_)
249  {
250  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Left> >::isNull(left))
251  {
252  PointerHandler<ARILES2_POINTER_TYPE<t_Right> >::reset(right);
253  }
254  else
255  {
256  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Right> >::isNull(right))
257  {
258  PointerHandler<ARILES2_POINTER_TYPE<t_Right> >::allocate(right);
259  }
260 
261  apply_copyto(visitor, *left, *right, param);
262  }
263  }
264  else
265  {
266  if (true == PointerHandler<ARILES2_POINTER_TYPE<t_Left> >::isNull(left))
267  {
268  PointerHandler<ARILES2_POINTER_TYPE<t_Right> >::reset(right);
269  }
270  else
271  {
272  ARILES2_THROW("Shallow copies of pointers of different types are not supported.");
273  }
274  }
275  }
276  } // namespace copyto
277 } // namespace ariles2
278 
279 #undef ARILES2_POINTER_HANDLER
280 #undef ARILES2_POINTER_TYPE
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
ariles2::PointerHandler
class ARILES2_VISIBILITY_ATTRIBUTE PointerHandler
Definition: helpers.h:150
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