1#ifndef _KDB_SPARQL_ALGEBRA_ABSTRACT_NODE_VISITOR_H_
2#define _KDB_SPARQL_ALGEBRA_ABSTRACT_NODE_VISITOR_H_
6namespace kDB::SPARQL::Algebra
15 #define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
16 virtual void call_visit(_KLASS_NAME_ ## CSP _node, void* _r, void* _parameter) = 0;
17 #include "NodesDefs.h"
18 #undef KDB_SPARQL_ALGEBRA_GENERATE
34 template<
typename _TR_,
typename... _TArgs_>
39 using ParametersTuple = std::tuple<_TArgs_...>;
40 static constexpr std::size_t ParametersCount =
sizeof...(_TArgs_);
41 using ReturnType = _TR_;
44 ~AbstractNodeVisitor() {}
51 return accept(_node, _args...);
53#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
55 virtual _TR_ visit(_KLASS_NAME_ ## CSP _node, const _TArgs_&... _parameter) = 0; \
56 virtual void call_visit(_KLASS_NAME_ ## CSP _node, void* _r, void* _parameter) override \
58 typedef _TR_ (AbstractNodeVisitor::* F)(_KLASS_NAME_ ## CSP _node, const _TArgs_&...); \
59 *reinterpret_cast<_TR_*>(_r) = std::apply(F(&AbstractNodeVisitor::visit), std::tuple_cat(std::make_tuple(this, _node), \
60 *reinterpret_cast<ParametersTuple*>(_parameter))); \
63#undef KDB_SPARQL_ALGEBRA_GENERATE
65 _TR_ accept(
NodeCSP _node,
const _TArgs_... _arguments)
67 return accept(_node.data(), _arguments...);
69 _TR_ accept(
const Node* _node,
const _TArgs_... _arguments)
74 ParametersTuple pt = std::make_tuple(_arguments...);
75 _node->accept(
this, &r, &pt);
81 template<
typename... _TArgs_>
86 using ParametersTuple = std::tuple<_TArgs_...>;
87 static constexpr std::size_t ParametersCount =
sizeof...(_TArgs_);
88 using ReturnType = void;
98 accept(_node, _args...);
100#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
102 virtual void visit(_KLASS_NAME_ ## CSP _node, const _TArgs_&... _parameter) = 0; \
103 virtual void call_visit(_KLASS_NAME_ ## CSP _node, void*, void* _parameter) override \
105 typedef void (AbstractNodeVisitor::* F)(_KLASS_NAME_ ## CSP _node, const _TArgs_&...); \
106 std::apply(F(&AbstractNodeVisitor::visit), std::tuple_cat(std::make_tuple(this, _node), *reinterpret_cast<ParametersTuple*>(_parameter) )); \
108#include "NodesDefs.h"
109#undef KDB_SPARQL_ALGEBRA_GENERATE
111 void accept(
NodeCSP _node,
const _TArgs_&... _arguments)
113 accept(_node.data(), _arguments...);
115 void accept(
const Node* _node,
const _TArgs_&... _arguments)
119 ParametersTuple pt = std::make_tuple(_arguments...);
120 _node->accept(
this,
nullptr, &pt);
void start(NodeCSP _node, const _TArgs_ &... _args)
Definition AbstractNodeVisitor.h:96
_TR_ start(NodeCSP _node, const _TArgs_ &... _args)
Definition AbstractNodeVisitor.h:49
Definition AbstractNodeVisitor.h:11