SPARK  0.1.0
A general purpose game engine written in C++.
Loading...
Searching...
No Matches
Traverser.h
1#pragma once
2
3#include "spark/patterns/Composite.h"
4#include "spark/patterns/details/Traverser.h"
5
6#include <functional>
7
8namespace spark::patterns
9{
15 template <typename NodeType, typename... FnArgsTypes>
17 {
18 public:
19 using FnType = std::function<void(NodeType*, FnArgsTypes&&...)>;
20
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)) {}
23
24 void apply(NodeType* child, FnArgsTypes&&... args)
25 {
26 if (!m_apply)
27 return;
28 std::invoke(m_apply, child, std::forward<FnArgsTypes>(args)...);
29 }
30
31 void pre(NodeType* child, FnArgsTypes&&... args)
32 {
33 if (!m_pre)
34 return;
35 std::invoke(m_pre, child, std::forward<FnArgsTypes>(args)...);
36 }
37
38 void post(NodeType* child, FnArgsTypes&&... args)
39 {
40 if (!m_post)
41 return;
42 std::invoke(m_post, child, std::forward<FnArgsTypes>(args)...);
43 }
44
45 private:
46 FnType m_pre, m_apply, m_post;
47 };
48
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 = {})
64 {
65 return Traverser<NodeType, FnArgsTypes...>(std::move(apply), std::move(pre), std::move(post));
66 }
67
80 template <typename NodeType, typename... FnArgsTypes>
81 void traverse_tree(NodeType* parent, Traverser<NodeType, FnArgsTypes...>& traverser, FnArgsTypes&&... context)
82 {
83 details::TreeTraverserCaller<NodeType, FnArgsTypes...>::exec(parent, traverser, std::forward<FnArgsTypes>(context)...);
84 }
85}
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