3#include "spark/patterns/Composite.h"
4#include "spark/patterns/details/Traverser.h"
8namespace spark::patterns
15 template <
typename NodeType,
typename... FnArgsTypes>
19 using FnType = std::function<void(NodeType*, FnArgsTypes&&...)>;
21 explicit Traverser(FnType apply, FnType pre = {}, FnType post = {})
22 : m_pre(std::move(pre)), m_apply(std::move(apply)), m_post(std::move(post)) {}
24 void apply(NodeType* child, FnArgsTypes&&... args)
28 std::invoke(m_apply, child, std::forward<FnArgsTypes>(args)...);
31 void pre(NodeType* child, FnArgsTypes&&... args)
35 std::invoke(m_pre, child, std::forward<FnArgsTypes>(args)...);
38 void post(NodeType* child, FnArgsTypes&&... args)
42 std::invoke(m_post, child, std::forward<FnArgsTypes>(args)...);
46 FnType m_pre, m_apply, m_post;
60 template <
typename NodeType,
typename... FnArgsTypes>
61 Traverser<NodeType, FnArgsTypes...> make_traverser(
typename Traverser<NodeType, FnArgsTypes...>::FnType apply,
62 typename Traverser<NodeType, FnArgsTypes...>::FnType pre = {},
63 typename Traverser<NodeType, FnArgsTypes...>::FnType post = {})
65 return Traverser<NodeType, FnArgsTypes...>(std::move(apply), std::move(pre), std::move(post));
80 template <
typename NodeType,
typename... FnArgsTypes>
81 void traverse_tree(NodeType* parent, Traverser<NodeType, FnArgsTypes...>& traverser, FnArgsTypes&&... context)
A base class for any traverser used by the traverse_tree function.
Definition Traverser.h:17
static void exec(NodeType *container, Traverser &traverser, FnArgsTypes &&... args)
Traverses the given tree using the given traverser.
Definition Traverser.h:27