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/Global.h>
5#include <knowCore/ConstExplicitlySharedDataPointer.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
33 protected:
34 virtual void accept(details::AbstractNodeVisitorAdaptor* _node, void* _r, void* _parameter) const = 0;
35 };
37 template<typename... _T_>
39 {
40 static_assert(std::conjunction_v<std::is_base_of<Node, _T_>...> , "All types should subclass Node");
41 public:
42 Alternative() : m_type(NodeType::__Invalid__)
43 {
44 }
45 template<typename _To_, std::enable_if_t<knowCore::details::contains_v<_To_, _T_...>, int> = 0>
46 Alternative(knowCore::ConstExplicitlySharedDataPointer<_To_> _v) : m_node(_v), m_type(_v->type())
47 {}
48 template<typename _To_, std::enable_if_t<knowCore::details::contains_v<_To_, _T_...>, int> = 0>
49 Alternative(_To_* _v) : m_node(_v), m_type(_v->type())
50 {}
51 NodeType type() const { return m_type; }
52 template<typename _To_, std::enable_if_t<knowCore::details::contains_v<_To_, _T_...>, int> = 0>
54 {
55 return m_node.s_cast<_To_>();
56 }
57 bool isValid() const { return m_type != NodeType::__Invalid__; }
58 NodeCSP node() const { return m_node; }
59 private:
60 NodeCSP m_node;
61 NodeType m_type;
62 };
63}
64
65#endif
Definition Node.h:21