4 #ifndef DUNE_TYPETREE_COMPOSITENODE_HH
5 #define DUNE_TYPETREE_COMPOSITENODE_HH
21 template<
typename... Children>
32 typedef std::tuple<std::shared_ptr<Children>... >
NodeStorage;
47 static const std::size_t
CHILDREN =
sizeof...(Children);
50 template<std::
size_t k>
53 static_assert((k < CHILDREN),
"child index out of range");
56 typedef typename std::tuple_element<k,ChildTypes>::type
Type;
59 typedef typename std::tuple_element<k,ChildTypes>::type
type;
62 typedef typename std::tuple_element<k,NodeStorage>::type
Storage;
65 typedef std::shared_ptr<const typename std::tuple_element<k,ChildTypes>::type>
ConstStorage;
75 template<std::
size_t k>
78 return *std::get<k>(_children);
85 template<std::
size_t k>
88 return *std::get<k>(_children);
95 template<std::
size_t k>
98 return std::get<k>(_children);
108 template<std::
size_t k>
111 return std::get<k>(_children);
115 template<std::
size_t k>
118 std::get<k>(_children) = stackobject_to_shared_ptr(child);
122 template<std::
size_t k>
125 std::get<k>(_children) = child;
161 template<
typename... Indices>
162 ImplementationDefined&
child(Indices... indices)
164 template<
typename I0,
typename... I>
165 auto child(I0 i0, I... i)
166 ->
typename std::enable_if<
168 impl::_lazy_member_child_decltype<CompositeNode>
169 >::type::template evaluate<I0,I...>::type
172 static_assert(
sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
173 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
184 template<
typename... Indices>
185 const ImplementationDefined&
child(Indices... indices)
187 template<
typename I0,
typename... I>
188 auto child(I0 i0, I... i) const
189 -> typename
std::enable_if<
191 impl::_lazy_member_child_decltype<const CompositeNode>
192 >::type::template evaluate<I0,I...>::type
195 static_assert(
sizeof...(I) > 0 || impl::_non_empty_tree_path(I0{}),
196 "You cannot use the member function child() with an empty TreePath, use the freestanding version child(node,treePath) instead."
220 template<
typename... Args,
typename =
typename enable_if<(
sizeof...(Args) == CHILDREN)>::type>
222 : _children(convert_arg(
std::forward<Args>(args))...)
227 : _children(children...)
232 : _children(children)
246 #endif // DUNE_TYPETREE_COMPOSITENODE_HH
static const bool isPower
Mark this class as a non power in the dune-typetree.
Definition: compositenode.hh:41
std::shared_ptr< const typename std::tuple_element< k, ChildTypes >::type > ConstStorage
The const storage type of the child.
Definition: compositenode.hh:65
std::tuple_element< k, NodeStorage >::type Storage
The storage type of the child.
Definition: compositenode.hh:62
Definition: accumulate_static.hh:12
CompositeNode(const NodeStorage &children)
Initialize the CompositeNode with a copy of the passed-in storage type.
Definition: compositenode.hh:231
const NodeStorage & nodeStorage() const
Definition: compositenode.hh:128
CompositeNodeTag NodeTag
The type tag that describes a CompositeNode.
Definition: compositenode.hh:29
Tag designating a composite node.
Definition: nodetags.hh:22
const ImplementationDefined & child(Indices...indices)
Returns the child given by the list of indices.
Definition: compositenode.hh:185
ImplementationDefined child(Node &&node, Indices...indices)
Extracts the child of a node given by a sequence of compile-time and run-time indices.
Definition: childextraction.hh:472
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition: utility.hh:312
void setChild(typename Child< k >::Type &child, index_constant< k >={})
Sets the i-th child to the passed-in value.
Definition: compositenode.hh:116
CompositeNode()
Default constructor.
Definition: compositenode.hh:216
CompositeNode(std::shared_ptr< Children >...children)
Initialize the CompositeNode with copies of the passed in Storage objects.
Definition: compositenode.hh:226
typename impl::_is_flat_index< typename std::decay< T >::type >::type is_flat_index
Type trait that determines whether T is a flat index in the context of child extraction.
Definition: childextraction.hh:627
std::tuple< Children...> ChildTypes
A tuple storing the types of all children.
Definition: compositenode.hh:35
Base class for composite nodes based on variadic templates.
Definition: compositenode.hh:23
Access to the type and storage type of the i-th child.
Definition: compositenode.hh:51
static const bool isComposite
Mark this class as a composite in the dune-typetree.
Definition: compositenode.hh:44
static const bool isLeaf
Mark this class as non leaf in the dune-typetree.
Definition: compositenode.hh:38
std::tuple< std::shared_ptr< Children >... > NodeStorage
The type used for storing the children.
Definition: compositenode.hh:32
Child< k >::ConstStorage childStorage(index_constant< k >={}) const
Returns the storage of the i-th child (const version).
Definition: compositenode.hh:109
Child< k >::Type & child(index_constant< k >={})
Returns the i-th child.
Definition: compositenode.hh:76
void setChild(typename Child< k >::Storage child, index_constant< k >={})
Sets the storage of the i-th child to the passed-in value.
Definition: compositenode.hh:123
CompositeNode(Args &&...args)
Initialize all children with the passed-in objects.
Definition: compositenode.hh:221
std::tuple_element< k, ChildTypes >::type type
The type of the child.
Definition: compositenode.hh:59
ImplementationDefined & child(Indices...indices)
Returns the child given by the list of indices.
Definition: compositenode.hh:162
static const std::size_t CHILDREN
The number of children.
Definition: compositenode.hh:47
std::tuple_element< k, ChildTypes >::type Type
The type of the child.
Definition: compositenode.hh:53
Child< k >::Storage childStorage(index_constant< k >={})
Returns the storage of the i-th child.
Definition: compositenode.hh:96
const Child< k >::Type & child(index_constant< k >={}) const
Returns the i-th child (const version).
Definition: compositenode.hh:86