summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qvariant.h
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-09-10 18:36:27 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-09-14 12:41:00 +0200
commit721116de309f1933fad788fe4272c0d5c12b9909 (patch)
tree8cdd34d2f1c8cffbb31b05e448fbb7494082ad6b /src/corelib/kernel/qvariant.h
parentcdb9ffd7e1e075a5fafb1477e2e87bef0b3fa49d (diff)
Add QVariantRef, QVariantPointer, QVariantConstPointer
Change-Id: Ia329265826ab2f76e77ac14bb8d8e415a1b41dd6 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/kernel/qvariant.h')
-rw-r--r--src/corelib/kernel/qvariant.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h
index ad766c9a8e..796dd80fd7 100644
--- a/src/corelib/kernel/qvariant.h
+++ b/src/corelib/kernel/qvariant.h
@@ -662,6 +662,55 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QVariant &);
Q_CORE_EXPORT QDebug operator<<(QDebug, const QVariant::Type);
#endif
+template<typename Pointer>
+class Q_CORE_EXPORT QVariantRef
+{
+private:
+ const Pointer *m_pointer = nullptr;
+
+public:
+ explicit QVariantRef(const Pointer *reference) : m_pointer(reference) {}
+ QVariantRef(const QVariantRef &) = default;
+ QVariantRef(QVariantRef &&) = default;
+ ~QVariantRef() = default;
+
+ operator QVariant() const;
+ QVariantRef &operator=(const QVariant &value);
+ QVariantRef &operator=(const QVariantRef &value) { return operator=(QVariant(value)); }
+ QVariantRef &operator=(QVariantRef &&value) { return operator=(QVariant(value)); }
+
+ friend void swap(QVariantRef a, QVariantRef b)
+ {
+ QVariant tmp = a;
+ a = b;
+ b = std::move(tmp);
+ }
+};
+
+class Q_CORE_EXPORT QVariantConstPointer
+{
+private:
+ QVariant m_variant;
+
+public:
+ explicit QVariantConstPointer(QVariant variant);
+
+ QVariant operator*() const;
+ const QVariant *operator->() const;
+};
+
+template<typename Pointer>
+class Q_CORE_EXPORT QVariantPointer
+{
+private:
+ const Pointer *m_pointer = nullptr;
+
+public:
+ explicit QVariantPointer(const Pointer *pointer) : m_pointer(pointer) {}
+ QVariantRef<Pointer> operator*() const { return QVariantRef<Pointer>(m_pointer); }
+ Pointer operator->() const { return *m_pointer; }
+};
+
QT_END_NAMESPACE
#endif // QVARIANT_H