DUNE PDELab (2.8)

traversalutilities.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_TRAVERSALUTILITIES_HH
5#define DUNE_TYPETREE_TRAVERSALUTILITIES_HH
6
7#include <dune/typetree/traversal.hh>
8
9namespace Dune {
10 namespace TypeTree {
11
17 namespace {
18
20
25 template<typename F, typename R, typename ResultType>
26 struct LeafReductionVisitor
27 : public TypeTree::TreeVisitor
28 {
29
30 static const TreePathType::Type treePathType = TreePathType::dynamic;
31
32 template<typename Node, typename TreePath>
33 void leaf(const Node& node, TreePath treePath)
34 {
35 _value = _reduction(_value,_functor(node,treePath));
36 }
37
38 LeafReductionVisitor(F functor, R reduction, ResultType startValue)
39 : _functor(functor)
40 , _reduction(reduction)
41 , _value(startValue)
42 {}
43
44 ResultType result() { return _value; }
45
46 F _functor;
47 R _reduction;
48 ResultType _value;
49
50 };
51
52 } // anonymous namespace
53
55
80 template<typename ResultType, typename Tree, typename F, typename R>
81 ResultType reduceOverLeafs(const Tree& tree, F functor, R reduction, ResultType startValue)
82 {
83 LeafReductionVisitor<F,R,ResultType> visitor(functor,reduction,startValue);
84 TypeTree::applyToTree(tree,visitor);
85 return visitor.result();
86 }
87
89
90 } // namespace TypeTree
91} //namespace Dune
92
93#endif // DUNE_TYPETREE_TRAVERSALUTILITIES_HH
constexpr HybridTreePath< T... > treePath(const T &... t)
Constructs a new HybridTreePath from the given indices.
Definition: treepath.hh:188
ResultType reduceOverLeafs(const Tree &tree, F functor, R reduction, ResultType startValue)
Calculate a quantity as a reduction over the leaf nodes of a TypeTree.
Definition: traversalutilities.hh:81
void applyToTree(Tree &&tree, Visitor &&visitor)
Apply visitor to TypeTree.
Definition: traversal.hh:237
Dune namespace.
Definition: alignedallocator.hh:11
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Dec 22, 23:30, 2024)