4#ifndef DUNE_TYPETREE_PAIRTRAVERSAL_HH
5#define DUNE_TYPETREE_PAIRTRAVERSAL_HH
23 template<TreePathType::Type tpType>
24 struct ApplyToTreePair<tpType,StartTag,StartTag,true>
27 template<
typename Node1,
typename Node2,
typename Visitor>
28 static void apply(Node1&& node1, Node2&& node2, Visitor&& visitor)
30 ApplyToTreePair<tpType,
33 >::apply(std::forward<Node1>(node1),
34 std::forward<Node2>(node2),
35 std::forward<Visitor>(visitor),
36 TreePathFactory<tpType>::create(node1).mutablePath());
43 template<TreePathType::Type tpType,
typename Tag1,
typename Tag2>
44 struct ApplyToTreePair<tpType,Tag1,Tag2,false>
46 template<
typename Node1,
typename Node2,
typename Visitor,
typename TreePath>
47 static void apply(
const Node1& node1,
const Node2& node2,
const Visitor& visitor, TreePath treePath)
100 template<TreePathType::Type treePathType,
typename FirstTag,
typename SecondTag>
101 struct ApplyToTreePair<
treePathType,FirstTag,SecondTag,true>
102 :
public ApplyToGenericCompositeNodePair<treePathType>
113 struct ApplyToTreePair<TreePathType::
dynamic,PowerNodeTag,PowerNodeTag,true>
116 template<
typename N1,
typename N2,
typename V,
typename TreePath>
117 static void apply(N1&& n1, N2&& n2, V&& v, TreePath tp)
119 v.pre(std::forward<N1>(n1),std::forward<N2>(n2),tp.view());
120 typedef typename std::remove_reference<N1>::type Node1;
121 typedef typename std::remove_reference<N2>::type Node2;
122 typedef typename Node1::template Child<0>::Type C1;
123 typedef typename Node2::template Child<0>::Type C2;
124 static_assert(StaticDegree<Node1>::value == StaticDegree<Node2>::value,
125 "non-leaf nodes with different numbers of children " \
126 "are not allowed during simultaneous grid traversal");
127 const bool visit = std::remove_reference<V>::type
128 ::template VisitChild<Node1,C1,Node2,C2,typename TreePath::ViewType>::value;
129 for (std::size_t k = 0; k <
degree(n1); ++k)
131 v.beforeChild(std::forward<N1>(n1),n1.child(k),std::forward<N2>(n2),n2.child(k),tp.view(),k);
133 ApplyToTreePair<TreePathType::dynamic,
136 visit>::apply(n1.child(k),
141 v.afterChild(std::forward<N1>(n1),n1.child(k),std::forward<N2>(n2),n2.child(k),tp.view(),k);
143 v.in(std::forward<N1>(n1),std::forward<N2>(n2),tp.view());
145 v.post(std::forward<N1>(n1),std::forward<N2>(n2),tp.view());
167 template<
typename Tree1,
typename Tree2,
typename Visitor>
170 ApplyToTreePair<std::remove_reference<Visitor>::type::treePathType>::apply(std::forward<Tree1>(tree1),
171 std::forward<Tree2>(tree2),
172 std::forward<Visitor>(visitor));
static const TreePathType::Type treePathType
Definition traversalutilities.hh:30
void applyToTreePair(Tree1 &&tree1, Tree2 &&tree2, Visitor &&visitor)
Apply visitor to a pair of TypeTrees.
Definition pairtraversal.hh:168
std::size_t degree(const Node &node)
Returns the degree of node as run time information.
Definition nodeinterface.hh:71
Definition accumulate_static.hh:13
@ dynamic
Definition treepath.hh:26