knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Reference.h
1#pragma once
2
3#include <QExplicitlySharedDataPointer>
4
5#include <clog_qt>
6#include <cres_qt>
7
8#include "Global.h"
9
10#define KNOWCORE_DEFINE_REFERENCE(_KLASS_, _INTERFACE_, ...) \
11 class _KLASS_ : public knowCore::Reference<_INTERFACE_> \
12 { \
13 using knowCore::Reference<_INTERFACE_>::interface; \
14 public: \
15 using InterfaceType = _INTERFACE_; \
16 public: \
17 _KLASS_(InterfaceType* _lf) : knowCore::Reference<InterfaceType>(_lf) {} \
18 _KLASS_() = default; \
19 _KLASS_(const _KLASS_&) = default; \
20 _KLASS_& operator=(const _KLASS_&) = default; \
21 ~_KLASS_() = default; \
22 KNOWCORE_UNLIST(__VA_ARGS__) \
23 };
24
25namespace knowCore
26{
27 template<typename _Interface_>
28 class Reference : protected _Interface_
29 {
30 template<typename _OInterface_>
31 friend class Reference;
32 public:
33 using InterfaceType = _Interface_;
34 protected:
35 Reference(InterfaceType* _interface) : d(new Private) { d->interface = _interface; }
36 public:
37 Reference() = default;
38 Reference(const Reference&) = default;
39 Reference& operator=(const Reference&) = default;
40 ~Reference() = default;
41 template<typename _T_>
42 cres_qresult<_T_> cast() const
43 {
44 if(dynamic_cast<const typename _T_::InterfaceType*>(interface()))
45 {
46 _T_ r;
47 *r.d
48 = *reinterpret_cast<typename _T_::Private*>(d); // TODO not pretty, find a better solution
49 return cres_success(r);
50 }
51 else
52 {
53 return cres_failure("Cannot cast from '{} to '{}'", prettyTypename<InterfaceType>(),
54 prettyTypename<_T_::InterfaceType>());
55 }
56 }
60 bool isValid() const { return d and d->interface; }
61 protected:
62 const InterfaceType* interface() const { return d->interface; }
63 InterfaceType* interface() { return d->interface; }
64 private:
65 struct Private : public QSharedData
66 {
67 ~Private() { delete interface; }
68 InterfaceType* interface = nullptr;
69 };
70 QExplicitlySharedDataPointer<Private> d;
71 };
72} // namespace knowCore
Definition Reference.h:29
bool isValid() const
Definition Reference.h:60