Dune Core Modules (2.9.0)

simpletransformationdescriptors.hh
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3
4#ifndef DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
5#define DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
6
7#include <array>
8#include <memory>
9
10#include <dune/typetree/nodeinterface.hh>
11#include <dune/typetree/nodetags.hh>
13
14
15namespace Dune {
16 namespace TypeTree {
17
23 template<typename SourceNode, typename Transformation, typename TransformedNode>
24 struct SimpleLeafNodeTransformation
25 {
26
27 static const bool recursive = false;
28
29 typedef TransformedNode transformed_type;
30 typedef std::shared_ptr<transformed_type> transformed_storage_type;
31
32 static transformed_type transform(const SourceNode& s, const Transformation& t)
33 {
34 return transformed_type();
35 }
36
37 static transformed_storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t)
38 {
39 return std::make_shared<transformed_type>();
40 }
41
42 };
43
44
45 template<typename SourceNode, typename Transformation, template<typename Child, std::size_t> class TransformedNode>
46 struct SimplePowerNodeTransformation
47 {
48
49 static const bool recursive = true;
50
51 template<typename TC>
52 struct result
53 {
54 typedef TransformedNode<TC, StaticDegree<SourceNode>::value> type;
55 typedef std::shared_ptr<type> storage_type;
56 static const std::size_t degree = StaticDegree<type>::value;
57 };
58
59 template<typename TC>
60 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
61 {
62 return typename result<TC>::type(children);
63 }
64
65 template<typename TC>
66 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
67 {
68 return std::make_shared<typename result<TC>::type>(children);
69 }
70
71 };
72
73
74 template<typename SourceNode, typename Transformation, template<typename Child> class TransformedNode>
75 struct SimpleDynamicPowerNodeTransformation
76 {
77
78 static const bool recursive = true;
79
80 template<typename TC>
81 struct result
82 {
83 typedef TransformedNode<TC> type;
84 typedef std::shared_ptr<type> storage_type;
85 };
86
87 template<typename TC>
88 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
89 {
90 return typename result<TC>::type(children);
91 }
92
93 template<typename TC>
94 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
95 {
96 return std::make_shared<typename result<TC>::type>(children);
97 }
98
99 };
100
101
102 template<typename SourceNode, typename Transformation, template<typename...> class TransformedNode>
103 struct SimpleCompositeNodeTransformation
104 {
105
106 static const bool recursive = true;
107
108 template<typename... TC>
109 struct result
110 {
111 typedef TransformedNode<TC...> type;
112 typedef std::shared_ptr<type> storage_type;
113 };
114
115 template<typename... TC>
116 static typename result<TC...>::type transform(const SourceNode& s, const Transformation& t, std::shared_ptr<TC>... children)
117 {
118 return typename result<TC...>::type(children...);
119 }
120
121 template<typename... TC>
122 static typename result<TC...>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, std::shared_ptr<TC>... children)
123 {
124 return std::make_shared<typename result<TC...>::type>(children...);
125 }
126
127 };
128
130
131 } // namespace TypeTree
132} //namespace Dune
133
134#endif // DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
A few common exception classes.
std::size_t degree(const Node &node)
Returns the degree of node as run time information.
Definition: nodeinterface.hh:85
Dune namespace.
Definition: alignedallocator.hh:13
std::vector< decltype(std::declval< Op >()(std::declval< T >())) > transform(const std::vector< T > &in, Op op)
copy a vector, performing an operation on each element
Definition: misc.hh:24
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)