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