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;
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() {}
49 _TR_
start(
NodeCSP _node,
const _TArgs_&... _args) {
return accept(_node, _args...); }
50#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
52 virtual _TR_ visit(_KLASS_NAME_##CSP _node, const _TArgs_&... _parameter) = 0; \
53 virtual void call_visit(_KLASS_NAME_##CSP _node, void* _r, void* _parameter) override \
55 typedef _TR_ (AbstractNodeVisitor::*F)(_KLASS_NAME_##CSP _node, const _TArgs_&...); \
56 *reinterpret_cast<_TR_*>(_r) \
57 = std::apply(F(&AbstractNodeVisitor::visit), \
58 std::tuple_cat(std::make_tuple(this, _node), \
59 *reinterpret_cast<ParametersTuple*>(_parameter))); \
62#undef KDB_SPARQL_ALGEBRA_GENERATE
64 _TR_ accept(
NodeCSP _node,
const _TArgs_... _arguments)
66 return accept(_node.data(), _arguments...);
68 _TR_ accept(
const Node* _node,
const _TArgs_... _arguments)
73 ParametersTuple pt = std::make_tuple(_arguments...);
74 _node->accept(
this, &r, &pt);
80 template<
typename... _TArgs_>
85 using ParametersTuple = std::tuple<_TArgs_...>;
86 static constexpr std::size_t ParametersCount =
sizeof...(_TArgs_);
87 using ReturnType = void;
95 void start(
NodeCSP _node,
const _TArgs_&... _args) { accept(_node, _args...); }
96#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
98 virtual void visit(_KLASS_NAME_##CSP _node, const _TArgs_&... _parameter) = 0; \
99 virtual void call_visit(_KLASS_NAME_##CSP _node, void*, void* _parameter) override \
101 typedef void (AbstractNodeVisitor::*F)(_KLASS_NAME_##CSP _node, const _TArgs_&...); \
102 std::apply(F(&AbstractNodeVisitor::visit), \
103 std::tuple_cat(std::make_tuple(this, _node), \
104 *reinterpret_cast<ParametersTuple*>(_parameter))); \
106#include "NodesDefs.h"
107#undef KDB_SPARQL_ALGEBRA_GENERATE
109 void accept(
NodeCSP _node,
const _TArgs_&... _arguments)
111 accept(_node.data(), _arguments...);
113 void accept(
const Node* _node,
const _TArgs_&... _arguments)
117 ParametersTuple pt = std::make_tuple(_arguments...);
118 _node->accept(
this,
nullptr, &pt);
void start(NodeCSP _node, const _TArgs_ &... _args)
Definition AbstractNodeVisitor.h:95
_TR_ start(NodeCSP _node, const _TArgs_ &... _args)
Definition AbstractNodeVisitor.h:49
Definition AbstractNodeVisitor.h:11