6#ifndef DUNE_COMMON_TYPETREE_TEST_TESTTYPETREEUTILITIES_HH
7#define DUNE_COMMON_TYPETREE_TEST_TESTTYPETREEUTILITIES_HH
14#include <dune/common/indices.hh>
15#include <dune/common/typetree/traversal.hh>
19template<
class Payload>
32 int value()
const {
return value_; };
33 int& value() {
return value_; };
34 auto name()
const {
return std::string(
"Leaf<") + std::to_string(value()) + std::string(
">"); }
42template<
class Payload,
class C, std::
size_t n>
43class UniformStaticInner
46 std::array<C, n> children_;
49 UniformStaticInner() =
default;
51 UniformStaticInner(Payload value, C c)
54 for(std::size_t i=0; i<n; ++i)
59 : UniformStaticInner(value, c)
63 int value()
const {
return value_; };
64 int& value() {
return value_; };
65 auto name()
const {
return std::string(
"UniformStaticInner"); }
68 auto degree()
const {
return n; }
69 auto&
child(std::size_t i) {
return children_[i]; };
70 const auto&
child(std::size_t i)
const {
return children_[i]; };
74template<
class Payload,
class C>
75class UniformDynamicInner
79 std::vector<C> children_;
82 UniformDynamicInner() =
default;
84 UniformDynamicInner(Payload value, C c, std::size_t n)
92 int value()
const {
return value_; };
93 int& value() {
return value_; };
94 auto name()
const {
return std::string(
"UniformDynamicInner"); }
95 void resize(std::size_t n) { children_.resize(n, prototype_); }
98 auto degree()
const {
return children_.size(); }
99 auto&
child(std::size_t i) {
return children_[i]; };
100 const auto&
child(std::size_t i)
const {
return children_[i]; };
104template<
class Payload,
class... CC>
108 std::tuple<CC...> children_;
111 NonUniformInner() =
default;
113 NonUniformInner(Payload value, CC... cc)
115 , children_{
std::move(cc)...}
119 int value()
const {
return value_; };
120 int& value() {
return value_; };
121 auto name()
const {
return std::string(
"NonUniformInner"); }
125 template<std::
size_t i>
127 template<std::
size_t i>
134std::string treeName(
const Tree& tree)
136 using namespace std::string_literals;
137 auto name = std::string{};
139 [&](
auto&& node) { name += node.name() +
"<"s; },
140 [&](
auto&& node) { name += node.name() +
","s; },
141 [&](
auto&& node) { name +=
">"s; }
constexpr index_constant< 0 > _0
Compile time index with value 0.
Definition: indices.hh:52
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition: indices.hh:29
void forEachNode(Tree &&tree, PreNodeFunc &&preNodeFunc, LeafNodeFunc &&leafNodeFunc, PostNodeFunc &&postNodeFunc)
Traverse tree and visit each node.
Definition: traversal.hh:133