4 #ifndef DUNE_TYPETREE_TRANSFORMATION_HH
5 #define DUNE_TYPETREE_TRANSFORMATION_HH
7 #include <dune/common/exceptions.hh>
8 #include <dune/common/typetraits.hh>
9 #include <dune/common/shared_ptr.hh>
10 #include <dune/common/array.hh>
11 #include <dune/common/tuples.hh>
47 template<
typename SourceNode,
typename Transformation,
typename Tag>
62 template<
typename S,
typename T,
typename Tag>
63 struct LookupNodeTransformation
68 typedef typename evaluate_if_meta_function<
72 dune_static_assert((!is_same<type,
void>::
value), "Unable to find valid transformation descriptor");
75 struct EmptyNodeTransformation;
79 template<typename S, typename T>
80 struct LookupNodeTransformation<S,T,EmptyNodeTag>
82 typedef EmptyNodeTransformation type;
98 template<
typename SourceTree,
typename Transformation,
typename Tag = StartTag,
bool recursive = true>
104 typedef typename LookupNodeTransformation<SourceTree,Transformation,typename SourceTree::ImplementationTag>::type NodeTransformation;
119 static transformed_type
transform(
const SourceTree& s,
const Transformation& t = Transformation())
125 static transformed_type
transform(
const SourceTree& s, Transformation& t)
131 static transformed_type
transform(shared_ptr<const SourceTree> sp,
const Transformation& t = Transformation())
137 static transformed_type
transform(shared_ptr<const SourceTree> sp, Transformation& t)
144 static transformed_storage_type
transform_storage(shared_ptr<const SourceTree> sp,
const Transformation& t = Transformation())
151 static transformed_storage_type
transform_storage(shared_ptr<const SourceTree> sp, Transformation& t)
159 #ifndef DOXYGEN // internal per-node implementations of the transformation algorithm
162 template<
typename S,
typename T,
bool recursive>
163 struct TransformTree<S,T,LeafNodeTag,recursive>
166 typedef typename LookupNodeTransformation<S,T,typename S::ImplementationTag>::type NodeTransformation;
168 typedef typename NodeTransformation::transformed_type transformed_type;
169 typedef typename NodeTransformation::transformed_storage_type transformed_storage_type;
172 static transformed_type transform(
const S& s, T& t)
174 return NodeTransformation::transform(s,t);
178 static transformed_type transform(
const S& s,
const T& t)
180 return NodeTransformation::transform(s,t);
184 static transformed_type transform(shared_ptr<const S> sp, T& t)
186 return NodeTransformation::transform(sp,t);
190 static transformed_type transform(shared_ptr<const S> sp,
const T& t)
192 return NodeTransformation::transform(sp,t);
195 static transformed_storage_type transform_storage(shared_ptr<const S> sp, T& t)
197 return NodeTransformation::transform_storage(sp,t);
200 static transformed_storage_type transform_storage(shared_ptr<const S> sp,
const T& t)
202 return NodeTransformation::transform_storage(sp,t);
209 template<
typename S,
typename T>
210 struct TransformTreeNonRecursive
213 typedef typename LookupNodeTransformation<S,T,typename S::ImplementationTag>::type NodeTransformation;
215 typedef typename NodeTransformation::transformed_type transformed_type;
216 typedef typename NodeTransformation::transformed_storage_type transformed_storage_type;
219 static transformed_type transform(
const S& s, T& t)
221 return NodeTransformation::transform(s,t);
225 static transformed_type transform(
const S& s,
const T& t)
227 return NodeTransformation::transform(s,t);
231 static transformed_type transform(shared_ptr<const S> sp, T& t)
233 return NodeTransformation::transform(sp,t);
237 static transformed_type transform(shared_ptr<const S> sp,
const T& t)
239 return NodeTransformation::transform(sp,t);
242 static transformed_storage_type transform_storage(shared_ptr<const S> sp, T& t)
244 return NodeTransformation::transform_storage(sp,t);
247 static transformed_storage_type transform_storage(shared_ptr<const S> sp,
const T& t)
249 return NodeTransformation::transform_storage(sp,t);
256 template<
typename S,
typename T>
257 struct TransformTree<S,T,PowerNodeTag,true>
266 typedef typename LookupNodeTransformation<S,T,typename S::ImplementationTag>::type NodeTransformation;
267 typedef typename LookupNodeTransformation<typename S::ChildType,T,typename S::ChildType::ImplementationTag>::type ChildNodeTransformation;
269 typedef typename NodeTransformation::template
result<
typename TransformTree<
typename S::ChildType,
271 typename S::ChildType::NodeTag,
272 ChildNodeTransformation::recursive>::transformed_type
273 >::type transformed_type;
275 typedef typename NodeTransformation::template
result<
typename TransformTree<
typename S::ChildType,
277 typename S::ChildType::NodeTag,
278 ChildNodeTransformation::recursive>::transformed_type
279 >::storage_type transformed_storage_type;
282 static transformed_type transform(
const S& s, T& t)
285 typedef TransformTree<typename S::ChildType,T,typename S::ChildType::NodeTag,ChildNodeTransformation::recursive> ChildTreeTransformation;
286 typedef typename ChildTreeTransformation::transformed_type transformed_child;
287 const std::size_t child_count = S::CHILDREN;
288 array<shared_ptr<transformed_child>,child_count> children;
289 for (std::size_t k = 0; k < child_count; ++k) {
290 children[k] = ChildTreeTransformation::transform_storage(s.childStorage(k),t);
293 return NodeTransformation::transform(s,t,children);
296 static transformed_type transform(
const S& s,
const T& t)
299 typedef TransformTree<typename S::ChildType,T,typename S::ChildType::NodeTag,ChildNodeTransformation::recursive> ChildTreeTransformation;
300 typedef typename ChildTreeTransformation::transformed_type transformed_child;
301 const std::size_t child_count = S::CHILDREN;
302 array<shared_ptr<transformed_child>,child_count> children;
303 for (std::size_t k = 0; k < child_count; ++k) {
304 children[k] = ChildTreeTransformation::transform_storage(s.childStorage(k),t);
307 return NodeTransformation::transform(s,t,children);
311 static transformed_type transform(shared_ptr<const S> sp, T& t)
314 typedef TransformTree<typename S::ChildType,T,typename S::ChildType::NodeTag,ChildNodeTransformation::recursive> ChildTreeTransformation;
315 typedef typename ChildTreeTransformation::transformed_type transformed_child;
316 const std::size_t child_count = S::CHILDREN;
317 array<shared_ptr<transformed_child>,child_count> children;
318 for (std::size_t k = 0; k < child_count; ++k) {
319 children[k] = ChildTreeTransformation::transform_storage(sp->childStorage(k),t);
322 return NodeTransformation::transform(sp,t,children);
325 static transformed_type transform(shared_ptr<const S> sp,
const T& t)
328 typedef TransformTree<typename S::ChildType,T,typename S::ChildType::NodeTag,ChildNodeTransformation::recursive> ChildTreeTransformation;
329 typedef typename ChildTreeTransformation::transformed_type transformed_child;
330 const std::size_t child_count = S::CHILDREN;
331 array<shared_ptr<transformed_child>,child_count> children;
332 for (std::size_t k = 0; k < child_count; ++k) {
333 children[k] = ChildTreeTransformation::transform_storage(sp->childStorage(k),t);
336 return NodeTransformation::transform(sp,t,children);
339 static transformed_storage_type transform_storage(shared_ptr<const S> sp, T& t)
342 typedef TransformTree<typename S::ChildType,T,typename S::ChildType::NodeTag,ChildNodeTransformation::recursive> ChildTreeTransformation;
343 typedef typename ChildTreeTransformation::transformed_storage_type transformed_child_storage;
344 const std::size_t child_count = S::CHILDREN;
345 array<transformed_child_storage,child_count> children;
346 for (std::size_t k = 0; k < child_count; ++k) {
347 children[k] = ChildTreeTransformation::transform_storage(sp->childStorage(k),t);
349 return NodeTransformation::transform_storage(sp,t,children);
352 static transformed_storage_type transform_storage(shared_ptr<const S> sp,
const T& t)
355 typedef TransformTree<typename S::ChildType,T,typename S::ChildType::NodeTag,ChildNodeTransformation::recursive> ChildTreeTransformation;
356 typedef typename ChildTreeTransformation::transformed_storage_type transformed_child_storage;
357 const std::size_t child_count = S::CHILDREN;
358 array<transformed_child_storage,child_count> children;
359 for (std::size_t k = 0; k < child_count; ++k) {
360 children[k] = ChildTreeTransformation::transform_storage(sp->childStorage(k),t);
362 return NodeTransformation::transform_storage(sp,t,children);
368 template<
typename S,
typename T>
369 struct TransformTree<S,T,PowerNodeTag,false>
370 :
public TransformTreeNonRecursive<S,T>
382 template<
typename S,
typename Children,
typename T>
383 struct transform_composite_node;
389 template<
typename S,
typename T,
typename C0,
typename C1,
typename C2,
typename C3,
typename C4,
typename C5,
typename C6,
typename C7,
typename C8,
typename C9>
390 struct transform_composite_node<S,tuple<C0,C1,C2,C3,C4,C5,C6,C7,C8,C9>,T>
394 typedef typename LookupNodeTransformation<S,T,typename S::ImplementationTag>::type NodeTransformation;
396 typedef typename NodeTransformation::template
result<
397 typename TransformTree<C0,T,typename C0::NodeTag,LookupNodeTransformation<C0,T,typename C0::ImplementationTag>::type::recursive>::transformed_type,
398 typename TransformTree<C1,T,typename C1::NodeTag,LookupNodeTransformation<C1,T,typename C1::ImplementationTag>::type::recursive>::transformed_type,
399 typename TransformTree<C2,T,typename C2::NodeTag,LookupNodeTransformation<C2,T,typename C2::ImplementationTag>::type::recursive>::transformed_type,
400 typename TransformTree<C3,T,typename C3::NodeTag,LookupNodeTransformation<C3,T,typename C3::ImplementationTag>::type::recursive>::transformed_type,
401 typename TransformTree<C4,T,typename C4::NodeTag,LookupNodeTransformation<C4,T,typename C4::ImplementationTag>::type::recursive>::transformed_type,
402 typename TransformTree<C5,T,typename C5::NodeTag,LookupNodeTransformation<C5,T,typename C5::ImplementationTag>::type::recursive>::transformed_type,
403 typename TransformTree<C6,T,typename C6::NodeTag,LookupNodeTransformation<C6,T,typename C6::ImplementationTag>::type::recursive>::transformed_type,
404 typename TransformTree<C7,T,typename C7::NodeTag,LookupNodeTransformation<C7,T,typename C7::ImplementationTag>::type::recursive>::transformed_type,
405 typename TransformTree<C8,T,typename C8::NodeTag,LookupNodeTransformation<C8,T,typename C8::ImplementationTag>::type::recursive>::transformed_type,
406 typename TransformTree<C9,T,typename C9::NodeTag,LookupNodeTransformation<C9,T,typename C9::ImplementationTag>::type::recursive>::transformed_type
409 typedef typename resulttypes::type transformed_type;
410 typedef typename resulttypes::storage_type transformed_storage_type;
411 typedef typename S::ImplementationTag Tag;
413 static transformed_type transform(
const S& s, T& t)
415 return NodeTransformation::transform(s,
417 TransformTree<C0,T,
typename C0::NodeTag,LookupNodeTransformation<C0,T,typename C0::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<0>(),t),
418 TransformTree<C1,T,
typename C1::NodeTag,LookupNodeTransformation<C1,T,typename C1::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<1>(),t),
419 TransformTree<C2,T,
typename C2::NodeTag,LookupNodeTransformation<C2,T,typename C2::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<2>(),t),
420 TransformTree<C3,T,
typename C3::NodeTag,LookupNodeTransformation<C3,T,typename C3::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<3>(),t),
421 TransformTree<C4,T,
typename C4::NodeTag,LookupNodeTransformation<C4,T,typename C4::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<4>(),t),
422 TransformTree<C5,T,
typename C5::NodeTag,LookupNodeTransformation<C5,T,typename C5::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<5>(),t),
423 TransformTree<C6,T,
typename C6::NodeTag,LookupNodeTransformation<C6,T,typename C6::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<6>(),t),
424 TransformTree<C7,T,
typename C7::NodeTag,LookupNodeTransformation<C7,T,typename C7::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<7>(),t),
425 TransformTree<C8,T,
typename C8::NodeTag,LookupNodeTransformation<C8,T,typename C8::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<8>(),t),
426 TransformTree<C9,T,
typename C9::NodeTag,LookupNodeTransformation<C9,T,typename C9::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<9>(),t));
429 static transformed_type transform(
const S& s,
const T& t)
431 return NodeTransformation::transform(s,
433 TransformTree<C0,T,
typename C0::NodeTag,LookupNodeTransformation<C0,T,typename C0::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<0>(),t),
434 TransformTree<C1,T,
typename C1::NodeTag,LookupNodeTransformation<C1,T,typename C1::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<1>(),t),
435 TransformTree<C2,T,
typename C2::NodeTag,LookupNodeTransformation<C2,T,typename C2::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<2>(),t),
436 TransformTree<C3,T,
typename C3::NodeTag,LookupNodeTransformation<C3,T,typename C3::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<3>(),t),
437 TransformTree<C4,T,
typename C4::NodeTag,LookupNodeTransformation<C4,T,typename C4::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<4>(),t),
438 TransformTree<C5,T,
typename C5::NodeTag,LookupNodeTransformation<C5,T,typename C5::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<5>(),t),
439 TransformTree<C6,T,
typename C6::NodeTag,LookupNodeTransformation<C6,T,typename C6::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<6>(),t),
440 TransformTree<C7,T,
typename C7::NodeTag,LookupNodeTransformation<C7,T,typename C7::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<7>(),t),
441 TransformTree<C8,T,
typename C8::NodeTag,LookupNodeTransformation<C8,T,typename C8::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<8>(),t),
442 TransformTree<C9,T,
typename C9::NodeTag,LookupNodeTransformation<C9,T,typename C9::ImplementationTag>::type::recursive>::transform_storage(s.template childStorage<9>(),t));
445 static transformed_storage_type transform_storage(shared_ptr<const S> sp, T& t)
447 return NodeTransformation::transform_storage(sp,
449 TransformTree<C0,T,
typename C0::NodeTag,LookupNodeTransformation<C0,T,typename C0::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<0>(),t),
450 TransformTree<C1,T,
typename C1::NodeTag,LookupNodeTransformation<C1,T,typename C1::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<1>(),t),
451 TransformTree<C2,T,
typename C2::NodeTag,LookupNodeTransformation<C2,T,typename C2::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<2>(),t),
452 TransformTree<C3,T,
typename C3::NodeTag,LookupNodeTransformation<C3,T,typename C3::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<3>(),t),
453 TransformTree<C4,T,
typename C4::NodeTag,LookupNodeTransformation<C4,T,typename C4::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<4>(),t),
454 TransformTree<C5,T,
typename C5::NodeTag,LookupNodeTransformation<C5,T,typename C5::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<5>(),t),
455 TransformTree<C6,T,
typename C6::NodeTag,LookupNodeTransformation<C6,T,typename C6::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<6>(),t),
456 TransformTree<C7,T,
typename C7::NodeTag,LookupNodeTransformation<C7,T,typename C7::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<7>(),t),
457 TransformTree<C8,T,
typename C8::NodeTag,LookupNodeTransformation<C8,T,typename C8::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<8>(),t),
458 TransformTree<C9,T,
typename C9::NodeTag,LookupNodeTransformation<C9,T,typename C9::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<9>(),t));
461 static transformed_storage_type transform_storage(shared_ptr<const S> sp,
const T& t)
463 return NodeTransformation::transform_storage(sp,
465 TransformTree<C0,T,
typename C0::NodeTag,LookupNodeTransformation<C0,T,typename C0::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<0>(),t),
466 TransformTree<C1,T,
typename C1::NodeTag,LookupNodeTransformation<C1,T,typename C1::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<1>(),t),
467 TransformTree<C2,T,
typename C2::NodeTag,LookupNodeTransformation<C2,T,typename C2::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<2>(),t),
468 TransformTree<C3,T,
typename C3::NodeTag,LookupNodeTransformation<C3,T,typename C3::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<3>(),t),
469 TransformTree<C4,T,
typename C4::NodeTag,LookupNodeTransformation<C4,T,typename C4::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<4>(),t),
470 TransformTree<C5,T,
typename C5::NodeTag,LookupNodeTransformation<C5,T,typename C5::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<5>(),t),
471 TransformTree<C6,T,
typename C6::NodeTag,LookupNodeTransformation<C6,T,typename C6::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<6>(),t),
472 TransformTree<C7,T,
typename C7::NodeTag,LookupNodeTransformation<C7,T,typename C7::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<7>(),t),
473 TransformTree<C8,T,
typename C8::NodeTag,LookupNodeTransformation<C8,T,typename C8::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<8>(),t),
474 TransformTree<C9,T,
typename C9::NodeTag,LookupNodeTransformation<C9,T,typename C9::ImplementationTag>::type::recursive>::transform_storage(sp->template childStorage<9>(),t));
481 template<
typename S,
typename T>
482 struct TransformTree<S,T,CompositeNodeTag,true>
484 typedef typename transform_composite_node<S,typename S::ChildTypes,T>::transformed_type transformed_type;
485 typedef typename transform_composite_node<S,typename S::ChildTypes,T>::transformed_storage_type transformed_storage_type;
487 static transformed_type transform(
const S& s, T& t)
489 return transform_composite_node<S,typename S::ChildTypes,T>::transform(s,t);
492 static transformed_type transform(
const S& s,
const T& t)
494 return transform_composite_node<S,typename S::ChildTypes,T>::transform(s,t);
497 static transformed_storage_type transform_storage(shared_ptr<const S> sp, T& t)
499 return transform_composite_node<S,typename S::ChildTypes,T>::transform_storage(sp,t);
502 static transformed_storage_type transform_storage(shared_ptr<const S> sp,
const T& t)
504 return transform_composite_node<S,typename S::ChildTypes,T>::transform_storage(sp,t);
510 template<
typename S,
typename T>
511 struct TransformTree<S,T,CompositeNodeTag,false>
512 :
public TransformTreeNonRecursive<S,T>
515 #if HAVE_VARIADIC_TEMPLATES
522 template<
typename S,
typename Children,
typename T>
523 struct transform_variadic_composite_node;
528 template<
typename S,
typename T,
typename... C>
529 struct transform_variadic_composite_node<S,tuple<C...>,T>
533 typedef typename S::ImplementationTag Tag;
534 typedef typename LookupNodeTransformation<S,T,Tag>::type NodeTransformation;
535 typedef typename NodeTransformation::template
result<
typename TransformTree<C,
538 LookupNodeTransformation<C,T,typename C::ImplementationTag>::type::recursive
539 >::transformed_type...
540 >::type transformed_type;
542 typedef typename NodeTransformation::template
result<
typename TransformTree<C,
545 LookupNodeTransformation<C,T,typename C::ImplementationTag>::type::recursive
546 >::transformed_type...
547 >::storage_type transformed_storage_type;
552 template<std::
size_t i>
553 struct ChildTransformation
554 :
public TransformTree<typename S::template Child<i>::Type,
556 typename S::template Child<i>::Type::NodeTag,
557 LookupNodeTransformation<
558 typename S::template Child<i>::Type,
560 typename S::template Child<i>::Type::ImplementationTag
566 template<std::size_t... i>
567 static transformed_type transform(
const S& s, T& t, index_pack<i...> indices)
569 return NodeTransformation::transform(s,t,ChildTransformation<i>::transform_storage(s.template childStorage<i>(),t)...);
572 template<std::size_t... i>
573 static transformed_type transform(
const S& s,
const T& t, index_pack<i...> indices)
575 return NodeTransformation::transform(s,t,ChildTransformation<i>::transform_storage(s.template childStorage<i>(),t)...);
578 template<std::size_t... i>
579 static transformed_storage_type transform_storage(shared_ptr<const S> sp, T& t, index_pack<i...> indices)
581 return NodeTransformation::transform_storage(sp,t,ChildTransformation<i>::transform_storage(sp->template childStorage<i>(),t)...);
584 template<std::size_t... i>
585 static transformed_storage_type transform_storage(shared_ptr<const S> sp,
const T& t, index_pack<i...> indices)
587 return NodeTransformation::transform_storage(sp,t,ChildTransformation<i>::transform_storage(sp->template childStorage<i>(),t)...);
595 template<
typename S,
typename T>
596 struct TransformTree<S,T,VariadicCompositeNodeTag,true>
601 typedef typename S::ChildTypes ChildTypes;
603 static typename tuple_index_pack_builder<ChildTypes>::type child_indices()
605 return typename tuple_index_pack_builder<ChildTypes>::type();
610 typedef typename transform_variadic_composite_node<S,ChildTypes,T>::transformed_type transformed_type;
611 typedef typename transform_variadic_composite_node<S,ChildTypes,T>::transformed_storage_type transformed_storage_type;
613 static transformed_type transform(
const S& s, T& t)
615 return transform_variadic_composite_node<S,ChildTypes,T>::transform(s,t,child_indices());
618 static transformed_type transform(
const S& s,
const T& t)
620 return transform_variadic_composite_node<S,ChildTypes,T>::transform(s,t,child_indices());
623 static transformed_storage_type transform_storage(shared_ptr<const S> sp, T& t)
625 return transform_variadic_composite_node<S,ChildTypes,T>::transform_storage(sp,t,child_indices());
628 static transformed_storage_type transform_storage(shared_ptr<const S> sp,
const T& t)
630 return transform_variadic_composite_node<S,ChildTypes,T>::transform_storage(sp,t,child_indices());
636 template<
typename S,
typename T>
637 struct TransformTree<S,T,VariadicCompositeNodeTag,false>
638 :
public TransformTreeNonRecursive<S,T>
642 #endif // HAVE_VARIADIC_TEMPLATES
645 struct EmptyNodeTransformation
648 static const bool recursive =
false;
652 template<
typename T,
bool recursive>
653 struct TransformTree<EmptyNode,T,EmptyNodeTag,recursive>
656 typedef EmptyNode transformed_type;
657 typedef shared_ptr<EmptyNode> transformed_storage_type;
660 static transformed_type transform(
const EmptyNode& s,
const T& t)
662 DUNE_THROW(NotImplemented,
"this should never get called!");
665 static transformed_storage_type transform_storage(shared_ptr<const EmptyNode> en,
const T& t)
679 #endif // DUNE_TYPETREE_TRANSFORMATION_HH
static transformed_storage_type transform_storage(shared_ptr< const SourceTree > sp, const Transformation &t=Transformation())
Definition: transformation.hh:144
Transform a TypeTree.
Definition: transformation.hh:99
void registerNodeTransformation(SourceNode *, Transformation *, Tag *)
Register transformation descriptor to transform SourceNode with Transformation.
static transformed_type transform(shared_ptr< const SourceTree > sp, Transformation &t)
Apply transformation to an existing tree s.
Definition: transformation.hh:137
const shared_ptr< EmptyNode > & emptyNodePtr()
Reference to a pointer to an empty node that is used for all empty slots.
Definition: utility.cc:12
static const result_type result
Definition: accumulate_static.hh:108
static transformed_storage_type transform_storage(shared_ptr< const SourceTree > sp, Transformation &t)
Definition: transformation.hh:151
static transformed_type transform(shared_ptr< const SourceTree > sp, const Transformation &t=Transformation())
Apply transformation to an existing tree s.
Definition: transformation.hh:131
static transformed_type transform(const SourceTree &s, Transformation &t)
Apply transformation to an existing tree s.
Definition: transformation.hh:125
static const std::size_t value
Definition: compositenode.hh:38
static transformed_type transform(const SourceTree &s, const Transformation &t=Transformation())
Apply transformation to an existing tree s.
Definition: transformation.hh:119
transformed_type Type
The type of the transformed tree.
Definition: transformation.hh:115