3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
9#include <dune/common/indices.hh>
11#include <dune/typetree/leafnode.hh>
12#include <dune/typetree/powernode.hh>
13#include <dune/typetree/dynamicpowernode.hh>
14#include <dune/typetree/compositenode.hh>
15#include <dune/typetree/traversal.hh>
16#include <dune/typetree/visitor.hh>
25 struct ClearSizeVisitor
26 :
public TypeTree::TreeVisitor
27 ,
public TypeTree::DynamicTraversal
30 template<
typename Node,
typename TreePath>
37 template<
typename Node,
typename TreePath>
40 node.setOffset(offset_);
43 ClearSizeVisitor(std::size_t offset)
47 const std::size_t offset_;
52 template<
typename Entity>
54 :
public TypeTree::TreeVisitor
55 ,
public TypeTree::DynamicTraversal
58 template<
typename Node,
typename TreePath>
59 void pre(Node& node, TreePath)
61 node.setOffset(offset_);
64 template<
typename Node,
typename TreePath>
65 void post(Node& node, TreePath)
67 node.setSize(offset_ - node.offset());
70 template<
typename Node,
typename TreePath>
71 void leaf(Node& node, TreePath)
73 node.setOffset(offset_);
75 offset_ += node.size();
78 BindVisitor(
const Entity& entity, std::size_t offset = 0)
83 const Entity& entity_;
89 struct InitializeTreeVisitor :
90 public TypeTree::TreeVisitor,
91 public TypeTree::DynamicTraversal
93 template<
typename Node,
typename TreePath>
94 void pre(Node& node, TreePath)
96 node.setTreeIndex(treeIndex_);
100 template<
typename Node,
typename TreePath>
101 void leaf(Node& node, TreePath)
103 node.setTreeIndex(treeIndex_);
107 InitializeTreeVisitor(std::size_t treeIndexOffset = 0) :
108 treeIndex_(treeIndexOffset)
111 std::size_t treeIndex_;
120 friend struct Impl::ClearSizeVisitor;
123 friend struct Impl::BindVisitor;
125 friend struct Impl::InitializeTreeVisitor;
129 using size_type = std::size_t;
137 size_type localIndex(size_type i)
const
143 size_type
size()
const
148 size_type treeIndex()
const
155 size_type offset()
const
160 void setOffset(
const size_type offset)
165 void setSize(
const size_type
size)
170 void setTreeIndex(size_type treeIndex)
172 treeIndex_ = treeIndex;
179 size_type treeIndex_;
184 class LeafBasisNode :
185 public BasisNodeMixin,
186 public TypeTree::LeafNode
190 template<
typename T, std::
size_t n>
191 class PowerBasisNode :
192 public BasisNodeMixin,
193 public TypeTree::PowerNode<T,n>
196 using Node = TypeTree::PowerNode<T,n>;
200 using Element =
typename T::Element;
202 PowerBasisNode() =
default;
208 const Element& element()
const
217 class DynamicPowerBasisNode :
218 public BasisNodeMixin,
219 public TypeTree::DynamicPowerNode<T>
222 using Node = TypeTree::DynamicPowerNode<T>;
226 using Element =
typename T::Element;
228 DynamicPowerBasisNode (std::size_t children)
233 : Node(
std::move(children))
236 const Element& element()
const
238 return this->
child(0).element();
244 template<
typename... T>
245 class CompositeBasisNode :
246 public BasisNodeMixin,
247 public TypeTree::CompositeNode<T...>
250 using Node = TypeTree::CompositeNode<T...>;
254 using Element =
typename Node::template Child<0>::Type::Element;
256 CompositeBasisNode() =
default;
262 template<
typename... Children>
263 CompositeBasisNode(
const std::shared_ptr<Children>&... children) :
267 const Element& element()
const
275 template<
typename Tree>
276 void clearSize(Tree& tree, std::size_t offset)
281 template<
typename Tree,
typename Entity>
282 void bindTree(Tree& tree,
const Entity& entity, std::size_t offset = 0)
284 Impl::BindVisitor<Entity> visitor(entity,offset);
288 template<
typename Tree>
289 void initializeTree(Tree& tree, std::size_t treeIndexOffset = 0)
291 Impl::InitializeTreeVisitor visitor(treeIndexOffset);
std::tuple< std::shared_ptr< Children >... > NodeStorage
The type used for storing the children.
Definition: compositenode.hh:36
std::vector< ChildStorageType > NodeStorage
The type used for storing the children.
Definition: dynamicpowernode.hh:67
std::array< std::shared_ptr< T >, k > NodeStorage
The type used for storing the children.
Definition: powernode.hh:77
constexpr index_constant< 0 > _0
Compile time index with value 0.
Definition: indices.hh:52
constexpr auto treePath(const T &... t)
Constructs a new HybridTreePath from the given indices.
Definition: treepath.hh:326
void applyToTree(Tree &&tree, Visitor &&visitor)
Apply visitor to TypeTree.
Definition: traversal.hh:239
Dune namespace.
Definition: alignedallocator.hh:13
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75
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