kDB: Knowledge DataBase
Loading...
Searching...
No Matches
NodeVisitor.h
1#include "AbstractNodeVisitor.h"
2
3namespace kDB::SPARQL::Algebra
4{
5 namespace details
6 {
7 template<typename _TVisitor_, typename _T_>
8 struct Call
9 {
10 template<int... S>
11 static _TVisitor_::ReturnType accept(_TVisitor_* _visitor, const _T_& _t,
12 const _TVisitor_::ParametersTuple& _parameters,
13 std::index_sequence<S...>)
14 {
15 return _visitor->visit(_t, std::get<S>(_parameters)...);
16 }
17 };
18 template<typename _TVisitor_>
19 struct Call<_TVisitor_, NodeCSP>
20 {
21 template<int... S>
22 static _TVisitor_::ReturnType accept(_TVisitor_* _visitor, const NodeCSP& _t,
23 const _TVisitor_::ParametersTuple& _parameters,
24 std::index_sequence<S...>)
25 {
26 return _visitor->accept(_t, std::get<S>(_parameters)...);
27 }
28 };
29
30 template<typename _T_>
32 {
33 typedef _T_ type;
34 };
35 template<typename _T_>
36 struct RemoveConstExplicitlySharedDataPointer<knowCore::ConstExplicitlySharedDataPointer<_T_>>
37 {
38 typedef _T_ type;
39 };
40
41 template<typename _T_>
42 using RemoveConstExplicitlySharedDataPointerT =
43 typename RemoveConstExplicitlySharedDataPointer<_T_>::type;
44
45 template<typename _TVisitor_, typename _T_>
47
48 template<typename _TVisitor_, typename _T_>
49 requires std::is_base_of_v<Node, _T_>
50 struct VisitorHelper<_TVisitor_, knowCore::ConstExplicitlySharedDataPointer<_T_>>
51 {
52 static _TVisitor_::ReturnType call(_TVisitor_* _visitor,
54 const _TVisitor_::ParametersTuple& _parameters)
55 {
56 if(_t)
57 {
59 _visitor, _t, _parameters, std::make_index_sequence<_TVisitor_::ParametersCount>());
60 }
61 return typename _TVisitor_::ReturnType();
62 }
63 };
64 template<typename _TVisitor_, typename _T_>
65 requires(not std::is_base_of_v<Node, RemoveConstExplicitlySharedDataPointerT<_T_>>
66 and not knowCore::details::is_specialisation_of_v<QList, _T_>
67 and not knowCore::details::is_specialisation_of_v<Alternative, _T_>)
69 {
70 static _TVisitor_::ReturnType call(_TVisitor_* _visitor, const _T_& _t,
71 const _TVisitor_::ParametersTuple& _parameters)
72 {
73 Q_UNUSED(_t);
74 Q_UNUSED(_visitor);
75 Q_UNUSED(_parameters);
76 return typename _TVisitor_::ReturnType();
77 }
78 };
79 template<typename _TVisitor_, typename... _T_>
80 struct VisitorHelper<_TVisitor_, Alternative<_T_...>>
81 {
82 static _TVisitor_::ReturnType call(_TVisitor_* _visitor, const Alternative<_T_...>& _t,
83 const _TVisitor_::ParametersTuple& _parameters)
84 {
85 if(_t.node())
86 {
88 _visitor, _t.node(), _parameters,
89 std::make_index_sequence<_TVisitor_::ParametersCount>());
90 }
91 else
92 {
93 return typename _TVisitor_::ReturnType();
94 }
95 }
96 };
97 template<typename _TVisitor_, typename _T_>
98 requires(std::is_base_of_v<Node, RemoveConstExplicitlySharedDataPointerT<_T_>>
99 or knowCore::details::is_specialisation_of_v<Alternative, _T_>)
100 struct VisitorHelper<_TVisitor_, QList<_T_>>
101 {
102 static _TVisitor_::ReturnType call(_TVisitor_* _visitor, const QList<_T_>& _t,
103 const _TVisitor_::ParametersTuple& _parameters)
104 {
105 for(const _T_& t : _t)
106 {
107 VisitorHelper<_TVisitor_, _T_>::call(_visitor, t, _parameters);
108 }
109 return typename _TVisitor_::ReturnType();
110 }
111 };
112 template<typename _TVisitor_, typename _T_>
113 requires(not std::is_base_of_v<Node, RemoveConstExplicitlySharedDataPointerT<_T_>>
114 and not knowCore::details::is_specialisation_of_v<Alternative, _T_>)
115 struct VisitorHelper<_TVisitor_, QList<_T_>>
116 {
117 static _TVisitor_::ReturnType call(_TVisitor_* _visitor, const QList<_T_>& _t,
118 const _TVisitor_::ParametersTuple& _parameters)
119 {
120 Q_UNUSED(_t);
121 Q_UNUSED(_visitor);
122 Q_UNUSED(_parameters);
123 return typename _TVisitor_::ReturnType();
124 }
125 };
126 } // namespace details
127 // TODO rename to TraverseNodeVisitor?
128 template<typename _TR_, typename... _TArgs_>
129 class NodeVisitor : public AbstractNodeVisitor<_TR_, _TArgs_...>
130 {
131 template<typename _TVisitor_, typename _T_>
132 friend struct details::Call;
133 public:
134 NodeVisitor() {}
135 ~NodeVisitor() {}
136 private:
137#define KDB_SPARQL_GENERATE_VISIT_CALL(_KLASS_NAME_, _TYPE_, _NAME_) \
138 details::VisitorHelper<NodeVisitor<_TR_, _TArgs_...>, _TYPE_>::call( \
139 this, _node->_NAME_(), std::make_tuple(_parameters...));
140
141#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
142 _TR_ visit(_KLASS_NAME_##CSP _node, const _TArgs_&... _parameters) override \
143 { \
144 _MEMBER_DEF_(_KLASS_NAME_, KDB_SPARQL_GENERATE_VISIT_CALL) \
145 return _TR_(); \
146 }
147#include "NodesDefs.h"
148#undef KDB_SPARQL_ALGEBRA_GENERATE
149#undef KDB_SPARQL_GENERATE_VISIT_CALL
150 };
151} // namespace kDB::SPARQL::Algebra
Definition Revision.h:9
Definition NodeVisitor.h:130
Definition NodeVisitor.h:9