Ariles
copyto.h
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2017-2020 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 "common.h"
14 
15 /**
16 @defgroup copyto CopyTo
17 
18 @brief Copy data to non-ariles classes.
19 */
20 
21 namespace ariles2
22 {
23  /// @ingroup copyto
24  namespace copyto
25  {
27  {
28  public:
29  bool deep_copy_;
30 
31  public:
32  Parameters(const bool override_parameters = true) : visitor::Parameters(override_parameters)
33  {
34  deep_copy_ = true;
35  }
36  };
37 
38 
39  class ARILES2_VISIBILITY_ATTRIBUTE Visitor : public visitor::Base<visitor::Visitor, copyto::Parameters>
40  {
41  public:
43 
44 
45  public:
47 
48  template <class t_Ariles>
49  const Parameters &getParameters(const t_Ariles &ariles_class) const
50  {
51  return (ariles_class.arilesGetParameters(*this));
52  }
53 
54 
55  template <class t_Left, class t_Right>
56  void visit(const t_Left &left, t_Right &right, const std::string &name, const Parameters &param)
57  {
58  ARILES2_TRACE_FUNCTION;
59  try
60  {
61  this->visitMapEntry(left, right, name, param);
62  }
63  catch (std::exception &e)
64  {
65  ARILES2_THROW(std::string("Copying failed: ") + e.what());
66  }
67  }
68 
69 
70  template <class t_Left, class t_Right>
71  void visitMapEntry(const t_Left &left, t_Right &right, const std::string &name, const Parameters &param)
72  {
73  ARILES2_TRACE_FUNCTION;
74  ARILES2_TRACE_VALUE(name);
75  ARILES2_TRACE_TYPE(left);
76  ARILES2_TRACE_TYPE(right);
77 
78  try
79  {
80  apply_copyto(*this, left, right, param);
81  }
82  catch (const std::exception &e)
83  {
84  ARILES2_THROW("entry: " + name + " // " + std::string(e.what()));
85  }
86  }
87  };
88 
89 
91  {
92  };
93 
94 
95 #define ARILES2_NAMED_ENTRY_copyto(v, entry, name) visitor.visitMapEntry(entry, other.name, #name, parameters);
96 #define ARILES2_PARENT_copyto(v, entry) entry::arilesVisit(visitor, other, parameters);
97 
98 #define ARILES2_VISIT_copyto \
99  template <class t_Other> \
100  void arilesVisit( \
101  ariles2::copyto::Visitor &visitor, \
102  t_Other &other, \
103  const typename ariles2::copyto::Visitor::Parameters &parameters) const \
104  { \
105  ARILES2_UNUSED_ARG(visitor); \
106  ARILES2_UNUSED_ARG(other); \
107  ARILES2_UNUSED_ARG(parameters); \
108  ARILES2_TRACE_FUNCTION; \
109  ARILES2_ENTRIES(copyto) \
110  }
111 
112 #define ARILES2_METHODS_copyto \
113  const ariles2::copyto::Visitor::Parameters &arilesGetParameters(const ariles2::copyto::Visitor &visitor) const \
114  { \
115  ARILES2_TRACE_FUNCTION; \
116  return (visitor.getDefaultParameters()); \
117  }
118 #define ARILES2_BASE_METHODS_copyto
119  } // namespace copyto
120 
121 
122  /// @ingroup copyto
124 } // namespace ariles2
ariles2
Definition: basic.h:16
ariles2::visitor::Base
Definition: common.h:50
ariles2::copyto::Parameters::deep_copy_
bool deep_copy_
Definition: copyto.h:29
ariles2::copyto::Parameters
Definition: copyto.h:26
ariles2::copyto::Visitor::getParameters
const Parameters & getParameters(const t_Ariles &ariles_class) const
Definition: copyto.h:49
ariles2::copyto::Visitor::visitMapEntry
void visitMapEntry(const t_Left &left, t_Right &right, const std::string &name, const Parameters &param)
Definition: copyto.h:71
common.h
ariles2::copyto::Parameters::Parameters
Parameters(const bool override_parameters=true)
Definition: copyto.h:32
ariles2::copyto::Visitor::visit
void visit(const t_Left &left, t_Right &right, const std::string &name, const Parameters &param)
Definition: copyto.h:56
ARILES2_VISIBILITY_ATTRIBUTE
#define ARILES2_VISIBILITY_ATTRIBUTE
Definition: helpers.h:138
ariles2::visitor::Parameters
Definition: common.h:20
ariles2::copyto::Visitor::Parameters
copyto::Parameters Parameters
Definition: copyto.h:42
ariles2::CopyTo
copyto::Visitor CopyTo
Definition: copyto.h:123
ariles2::copyto::Base
Definition: copyto.h:90
ariles2::copyto::Visitor
Definition: copyto.h:39
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