6#ifndef DUNE_TYPETREE_VISITOR_HH
7#define DUNE_TYPETREE_VISITOR_HH
10#include <dune/common/hybridutilities.hh>
59 template<
typename T,
typename TreePath>
60 void pre(T&&, TreePath)
const {}
71 template<
typename T,
typename TreePath>
72 void in(T&&, TreePath)
const {}
82 template<
typename T,
typename TreePath>
83 void post(T&&, TreePath)
const {}
92 template<
typename T,
typename TreePath>
93 void leaf(T&&, TreePath)
const {}
106 template<
typename T,
typename Child,
typename TreePath,
typename ChildIndex>
121 template<
typename T,
typename Child,
typename TreePath,
typename ChildIndex>
175 template<
typename T1,
typename T2,
typename TreePath>
176 void pre(T1&&, T2&&, TreePath)
const {}
188 template<
typename T1,
typename T2,
typename TreePath>
189 void in(T1&&, T2&&, TreePath)
const {}
200 template<
typename T1,
typename T2,
typename TreePath>
201 void post(T1&&, T2&&, TreePath)
const {}
215 template<
typename T1,
typename T2,
typename TreePath>
216 void leaf(T1&&, T2&&, TreePath)
const {}
231 template<
typename T1,
typename Child1,
typename T2,
typename Child2,
typename TreePath,
typename ChildIndex>
232 void beforeChild(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex)
const {}
247 template<
typename T1,
typename Child1,
typename T2,
typename Child2,
typename TreePath,
typename ChildIndex>
248 void afterChild(T1&&, Child1&&, T2&&, Child2&&, TreePath, ChildIndex)
const {}
253 namespace Experimental {
295 template<
typename T,
typename TreePath,
typename U>
296 auto pre(T&&, TreePath,
const U& u)
const {
return u;}
305 template<
typename T,
typename TreePath,
typename U>
306 auto in(T&&, TreePath,
const U& u)
const {
return u;}
315 template<
typename T,
typename TreePath,
typename U>
316 auto post(T&&, TreePath,
const U& u)
const {
return u;}
325 template<
typename T,
typename TreePath,
typename U>
326 auto leaf(T&&, TreePath,
const U& u)
const {
return u;}
335 template<
typename T,
typename Child,
typename TreePath,
typename ChildIndex,
typename U>
345 template<
typename T,
typename Child,
typename TreePath,
typename ChildIndex,
typename U>
364 template<
typename Node1,
367 typename Child2 = void,
368 typename TreePath =
void>
390 template<
typename Node1,
393 typename Child2 = void,
394 typename TreePath =
void>
455 namespace Experimental::Info {
462 template<
class Tree,
class Child,
class TreePath,
class ChildIndex,
class U>
468 template<
class Tree,
class Child,
class TreePath,
class U>
471 return std::size_t{u};
474 template<
class Tree,
class TreePath,
class U>
475 auto leaf(Tree&&, TreePath, U u)
const
477 return Hybrid::plus(u,Dune::Indices::_1);
485 template<
typename Tree,
typename TreePath,
typename U>
486 auto pre(Tree&&, TreePath, U u)
const {
487 return Hybrid::plus(u,Indices::_1);
496 template<
class Tree,
class TreePath,
class U>
497 auto leaf(Tree&&, TreePath, U u)
const
499 auto path_size = index_constant<
treePathSize(TreePath{})>{};
500 auto depth = Hybrid::plus(path_size,Indices::_1);
501 return Hybrid::max(
depth,u);
507 template<
typename Tree>
515 template<
typename Tree>
523 template<
typename Tree>
531 template<
typename Tree>
538 template<
typename Tree>
539 constexpr bool isDynamic = std::is_same<std::size_t, decltype(leafCount(std::declval<Tree>()))>{};
typename impl::_Child< Node, indices... >::type Child
Template alias for the type of a child node given by a list of child indices.
Definition childextraction.hh:225
constexpr std::size_t treePathSize(const HybridTreePath< T... > &)
Returns the size (number of components) of the given HybridTreePath.
Definition treepath.hh:334
Definition accumulate_static.hh:16
auto hybridApplyToTree(Tree &&tree, Visitor &&visitor, Init &&init)
Apply hybrid visitor to TypeTree.
Definition accumulate_static.hh:701
Type
Definition treepath.hh:106
@ fullyStatic
Definition treepath.hh:106
@ dynamic
Definition treepath.hh:106
constexpr bool isDynamic
true if any of the nodes in the tree only has dynamic degree.
Definition visitor.hh:539
auto leafCount(const Tree &tree)
The number of leaf nodes in the Tree.
Definition visitor.hh:532
auto nodeCount(const Tree &tree)
The total number of nodes in the Tree.
Definition visitor.hh:524
constexpr auto depth()
The depth of the Tree.
Definition visitor.hh:516
Visitor interface and base class for TypeTree visitors.
Definition visitor.hh:49
void in(T &&, TreePath) const
Method for infix tree traversal.
Definition visitor.hh:72
void afterChild(T &&, Child &&, TreePath, ChildIndex) const
Method for child-parent traversal.
Definition visitor.hh:122
void beforeChild(T &&, Child &&, TreePath, ChildIndex) const
Method for parent-child traversal.
Definition visitor.hh:107
void post(T &&, TreePath) const
Method for postfix tree traversal.
Definition visitor.hh:83
void leaf(T &&, TreePath) const
Method for leaf traversal.
Definition visitor.hh:93
void pre(T &&, TreePath) const
Method for prefix tree traversal.
Definition visitor.hh:60
Visitor interface and base class for visitors of pairs of TypeTrees.
Definition visitor.hh:164
void leaf(T1 &&, T2 &&, TreePath) const
Method for leaf traversal.
Definition visitor.hh:216
void beforeChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex) const
Method for parent-child traversal.
Definition visitor.hh:232
void pre(T1 &&, T2 &&, TreePath) const
Method for prefix tree traversal.
Definition visitor.hh:176
void post(T1 &&, T2 &&, TreePath) const
Method for postfix traversal.
Definition visitor.hh:201
void in(T1 &&, T2 &&, TreePath) const
Method for infix tree traversal.
Definition visitor.hh:189
void afterChild(T1 &&, Child1 &&, T2 &&, Child2 &&, TreePath, ChildIndex) const
Method for child-parent traversal.
Definition visitor.hh:248
Hybrid visitor interface and base class for TypeTree hybrid visitors.
Definition visitor.hh:286
auto post(T &&, TreePath, const U &u) const
Method for postfix tree traversal.
Definition visitor.hh:316
auto pre(T &&, TreePath, const U &u) const
Method for prefix tree traversal.
Definition visitor.hh:296
auto leaf(T &&, TreePath, const U &u) const
Method for leaf traversal.
Definition visitor.hh:326
auto afterChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const
Method for child-parent traversal.
Definition visitor.hh:346
auto in(T &&, TreePath, const U &u) const
Method for infix tree traversal.
Definition visitor.hh:306
auto beforeChild(T &&, Child &&, TreePath, ChildIndex, const U &u) const
Method for parent-child traversal.
Definition visitor.hh:336
Mixin base class for visitors that only want to visit the direct children of a node.
Definition visitor.hh:358
Template struct for determining whether or not to visit a given child.
Definition visitor.hh:370
static const bool value
Do not visit any child.
Definition visitor.hh:372
Mixin base class for visitors that want to visit the complete tree.
Definition visitor.hh:384
Template struct for determining whether or not to visit a given child.
Definition visitor.hh:396
static const bool value
Visit any child.
Definition visitor.hh:398
Mixin base class for visitors that require a static TreePath during traversal.
Definition visitor.hh:412
static const TreePathType::Type treePathType
Use the static tree traversal algorithm.
Definition visitor.hh:414
Mixin base class for visitors that only need a dynamic TreePath during traversal.
Definition visitor.hh:426
static const TreePathType::Type treePathType
Use the dynamic tree traversal algorithm.
Definition visitor.hh:428
Convenience base class for visiting the entire tree.
Definition visitor.hh:435
Convenience base class for visiting the direct children of a node.
Definition visitor.hh:441
Convenience base class for visiting an entire tree pair.
Definition visitor.hh:447
Convenience base class for visiting the direct children of a node pair.
Definition visitor.hh:453
Definition visitor.hh:461
auto leaf(Tree &&, TreePath, U u) const
Definition visitor.hh:475
auto beforeChild(Tree &&, Child &&, TreePath, ChildIndex, U u) const
Definition visitor.hh:463
std::size_t beforeChild(Tree &&, Child &&, TreePath, std::size_t, U u) const
Definition visitor.hh:469
Definition visitor.hh:484
auto pre(Tree &&, TreePath, U u) const
Definition visitor.hh:486
Definition visitor.hh:495
auto leaf(Tree &&, TreePath, U u) const
Definition visitor.hh:497