57 using Tree1 = std::remove_reference_t<T1>;
58 using Tree2 = std::remove_reference_t<T2>;
59 using Visitor = std::remove_reference_t<V>;
60 visitor.pre(tree1, tree2, treePath);
63 using allowDynamicTraversal = std::conjunction<
64 Dune::Std::is_detected<DynamicTraversalConcept,Tree1>,
65 Dune::Std::is_detected<DynamicTraversalConcept,Tree2>>;
66 using allowStaticTraversal = std::conjunction<
67 Dune::Std::is_detected<StaticTraversalConcept,Tree1>,
68 Dune::Std::is_detected<StaticTraversalConcept,Tree2>>;
71 static_assert(allowDynamicTraversal::value || allowStaticTraversal::value);
74 using preferDynamicTraversal = std::bool_constant<Visitor::treePathType == TreePathType::dynamic>;
78 if constexpr(preferDynamicTraversal::value && allowDynamicTraversal::value)
79 return Dune::range(std::size_t(tree1.degree()));
81 return Dune::range(tree1.degree());
84 if constexpr(allowDynamicTraversal::value || allowStaticTraversal::value) {
85 Dune::Hybrid::forEach(indices, [&](
auto i) {
86 auto&& child1 = tree1.child(i);
87 auto&& child2 = tree2.child(i);
88 using Child1 = std::decay_t<
decltype(child1)>;
89 using Child2 = std::decay_t<
decltype(child2)>;
91 visitor.beforeChild(tree1, child1, tree2, child2, treePath, i);
96 visitor.in(tree1, tree2, treePath);
98 constexpr bool visitChild = Visitor::template VisitChild<Tree1,Child1,Tree2,Child2,TreePath>::value;
99 if constexpr(visitChild) {
100 auto childTreePath = Dune::TypeTree::push_back(treePath, i);
104 visitor.afterChild(tree1, child1, tree2, child2, treePath, i);
107 visitor.post(tree1, tree2, treePath);