30 return std::unique_ptr<Node>{
static_cast<Node*
>(
static_cast<const Object&
>(*this).
clone().release())};
36 template<std::derived_from<Node> TNode = Node>
39 return parent(identity<TNode>{});
42 template<std::derived_from<Node> TNode = Node>
51 template<std::derived_from<Node> TNode = Node>
52 const TNode*
child(
size_t pos)
const
54 return child(pos, identity<TNode>{});
57 template<std::derived_from<Node> TNode = Node>
58 const TNode*
child(std::string_view child_name)
const
60 return child(child_name, identity<TNode>{});
63 template<std::derived_from<Node> TNode = Node>
69 template<std::derived_from<Node> TNode = Node>
72 return upd_child(child_name, identity<TNode>{});
75 template<std::derived_from<Node> TNode = Node>
78 return add_child(std::move(node_ptr), identity<TNode>{});
81 template<std::derived_from<Node> TNode,
typename... Args>
82 requires std::constructible_from<TNode, Args&&...>
85 return add_child(std::make_unique<TNode>(std::forward<Args>(args)...));
94 template<std::derived_from<Node> TNode = Node>
97 return find(node_path, identity<TNode>{});
100 template<std::derived_from<Node> TNode = Node>
103 return dynamic_cast<TNode*
>(
find_mut(node_path, identity<TNode>{}));
117 template<std::derived_from<Node> TDerived>
118 const TDerived*
parent(identity<TDerived>)
const
120 return dynamic_cast<const TDerived*
>(
parent(identity<Node>{}));
124 template<std::derived_from<Node> TDerived>
127 return dynamic_cast<TDerived*
>(
upd_parent(identity<Node>{}));
131 template<std::derived_from<Node> TDerived>
132 const TDerived*
child(
size_t pos, identity<TDerived>)
const
134 return dynamic_cast<const TDerived*
>(
child(pos, identity<Node>{}));
136 const Node*
child(
size_t, identity<Node>)
const;
138 template<std::derived_from<Node> TDerived>
139 const TDerived*
child(std::string_view child_name, identity<TDerived>)
const
141 return dynamic_cast<const TDerived*
>(
child(child_name, identity<Node>{}));
143 const Node*
child(std::string_view, identity<Node>)
const;
145 template<std::derived_from<Node> TDerived>
146 TDerived*
upd_child(
size_t pos, identity<TDerived>)
148 return dynamic_cast<TDerived*
>(
upd_child(pos, identity<Node>{}));
152 template<std::derived_from<Node> TDerived>
153 TDerived*
upd_child(std::string_view child_name, identity<TDerived>)
155 return dynamic_cast<TDerived*
>(
upd_child(child_name, identity<Node>{}));
157 Node*
upd_child(std::string_view child_name, identity<Node>);
159 template<std::derived_from<Node> TDerived>
160 TDerived&
add_child(std::unique_ptr<TDerived> node_ptr, identity<TDerived>)
162 TDerived& rv = *node_ptr;
163 add_child(std::move(node_ptr), identity<Node>{});
168 template<std::derived_from<Node> TDerived>
169 const TDerived*
find(
const NodePath& node_path, identity<TDerived>)
const
171 return dynamic_cast<const TDerived*
>(
find(node_path, identity<Node>{}));
173 const Node*
find(
const NodePath&, identity<Node>)
const;
175 template<std::derived_from<Node> TDerived>
176 TDerived*
find_mut(
const NodePath& node_path, identity<TDerived>)
178 return dynamic_cast<TDerived*
>(
find_mut(node_path, identity<Node>{}));