4#ifndef DUNE_TYPETREE_PROXYNODE_HH
5#define DUNE_TYPETREE_PROXYNODE_HH
10#include <dune/common/shared_ptr.hh>
11#include <dune/common/indices.hh>
12#include <dune/common/std/type_traits.hh>
22 template<
typename Node>
26 template<
typename ProxiedNode>
30 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<ProxiedNode>::type>::value;
32 template<std::
size_t k>
35 static const bool value = !proxiedNodeIsConst;
40 template<
bool enabled = !proxiedNodeIsConst>
41 typename std::enable_if<enabled,Node&>::type
44 return static_cast<Node&
>(*this);
47 const Node& node ()
const
49 return static_cast<const Node&
>(*this);
55 template<std::
size_t k>
57 :
public ProxiedNode::template
Child<k>
67 template<std::size_t k,
68 typename std::enable_if<lazy_enabled<k>::value,
int>::type = 0>
69 auto&
child (index_constant<k> = {})
71 return node().proxiedNode().template child<k>();
78 template<std::
size_t k>
79 const auto&
child (index_constant<k> = {})
const
81 return node().proxiedNode().template child<k>();
88 template<std::size_t k,
89 typename std::enable_if<lazy_enabled<k>::value,
int>::type = 0>
92 return node().proxiedNode().template childStorage<k>();
102 template<std::
size_t k>
105 return node().proxiedNode().template childStorage<k>();
109 template<std::
size_t k,
class ProxyChild>
110 void setChild (ProxyChild&&
child,
typename std::enable_if<lazy_enabled<k>::value,
void*>::type = 0)
112 node().proxiedNode().template setChild<k>(std::forward<ProxyChild>(
child));
117 return node().proxiedNode().nodeStorage();
128 template<
typename ProxiedNode>
135 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<ProxiedNode>::type>::value;
137 template<
bool enabled = !proxiedNodeIsConst>
138 typename std::enable_if<enabled,Node&>::type
141 return static_cast<Node&
>(*this);
144 const Node& node ()
const
146 return static_cast<const Node&
>(*this);
158 template<
bool enabled = !proxiedNodeIsConst,
159 typename std::enable_if<enabled, int>::type = 0>
162 return node().proxiedNode().child(i);
169 const auto&
child (std::size_t i)
const
171 return node().proxiedNode().child(i);
178 template<
bool enabled = !proxiedNodeIsConst,
179 typename std::enable_if<enabled, int>::type = 0>
182 return node().proxiedNode().childStorage(i);
194 return node().proxiedNode().childStorage(i);
198 template<
class ProxyChild,
bool enabled = !proxiedNodeIsConst>
199 void setChild (std::size_t i, ProxyChild&&
child,
typename std::enable_if<enabled,void*>::type = 0)
201 node().proxiedNode().setChild(i, std::forward<ProxyChild>(
child));
207 template<
typename Node,
typename NodeTag>
211 template<
typename Node>
217 template<
typename Node>
226 template<
typename Node>
242 template<
typename Node>
246 static const bool proxiedNodeIsConst = std::is_const<typename std::remove_reference<Node>::type>::value;
249 using HasStaticDegree = index_constant<N::degree()>;
252 static constexpr bool hasStaticDegree = Std::is_detected<HasStaticDegree, N>::value;
276 template <
class N = Node,
277 std::enable_if_t<hasStaticDegree<N>,
int> = 0>
283 template <
class N = Node,
284 std::enable_if_t<not hasStaticDegree<N>,
int> = 0>
297 template<
bool enabled = !proxiedNodeIsConst>
298 typename std::enable_if<enabled,Node&>::type
311 template<
bool enabled = !proxiedNodeIsConst>
312 typename std::enable_if<enabled,std::shared_ptr<Node> >::type
330 : _node(stackobject_to_shared_ptr(node))
334 : _node(std::move(node))
341 std::shared_ptr<Node> _node;
typename std::decay_t< Node >::NodeTag NodeTag
Returns the node tag of the given Node.
Definition: nodeinterface.hh:67
decltype(Node::degree()) StaticDegree
Returns the statically known degree of the given Node type as a std::integral_constant.
Definition: nodeinterface.hh:104
Definition: accumulate_static.hh:13
Tag designating a leaf node.
Definition: nodetags.hh:16
Tag designating a power node.
Definition: nodetags.hh:19
Tag designating a composite node.
Definition: nodetags.hh:25
Base class for nodes acting as a proxy for an existing node.
Definition: proxynode.hh:245
ProxyNode(Node &node)
Definition: proxynode.hh:329
Dune::TypeTree::NodeTag< Node > NodeTag
Definition: proxynode.hh:262
static const bool isComposite
Mark this class as a composite in the dune-typetree.
Definition: proxynode.hh:271
static const bool isLeaf
Mark this class as non leaf in the dune-typetree.
Definition: proxynode.hh:265
static const bool isPower
Mark this class as a non power in the dune-typetree.
Definition: proxynode.hh:268
auto degree() const
Definition: proxynode.hh:285
std::enable_if< enabled, Node & >::type proxiedNode()
Returns the proxied node.
Definition: proxynode.hh:299
static const std::size_t CHILDREN
The number of children.
Definition: proxynode.hh:274
std::shared_ptr< const Node > proxiedNodeStorage() const
Returns the storage of the proxied node (const version).
Definition: proxynode.hh:319
Node ProxiedNode
Definition: proxynode.hh:260
std::enable_if< enabled, std::shared_ptr< Node > >::type proxiedNodeStorage()
Returns the storage of the proxied node.
Definition: proxynode.hh:313
static constexpr auto degree()
Definition: proxynode.hh:278
ProxyNode(std::shared_ptr< Node > node)
Definition: proxynode.hh:333
const Node & proxiedNode() const
Returns the proxied node (const version).
Definition: proxynode.hh:305
Mixin class providing methods for child access with compile-time parameter.
Definition: proxynode.hh:28
auto & child(index_constant< k >={})
Returns the i-th child.
Definition: proxynode.hh:69
void setChild(ProxyChild &&child, typename std::enable_if< lazy_enabled< k >::value, void * >::type=0)
Sets the i-th child to the passed-in value.
Definition: proxynode.hh:110
const ProxiedNode::NodeStorage & nodeStorage() const
Definition: proxynode.hh:115
auto childStorage(index_constant< k >={})
Returns the storage of the i-th child.
Definition: proxynode.hh:90
const auto & child(index_constant< k >={}) const
Returns the i-th child (const version).
Definition: proxynode.hh:79
auto childStorage(index_constant< k >={}) const
Returns the storage of the i-th child (const version).
Definition: proxynode.hh:103
Access to the type and storage type of the i-th child.
Definition: proxynode.hh:58
Mixin class providing methods for child access with run-time parameter.
Definition: proxynode.hh:131
auto & child(std::size_t i)
Returns the i-th child.
Definition: proxynode.hh:160
auto childStorage(std::size_t i) const
Returns the storage of the i-th child (const version).
Definition: proxynode.hh:192
void setChild(std::size_t i, ProxyChild &&child, typename std::enable_if< enabled, void * >::type=0)
Sets the i-th child to the passed-in value.
Definition: proxynode.hh:199
const auto & child(std::size_t i) const
Returns the i-th child (const version).
Definition: proxynode.hh:169
auto childStorage(std::size_t i)
Returns the storage of the i-th child.
Definition: proxynode.hh:180
Tag-based dispatch to appropriate base class that provides necessary functionality.
Definition: proxynode.hh:208
Node::NodeStorage NodeStorage
Definition: proxynode.hh:222
Node::ChildTypes ChildTypes
Definition: proxynode.hh:221
Node::NodeStorage NodeStorage
Definition: proxynode.hh:231
Node::ChildType ChildType
Definition: proxynode.hh:230