5#ifndef QDEFERREDPOINTER_P_H
6#define QDEFERREDPOINTER_P_H
18#include <qtqmlcompilerexports.h>
20#include <QtCore/private/qglobal_p.h>
21#include <QtCore/qsharedpointer.h>
26class QDeferredSharedPointer;
31template<
typename U,
typename F>
41 friend class QDeferredSharedPointer<
const T>;
43 friend class QDeferredSharedPointer<
T>;
45 void populate(
const QSharedPointer<T> &)
const;
49class QDeferredSharedPointer
52 using Factory = QDeferredFactory<std::remove_const_t<T>>;
54 Q_NODISCARD_CTOR QDeferredSharedPointer() =
default;
56 Q_NODISCARD_CTOR QDeferredSharedPointer(QSharedPointer<T> data)
57 : m_data(std::move(data))
60 Q_NODISCARD_CTOR QDeferredSharedPointer(QWeakPointer<T> data)
61 : m_data(std::move(data))
64 Q_NODISCARD_CTOR QDeferredSharedPointer(QSharedPointer<T> data, QSharedPointer<Factory> factory)
65 : m_data(std::move(data)), m_factory(std::move(factory))
70 Q_ASSERT(!m_data.isNull() || m_factory.isNull());
73 [[nodiscard]] operator QSharedPointer<T>()
const
79 operator QDeferredSharedPointer<
const T>()
const {
return { m_data, m_factory }; }
81 [[nodiscard]] T &operator*()
const { lazyLoad();
return m_data.operator*(); }
82 [[nodiscard]] T *operator->()
const { lazyLoad();
return m_data.operator->(); }
86 return m_data.isNull();
89 explicit operator
bool()
const noexcept {
return !isNull(); }
90 bool operator !()
const noexcept {
return isNull(); }
92 [[nodiscard]] T *data()
const { lazyLoad();
return m_data.data(); }
93 [[nodiscard]] T *get()
const {
return data(); }
95 friend size_t qHash(
const QDeferredSharedPointer &ptr, size_t seed = 0)
98 return qHash(ptr.m_data, seed);
101 friend bool operator==(
const QDeferredSharedPointer &a,
const QDeferredSharedPointer &b)
105 return a.m_data == b.m_data;
108 friend bool operator!=(
const QDeferredSharedPointer &a,
const QDeferredSharedPointer &b)
113 friend bool operator<(
const QDeferredSharedPointer &a,
const QDeferredSharedPointer &b)
115 return a.m_data < b.m_data;
118 friend bool operator<=(
const QDeferredSharedPointer &a,
const QDeferredSharedPointer &b)
120 return a.m_data <= b.m_data;
123 friend bool operator>(
const QDeferredSharedPointer &a,
const QDeferredSharedPointer &b)
125 return a.m_data > b.m_data;
128 friend bool operator>=(
const QDeferredSharedPointer &a,
const QDeferredSharedPointer &b)
130 return a.m_data >= b.m_data;
133 template <
typename U>
134 friend bool operator==(
const QDeferredSharedPointer &a,
const QSharedPointer<U> &b)
136 return a.m_data == b;
139 template <
typename U>
140 friend bool operator!=(
const QDeferredSharedPointer &a,
const QSharedPointer<U> &b)
145 template <
typename U>
146 friend bool operator==(
const QSharedPointer<U> &a,
const QDeferredSharedPointer &b)
151 template <
typename U>
152 friend bool operator!=(
const QSharedPointer<U> &a,
const QDeferredSharedPointer &b)
157 Factory *factory()
const
159 return (m_factory && m_factory->isValid()) ? m_factory.data() :
nullptr;
163 friend class QDeferredWeakPointer<T>;
164 template<
typename U,
typename F>
165 friend void resetFactoryImpl(QDeferredSharedPointer<U>&, F&&);
167 void lazyLoad()
const
169 if (Factory *f = factory()) {
170 Factory localFactory;
171 std::swap(localFactory, *f);
172 localFactory.populate(m_data.
template constCast<std::remove_const_t<T>>());
176 QSharedPointer<T> m_data;
177 QSharedPointer<Factory> m_factory;
243 QWeakPointer<Factory> m_factory;
Combined button and popup list for selecting options.
static QString toNumericString(double value)
static QString messageTypeForMethod(const QString &method)
static QString derefContentPointer(const QString &contentPointer)
static bool canTypeBeAffectedBySideEffects(const QQmlJSTypeResolver *typeResolver, const QQmlJSRegisterContent &baseType)
#define BYTECODE_UNIMPLEMENTED()
#define INJECT_TRACE_INFO(function)
static QString registerName(int registerIndex, int offset)
static QString minExpression(int argc)
static QString maxExpression(int argc)
static bool isTypeStorable(const QQmlJSTypeResolver *resolver, const QQmlJSScope::ConstPtr &type)
void resetFactoryImpl(QDeferredSharedPointer< T > &pointer, U &&factory)