│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -
6#ifndef DUNE_TYPETREE_PROXYNODE_HH
│ │ │ │ -
7#define DUNE_TYPETREE_PROXYNODE_HH
│ │ │ │ +
6#ifndef DUNE_TYPETREE_TRANSFORMATION_HH
│ │ │ │ +
7#define DUNE_TYPETREE_TRANSFORMATION_HH
│ │ │ │
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
12#include <dune/common/shared_ptr.hh>
│ │ │ │ -
13#include <dune/common/indices.hh>
│ │ │ │ -
14#include <dune/common/std/type_traits.hh>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
24 template<
typename Node>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
28 template<
typename ProxiedNode>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
32 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<ProxiedNode>::type>::value;
│ │ │ │ -
│ │ │ │ -
34 template<std::
size_t k>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
37 static const bool value = !proxiedNodeIsConst;
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
42 template<
bool enabled = !proxiedNodeIsConst>
│ │ │ │ -
43 typename std::enable_if<enabled,Node&>::type
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
46 return static_cast<Node&
>(*this);
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
49 const Node& node ()
const
│ │ │ │ -
│ │ │ │ -
51 return static_cast<const Node&
>(*this);
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
14#include <dune/common/hybridutilities.hh>
│ │ │ │ +
15#include <dune/common/exceptions.hh>
│ │ │ │ +
16#include <dune/common/typetraits.hh>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
53 template<
typename SourceNode,
typename Transformation,
typename Tag>
│ │ │ │ +
│ │ │ │
│ │ │ │ -
57 template<std::
size_t k>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
59 :
public ProxiedNode::template
Child<k>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
69 template<std::size_t k,
│ │ │ │ -
70 typename std::enable_if<lazy_enabled<k>::value,
int>::type = 0>
│ │ │ │ -
│ │ │ │ -
71 auto&
child (index_constant<k> = {})
│ │ │ │ -
│ │ │ │ -
73 return node().proxiedNode().template child<k>();
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
68 template<
typename S,
typename T,
typename Tag>
│ │ │ │ +
69 struct LookupNodeTransformation
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ -
80 template<std::
size_t k>
│ │ │ │ -
│ │ │ │ -
81 const auto&
child (index_constant<k> = {})
const
│ │ │ │ -
│ │ │ │ -
83 return node().proxiedNode().template child<k>();
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
78 static_assert((!std::is_same<type,void>::value),
"Unable to find valid transformation descriptor");
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ -
│ │ │ │ -
90 template<std::size_t k,
│ │ │ │ -
91 typename std::enable_if<lazy_enabled<k>::value,
int>::type = 0>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
94 return node().proxiedNode().template childStorage<k>();
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
104 template<std::
size_t k>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
107 return node().proxiedNode().template childStorage<k>();
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
94 template<
typename SourceTree,
typename Transformation,
typename Tag = StartTag,
bool recursive = true>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
100 typedef typename LookupNodeTransformation<SourceTree,Transformation,typename SourceTree::ImplementationTag>::type NodeTransformation;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ -
111 template<std::
size_t k,
class ProxyChild>
│ │ │ │ -
│ │ │ │ -
112 void setChild (ProxyChild&&
child,
typename std::enable_if<lazy_enabled<k>::value,
void*>::type = 0)
│ │ │ │ -
│ │ │ │ -
114 node().proxiedNode().template setChild<k>(std::forward<ProxyChild>(
child));
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
119 return node().proxiedNode().nodeStorage();
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
130 template<
typename ProxiedNode>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
137 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<ProxiedNode>::type>::value;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
116 static transformed_type
transform(
const SourceTree& s,
const Transformation& t = Transformation())
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
122 static transformed_type
transform(
const SourceTree& s, Transformation& t)
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
128 static transformed_type
transform(std::shared_ptr<const SourceTree> sp,
const Transformation& t = Transformation())
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
134 static transformed_type
transform(std::shared_ptr<const SourceTree> sp, Transformation& t)
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ -
139 template<
bool enabled = !proxiedNodeIsConst>
│ │ │ │ -
140 typename std::enable_if<enabled,Node&>::type
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
141 static transformed_storage_type
transform_storage(std::shared_ptr<const SourceTree> sp,
const Transformation& t = Transformation())
│ │ │ │
│ │ │ │ -
143 return static_cast<Node&
>(*this);
│ │ │ │ +
│ │ │ │
│ │ │ │ +
│ │ │ │
│ │ │ │ -
146 const Node& node ()
const
│ │ │ │ -
│ │ │ │ -
148 return static_cast<const Node&
>(*this);
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
148 static transformed_storage_type
transform_storage(std::shared_ptr<const SourceTree> sp, Transformation& t)
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ +
│ │ │ │
│ │ │ │ -
160 template<
bool enabled = !proxiedNodeIsConst,
│ │ │ │ -
161 typename std::enable_if<enabled, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
164 return node().proxiedNode().child(i);
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
171 const auto&
child (std::size_t i)
const
│ │ │ │ -
│ │ │ │ -
173 return node().proxiedNode().child(i);
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
180 template<
bool enabled = !proxiedNodeIsConst,
│ │ │ │ -
181 typename std::enable_if<enabled, int>::type = 0>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
184 return node().proxiedNode().childStorage(i);
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
196 return node().proxiedNode().childStorage(i);
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
200 template<
class ProxyChild,
bool enabled = !proxiedNodeIsConst>
│ │ │ │ -
│ │ │ │ -
201 void setChild (std::size_t i, ProxyChild&&
child,
typename std::enable_if<enabled,void*>::type = 0)
│ │ │ │ -
│ │ │ │ -
203 node().proxiedNode().setChild(i, std::forward<ProxyChild>(
child));
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
209 template<
typename Node,
typename NodeTag>
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
159 template<
typename S,
typename T,
bool recursive>
│ │ │ │ +
160 struct TransformTree<S,T,LeafNodeTag,recursive>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
163 typedef typename LookupNodeTransformation<S,T,ImplementationTag<S>>
::type NodeTransformation;
│ │ │ │ +
│ │ │ │ +
165 typedef typename NodeTransformation::transformed_type transformed_type;
│ │ │ │ +
166 typedef typename NodeTransformation::transformed_storage_type transformed_storage_type;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
169 static transformed_type
transform(
const S& s, T& t)
│ │ │ │ +
│ │ │ │ +
171 return NodeTransformation::transform(s,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
175 static transformed_type
transform(
const S& s,
const T& t)
│ │ │ │ +
│ │ │ │ +
177 return NodeTransformation::transform(s,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
181 static transformed_type
transform(std::shared_ptr<const S> sp, T& t)
│ │ │ │ +
│ │ │ │ +
183 return NodeTransformation::transform(sp,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
187 static transformed_type
transform(std::shared_ptr<const S> sp,
const T& t)
│ │ │ │ +
│ │ │ │ +
189 return NodeTransformation::transform(sp,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
192 static transformed_storage_type
transform_storage(std::shared_ptr<const S> sp, T& t)
│ │ │ │ +
│ │ │ │ +
194 return NodeTransformation::transform_storage(sp,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
197 static transformed_storage_type
transform_storage(std::shared_ptr<const S> sp,
const T& t)
│ │ │ │ +
│ │ │ │ +
199 return NodeTransformation::transform_storage(sp,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
206 template<
typename S,
typename T>
│ │ │ │ +
207 struct TransformTreeNonRecursive
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
210 typedef typename LookupNodeTransformation<S,T,ImplementationTag<S>>::type NodeTransformation;
│ │ │ │
│ │ │ │ -
213 template<
typename Node>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
219 template<
typename Node>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
212 typedef typename NodeTransformation::transformed_type transformed_type;
│ │ │ │ +
213 typedef typename NodeTransformation::transformed_storage_type transformed_storage_type;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
216 static transformed_type transform(
const S& s, T& t)
│ │ │ │ +
│ │ │ │ +
218 return NodeTransformation::transform(s,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
222 static transformed_type transform(
const S& s,
const T& t)
│ │ │ │ +
│ │ │ │ +
224 return NodeTransformation::transform(s,t);
│ │ │ │ +
│ │ │ │
│ │ │ │ -
228 template<
typename Node>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
237 template<
typename Node>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
252 template<
typename Node>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
256 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<Node>::type>::value;
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
259 using HasStaticDegree = index_constant<N::degree()>;
│ │ │ │ +
│ │ │ │ +
228 static transformed_type transform(std::shared_ptr<const S> sp, T& t)
│ │ │ │ +
│ │ │ │ +
230 return NodeTransformation::transform(sp,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
234 static transformed_type transform(std::shared_ptr<const S> sp,
const T& t)
│ │ │ │ +
│ │ │ │ +
236 return NodeTransformation::transform(sp,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
239 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, T& t)
│ │ │ │ +
│ │ │ │ +
241 return NodeTransformation::transform_storage(sp,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
244 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp,
const T& t)
│ │ │ │ +
│ │ │ │ +
246 return NodeTransformation::transform_storage(sp,t);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
255 template<
class Source,
class Transformation,
class Tag>
│ │ │ │ +
256 class RecursivePowerTransformTree
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
259 static_assert(std::is_same_v<Tag,PowerNodeTag> or std::is_same_v<Tag,DynamicPowerNodeTag>);
│ │ │ │
│ │ │ │ -
│ │ │ │ -
262 static constexpr bool hasStaticDegree = Std::is_detected<HasStaticDegree, N>::value;
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
261 using ChildType =
typename Source::ChildType;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
264 template<
class NodeStorage>
│ │ │ │ +
265 static auto node_storage_provider(
const std::size_t& degree)
│ │ │ │ +
│ │ │ │ +
267 return std::vector<NodeStorage>(degree);
│ │ │ │ +
│ │ │ │
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
271 template<
class NodeStorage,
class StaticIndex>
│ │ │ │ +
272 static auto node_storage_provider(StaticIndex)
│ │ │ │ +
│ │ │ │ +
274 return std::array<NodeStorage,std::size_t(StaticIndex{})>();
│ │ │ │ +
│ │ │ │
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
283 template <
class N = Node,
│ │ │ │ -
284 std::enable_if_t<hasStaticDegree<N>,
int> = 0>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
290 template <
class N = Node,
│ │ │ │ -
291 std::enable_if_t<not hasStaticDegree<N>,
int> = 0>
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
285 using NodeTransformation =
typename LookupNodeTransformation<Source,Transformation,ImplementationTag<Source>>::type;
│ │ │ │ +
286 using ChildNodeTransformation =
typename LookupNodeTransformation<ChildType,Transformation,ImplementationTag<ChildType>>::type;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
290 using ChildTreeTransformation = TransformTree<ChildType,
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
293 ChildNodeTransformation::recursive>;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
296 using transformed_child_type =
typename ChildTreeTransformation::transformed_type;
│ │ │ │ +
297 using transformed_child_storage_type =
typename ChildTreeTransformation::transformed_storage_type;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
300 using transformed_type =
typename NodeTransformation::template result<transformed_child_type>::type;
│ │ │ │ +
301 using transformed_storage_type =
typename NodeTransformation::template result<transformed_child_type>::storage_type;
│ │ │ │
│ │ │ │ -
304 template<
bool enabled = !proxiedNodeIsConst>
│ │ │ │ -
305 typename std::enable_if<enabled,Node&>::type
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
318 template<
bool enabled = !proxiedNodeIsConst>
│ │ │ │ -
319 typename std::enable_if<enabled,std::shared_ptr<Node> >::type
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
304 static transformed_type transform(
const Source& source, Transformation& transformation)
│ │ │ │ +
│ │ │ │ +
306 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source.degree());
│ │ │ │ +
307 for (std::size_t k = 0; k < source.degree(); ++k) {
│ │ │ │ +
308 children_storage[k] = ChildTreeTransformation::transform_storage(source.childStorage(k),transformation);
│ │ │ │ +
│ │ │ │ +
310 return NodeTransformation::transform(source,transformation,children_storage);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
314 static transformed_type transform(
const Source& source,
const Transformation& transformation)
│ │ │ │ +
│ │ │ │ +
316 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source.degree());
│ │ │ │ +
317 for (std::size_t k = 0; k < source.degree(); ++k) {
│ │ │ │ +
318 children_storage[k] = ChildTreeTransformation::transform_storage(source.childStorage(k),transformation);
│ │ │ │ +
│ │ │ │ +
320 return NodeTransformation::transform(source,transformation,children_storage);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
324 static transformed_type transform(std::shared_ptr<const Source> source_ptr, Transformation& transformation)
│ │ │ │ +
│ │ │ │ +
326 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source_ptr->degree());
│ │ │ │ +
327 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
│ │ │ │ +
328 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
│ │ │ │ +
│ │ │ │ +
330 return NodeTransformation::transform(source_ptr,transformation,children_storage);
│ │ │ │ +
│ │ │ │
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
337 : _node(stackobject_to_shared_ptr(node))
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
341 : _node(std::move(node))
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
348 std::shared_ptr<Node> _node;
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +
│ │ │ │ +
334 static transformed_type transform(std::shared_ptr<const Source> source_ptr,
const Transformation& transformation)
│ │ │ │ +
│ │ │ │ +
336 auto children_storage = node_storage_provider<std::shared_ptr<transformed_child_type>>(source_ptr->degree());
│ │ │ │ +
337 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
│ │ │ │ +
338 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
│ │ │ │ +
│ │ │ │ +
340 return NodeTransformation::transform(source_ptr,transformation,children_storage);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
344 static transformed_storage_type transform_storage(std::shared_ptr<const Source> source_ptr, Transformation& transformation)
│ │ │ │ +
│ │ │ │ +
346 auto children_storage = node_storage_provider<transformed_child_storage_type>(source_ptr->degree());
│ │ │ │ +
347 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
│ │ │ │ +
348 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
│ │ │ │ +
│ │ │ │ +
350 return NodeTransformation::transform_storage(source_ptr,transformation,children_storage);
│ │ │ │ +
│ │ │ │
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
typename std::decay_t< Node >::NodeTag NodeTag
Returns the node tag of the given Node.
Definition nodeinterface.hh:70
│ │ │ │ +
│ │ │ │ +
354 static transformed_storage_type transform_storage(std::shared_ptr<const Source> source_ptr,
const Transformation& transformation)
│ │ │ │ +
│ │ │ │ +
356 auto children_storage = node_storage_provider<transformed_child_storage_type>(source_ptr->degree());
│ │ │ │ +
357 for (std::size_t k = 0; k < source_ptr->degree(); ++k) {
│ │ │ │ +
358 children_storage[k] = ChildTreeTransformation::transform_storage(source_ptr->childStorage(k),transformation);
│ │ │ │ +
│ │ │ │ +
360 return NodeTransformation::transform_storage(source_ptr,transformation,children_storage);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
367 template<
typename Source,
typename Transformation>
│ │ │ │ +
368 struct TransformTree<Source,Transformation,PowerNodeTag,true>
│ │ │ │ +
369 :
public Impl::RecursivePowerTransformTree<Source,Transformation,PowerNodeTag>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
373 template<
typename Source,
typename Transformation>
│ │ │ │ +
374 struct TransformTree<Source,Transformation,DynamicPowerNodeTag,true>
│ │ │ │ +
375 :
public Impl::RecursivePowerTransformTree<Source,Transformation,DynamicPowerNodeTag>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
379 template<
typename S,
typename T>
│ │ │ │ +
380 struct TransformTree<S,T,PowerNodeTag,false>
│ │ │ │ +
381 :
public TransformTreeNonRecursive<S,T>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
385 template<
typename S,
typename T>
│ │ │ │ +
386 struct TransformTree<S,T,DynamicPowerNodeTag,false>
│ │ │ │ +
387 :
public TransformTreeNonRecursive<S,T>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
395 template<
typename S,
typename Children,
typename T>
│ │ │ │ +
396 struct transform_composite_node;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
401 template<
typename S,
typename T,
typename... C>
│ │ │ │ +
402 struct transform_composite_node<S,std::tuple<C...>,T>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
406 typedef ImplementationTag<S> Tag;
│ │ │ │ +
407 typedef typename LookupNodeTransformation<S,T,Tag>::type NodeTransformation;
│ │ │ │ +
408 typedef typename NodeTransformation::template
result<
typename TransformTree<C,
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
411 LookupNodeTransformation<C,T,ImplementationTag<C>>::type::recursive
│ │ │ │ +
412 >::transformed_type...
│ │ │ │ +
413 >::type transformed_type;
│ │ │ │ +
│ │ │ │ +
415 typedef typename NodeTransformation::template
result<
typename TransformTree<C,
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
418 LookupNodeTransformation<C,T,ImplementationTag<C>>::type::recursive
│ │ │ │ +
419 >::transformed_type...
│ │ │ │ +
420 >::storage_type transformed_storage_type;
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
425 template<std::
size_t i>
│ │ │ │ +
426 struct ChildTransformation
│ │ │ │ +
427 :
public TransformTree<typename S::template Child<i>::Type,
│ │ │ │ +
│ │ │ │ +
429 NodeTag<typename S::template Child<i>::Type>,
│ │ │ │ +
430 LookupNodeTransformation<
│ │ │ │ +
431 typename S::template Child<i>::Type,
│ │ │ │ +
│ │ │ │ +
433 ImplementationTag<typename S::template Child<i>::Type>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
438 template<std::
size_t i,
typename Tuple,
typename Value>
│ │ │ │ +
439 static void setElement(Tuple& tuple, Value&& value)
│ │ │ │ +
│ │ │ │ +
441 std::get<i>(tuple) = std::forward<Value>(value);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
444 template<
typename Trafo, std::size_t... i>
│ │ │ │ +
445 static transformed_type transform(
const S& s, Trafo&& t, std::index_sequence<i...> indices)
│ │ │ │ +
│ │ │ │ +
447 std::tuple<typename ChildTransformation<i>::transformed_storage_type...> storage;
│ │ │ │ +
448 Dune::Hybrid::Impl::evaluateFoldExpression<int>({(setElement<i>(storage, ChildTransformation<i>::transform_storage(s.template childStorage<i>(), std::forward<Trafo>(t))),0)...});
│ │ │ │ +
449 return NodeTransformation::transform(s, std::forward<Trafo>(t), std::get<i>(storage)...);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
452 template<
typename Trafo, std::size_t... i>
│ │ │ │ +
453 static transformed_storage_type transform_storage(std::shared_ptr<const S> sp, Trafo&& t, std::index_sequence<i...> indices)
│ │ │ │ +
│ │ │ │ +
455 std::tuple<typename ChildTransformation<i>::transformed_storage_type...> storage;
│ │ │ │ +
456 Dune::Hybrid::Impl::evaluateFoldExpression<int>({(setElement<i>(storage, ChildTransformation<i>::transform_storage(sp->template childStorage<i>(), std::forward<Trafo>(t))),0)...});
│ │ │ │ +
457 return NodeTransformation::transform_storage(sp, std::forward<Trafo>(t), std::get<i>(storage)...);
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
464 template<
typename S,
typename T>
│ │ │ │ +
465 struct TransformTree<S,T,CompositeNodeTag,true>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
470 typedef typename S::ChildTypes ChildTypes;
│ │ │ │ +
│ │ │ │ +
472 static auto child_indices()
│ │ │ │ +
│ │ │ │ +
474 return std::make_index_sequence<S::degree()>();
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
479 typedef typename transform_composite_node<S,ChildTypes,T>::transformed_type transformed_type;
│ │ │ │ +
480 typedef typename transform_composite_node<S,ChildTypes,T>::transformed_storage_type transformed_storage_type;
│ │ │ │ +
│ │ │ │ +
482 static transformed_type
transform(
const S& s, T& t)
│ │ │ │ +
│ │ │ │ +
484 return transform_composite_node<S,ChildTypes,T>::transform(s,t,child_indices());
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
487 static transformed_type
transform(
const S& s,
const T& t)
│ │ │ │ +
│ │ │ │ +
489 return transform_composite_node<S,ChildTypes,T>::transform(s,t,child_indices());
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
492 static transformed_storage_type
transform_storage(std::shared_ptr<const S> sp, T& t)
│ │ │ │ +
│ │ │ │ +
494 return transform_composite_node<S,ChildTypes,T>::transform_storage(sp,t,child_indices());
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
497 static transformed_storage_type
transform_storage(std::shared_ptr<const S> sp,
const T& t)
│ │ │ │ +
│ │ │ │ +
499 return transform_composite_node<S,ChildTypes,T>::transform_storage(sp,t,child_indices());
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
505 template<
typename S,
typename T>
│ │ │ │ +
506 struct TransformTree<S,T,CompositeNodeTag,false>
│ │ │ │ +
507 :
public TransformTreeNonRecursive<S,T>
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
static const result_type result
Definition accumulate_static.hh:113
│ │ │ │ +
void registerNodeTransformation(SourceNode *, Transformation *, Tag *)
Register transformation descriptor to transform SourceNode with Transformation.
│ │ │ │
Definition accumulate_static.hh:16
│ │ │ │ -
Tag designating a leaf node.
Definition nodetags.hh:18
│ │ │ │ -
Tag designating a power node.
Definition nodetags.hh:21
│ │ │ │ -
Tag designating a power node with runtime degree.
Definition nodetags.hh:24
│ │ │ │ -
Tag designating a composite node.
Definition nodetags.hh:27
│ │ │ │ -
Base class for nodes acting as a proxy for an existing node.
Definition proxynode.hh:255
│ │ │ │ -
ProxyNode(Node &node)
Definition proxynode.hh:336
│ │ │ │ -
Dune::TypeTree::NodeTag< Node > NodeTag
Definition proxynode.hh:272
│ │ │ │ -
static const bool isComposite
Mark this class as a composite in the dune-typetree.
Definition proxynode.hh:281
│ │ │ │ -
static const bool isLeaf
Mark this class as non leaf in the dune-typetree.
Definition proxynode.hh:275
│ │ │ │ -
static const bool isPower
Mark this class as a non power in the dune-typetree.
Definition proxynode.hh:278
│ │ │ │ -
auto degree() const
Definition proxynode.hh:292
│ │ │ │ -
std::enable_if< enabled, Node & >::type proxiedNode()
Returns the proxied node.
Definition proxynode.hh:306
│ │ │ │ -
std::shared_ptr< const Node > proxiedNodeStorage() const
Returns the storage of the proxied node (const version).
Definition proxynode.hh:326
│ │ │ │ -
Node ProxiedNode
Definition proxynode.hh:270
│ │ │ │ -
std::enable_if< enabled, std::shared_ptr< Node > >::type proxiedNodeStorage()
Returns the storage of the proxied node.
Definition proxynode.hh:320
│ │ │ │ -
static constexpr auto degree()
Definition proxynode.hh:285
│ │ │ │ -
ProxyNode(std::shared_ptr< Node > node)
Definition proxynode.hh:340
│ │ │ │ -
const Node & proxiedNode() const
Returns the proxied node (const version).
Definition proxynode.hh:312
│ │ │ │ -
Mixin class providing methods for child access with compile-time parameter.
Definition proxynode.hh:30
│ │ │ │ -
auto & child(index_constant< k >={})
Returns the i-th child.
Definition proxynode.hh:71
│ │ │ │ -
void setChild(ProxyChild &&child, typename std::enable_if< lazy_enabled< k >::value, void * >::type=0)
Sets the i-th child to the passed-in value.
Definition proxynode.hh:112
│ │ │ │ -
const ProxiedNode::NodeStorage & nodeStorage() const
Definition proxynode.hh:117
│ │ │ │ -
auto childStorage(index_constant< k >={})
Returns the storage of the i-th child.
Definition proxynode.hh:92
│ │ │ │ -
const auto & child(index_constant< k >={}) const
Returns the i-th child (const version).
Definition proxynode.hh:81
│ │ │ │ -
auto childStorage(index_constant< k >={}) const
Returns the storage of the i-th child (const version).
Definition proxynode.hh:105
│ │ │ │ -
Access to the type and storage type of the i-th child.
Definition proxynode.hh:60
│ │ │ │ -
Mixin class providing methods for child access with run-time parameter.
Definition proxynode.hh:133
│ │ │ │ -
auto & child(std::size_t i)
Returns the i-th child.
Definition proxynode.hh:162
│ │ │ │ -
auto childStorage(std::size_t i) const
Returns the storage of the i-th child (const version).
Definition proxynode.hh:194
│ │ │ │ -
void setChild(std::size_t i, ProxyChild &&child, typename std::enable_if< enabled, void * >::type=0)
Sets the i-th child to the passed-in value.
Definition proxynode.hh:201
│ │ │ │ -
const auto & child(std::size_t i) const
Returns the i-th child (const version).
Definition proxynode.hh:171
│ │ │ │ -
auto childStorage(std::size_t i)
Returns the storage of the i-th child.
Definition proxynode.hh:182
│ │ │ │ -
Tag-based dispatch to appropriate base class that provides necessary functionality.
Definition proxynode.hh:210
│ │ │ │ -
Node::NodeStorage NodeStorage
Definition proxynode.hh:224
│ │ │ │ -
Node::ChildTypes ChildTypes
Definition proxynode.hh:223
│ │ │ │ -
Node::NodeStorage NodeStorage
Definition proxynode.hh:233
│ │ │ │ -
Node::ChildType ChildType
Definition proxynode.hh:232
│ │ │ │ -
Node::NodeStorage NodeStorage
Definition proxynode.hh:242
│ │ │ │ -
Node::ChildType ChildType
Definition proxynode.hh:241
│ │ │ │ +
Transform a TypeTree.
Definition transformation.hh:96
│ │ │ │ +
type Type
Definition transformation.hh:113
│ │ │ │ +
static transformed_type transform(std::shared_ptr< const SourceTree > sp, Transformation &t)
Apply transformation to an existing tree s.
Definition transformation.hh:134
│ │ │ │ +
static transformed_type transform(std::shared_ptr< const SourceTree > sp, const Transformation &t=Transformation())
Apply transformation to an existing tree s.
Definition transformation.hh:128
│ │ │ │ +
static transformed_type transform(const SourceTree &s, Transformation &t)
Apply transformation to an existing tree s.
Definition transformation.hh:122
│ │ │ │ +
transformed_type type
The type of the transformed tree.
Definition transformation.hh:111
│ │ │ │ +
static transformed_type transform(const SourceTree &s, const Transformation &t=Transformation())
Apply transformation to an existing tree s.
Definition transformation.hh:116
│ │ │ │ +
static transformed_storage_type transform_storage(std::shared_ptr< const SourceTree > sp, const Transformation &t=Transformation())
Definition transformation.hh:141
│ │ │ │ +
static transformed_storage_type transform_storage(std::shared_ptr< const SourceTree > sp, Transformation &t)
Definition transformation.hh:148
│ │ │ │ +
Meta function that evaluates its argument iff it inherits from meta_function.
Definition typetraits.hh:142
│ │ │ │