kDB: Knowledge DataBase
Loading...
Searching...
No Matches
Node.h
1#ifndef _KDB_SPARQL_ALGEBRA_ABSTRACT_NODE_H_
2#define _KDB_SPARQL_ALGEBRA_ABSTRACT_NODE_H_
3
4#include <knowCore/ConstExplicitlySharedDataPointer.h>
5#include <knowCore/Global.h>
6
7#include "NodeType.h"
8
9#include <kDB/Forward.h>
10
11namespace kDB::SPARQL::Algebra
12{
13 template<typename _TR_, typename... _TArgs_>
15 namespace details
16 {
17 class AbstractNodeVisitorAdaptor;
18 }
19
20 class Node : public QSharedData
21 {
22 template<typename _TR_, typename... _TArgs_>
23 friend class AbstractNodeVisitor;
24 protected:
25 struct Private;
26 Private* d;
27 Node(NodeType _type, Private*);
28 public:
29 virtual ~Node();
30 public:
31 NodeType type() const;
32 protected:
33 virtual void accept(details::AbstractNodeVisitorAdaptor* _node, void* _r,
34 void* _parameter) const
35 = 0;
36 };
38 template<typename... _T_>
40 {
41 static_assert(std::conjunction_v<std::is_base_of<Node, _T_>...>,
42 "All types should subclass Node");
43 public:
44 Alternative() : m_type(NodeType::__Invalid__) {}
45 template<typename _To_>
46 requires knowCore::details::contains_v<_To_, _T_...>
48 : m_node(_v), m_type(_v->type())
49 {
50 }
51 template<typename _To_>
52 requires knowCore::details::contains_v<_To_, _T_...>
53 Alternative(_To_* _v) : m_node(_v), m_type(_v->type())
54 {
55 }
56 NodeType type() const { return m_type; }
57 template<typename _To_>
58 requires knowCore::details::contains_v<_To_, _T_...>
60 {
61 return m_node.s_cast<_To_>();
62 }
63 bool isValid() const { return m_type != NodeType::__Invalid__; }
64 NodeCSP node() const { return m_node; }
65 private:
66 NodeCSP m_node;
67 NodeType m_type;
68 };
69} // namespace kDB::SPARQL::Algebra
70
71#endif
Definition Node.h:21