Ariles
Loading...
Searching...
No Matches
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
21namespace ariles2
22{
23 /// @ingroup copyto
24 namespace copyto
25 {
27 {
28 public:
30
31 public:
32 explicit Parameters(const bool override_parameters = true) : visitor::Parameters(override_parameters)
33 {
34 deep_copy_ = true;
35 }
36 };
37
38
39 class Visitor : public visitor::Base<Visitor, copyto::Parameters>
40 {
41 public:
43
44
45 public:
46 template <class t_Left, class t_Right>
47 void visit(const t_Left &left, t_Right &right, const std::string &name, const Parameters &param)
48 {
50 try
51 {
52 this->visitMapEntry(left, right, name, param);
53 }
54 catch (std::exception &e)
55 {
56 CPPUT_THROW("Copying failed: ", e.what());
57 }
58 }
59
60
61 template <class t_Left, class t_Right>
62 void visitMapEntry(const t_Left &left, t_Right &right, const std::string &name, const Parameters &param)
63 {
66 CPPUT_TRACE_TYPE(left);
67 CPPUT_TRACE_TYPE(right);
68
69 try
70 {
71 apply_copyto(*this, left, right, param);
72 }
73 catch (const std::exception &e)
74 {
75 CPPUT_THROW("entry: ", name, " // ", std::string(e.what()));
76 }
77 }
78 };
79
80
81 class Base
82 {
83 };
84
85
86#define ARILES2_NAMED_ENTRY_copyto(v, entry, name) visitor.visitMapEntry(entry, other.name, #name, parameters);
87#define ARILES2_PARENT_copyto(v, entry) entry::arilesVisit(visitor, other, parameters);
88
89#define ARILES2_VISIT_copyto \
90 template <class t_Other> /* cppcheck-suppress duplInheritedMember */ \
91 void arilesVisit( \
92 ariles2::copyto::Visitor &visitor, \
93 t_Other &other, \
94 const typename ariles2::copyto::Visitor::Parameters &parameters) const \
95 { \
96 CPPUT_UNUSED_ARG(visitor); \
97 CPPUT_UNUSED_ARG(other); \
98 CPPUT_UNUSED_ARG(parameters); \
99 CPPUT_TRACE_FUNCTION; \
100 ARILES2_ENTRIES(copyto) \
101 }
102
103#define ARILES2_METHODS_copyto \
104 const ariles2::copyto::Visitor::Parameters &arilesGetParameters(const ariles2::copyto::Visitor &visitor) const \
105 { \
106 CPPUT_TRACE_FUNCTION; \
107 return (visitor.getDefaultParameters()); \
108 }
109#define ARILES2_BASE_METHODS_copyto
110 } // namespace copyto
111
112
113 /// @ingroup copyto
115} // namespace ariles2
Parameters(const bool override_parameters=true)
Definition copyto.h:32
void visitMapEntry(const t_Left &left, t_Right &right, const std::string &name, const Parameters &param)
Definition copyto.h:62
void visit(const t_Left &left, t_Right &right, const std::string &name, const Parameters &param)
Definition copyto.h:47
#define CPPUT_THROW(...)
Definition exception.h:19
void apply_copyto(t_Visitor &visitor, const t_Left &left, t_Right &right, const typename t_Visitor::Parameters &param)
Definition basic.h:353
#define CPPUT_TRACE_FUNCTION
Definition trace.h:126
#define CPPUT_TRACE_TYPE(type)
Definition trace.h:128
#define CPPUT_TRACE_VALUE(value)
Definition trace.h:127