69 template <
typename T,
typename... Args>
70 using if_constructible = std::enable_if_t<
72 std::is_copy_constructible<q20::remove_cvref_t<T>>,
73 std::is_destructible<q20::remove_cvref_t<T>>,
74 std::is_constructible<q20::remove_cvref_t<T>, Args...>
79 using if_rvalue = std::enable_if_t<!std::is_reference_v<T>,
bool>;
81 struct CborValueStandIn { qint64 n;
void *c;
int t; };
86 inline PrivateShared() : ref(1) { }
88 static int computeOffset(PrivateShared *ps, size_t align);
89 static size_t computeAllocationSize(size_t size, size_t align);
90 static PrivateShared *create(size_t size, size_t align);
91 static void free(PrivateShared *p);
93 alignas(8) QAtomicInt ref;
96 const void *data()
const {
return reinterpret_cast<
const uchar *>(
this) + offset; }
97 void *data() {
return reinterpret_cast<uchar *>(
this) + offset; }
102 static constexpr size_t MaxInternalSize = 3 *
sizeof(
void *);
103 template <size_t S>
static constexpr bool FitsInInternalSize = S <= MaxInternalSize;
104 template<
typename T>
static constexpr bool CanUseInternalSpace =
105 (QTypeInfo<T>::isRelocatable && FitsInInternalSize<
sizeof(T)> &&
alignof(T) <=
alignof(
double));
106 static constexpr bool canUseInternalSpace(
const QtPrivate::QMetaTypeInterface *type)
109 return QMetaType::TypeFlags(type->flags) & QMetaType::RelocatableType &&
110 size_t(type->size) <= MaxInternalSize && size_t(type->alignment) <=
alignof(
double);
115 uchar data[MaxInternalSize] = {};
116 PrivateShared *shared;
117 double _forAlignment;
119 quintptr is_shared : 1;
120 quintptr is_null : 1;
121 quintptr packedType :
sizeof(QMetaType) * 8 - 2;
123 constexpr Private()
noexcept : is_shared(
false), is_null(
true), packedType(0) {}
124 explicit Private(
const QtPrivate::QMetaTypeInterface *iface)
noexcept;
125 template <
typename T>
explicit Private(std::piecewise_construct_t,
const T &t);
127 const void *storage()
const
128 {
return is_shared ? data.shared->data() : &data.data; }
130 template<
typename T>
const T &get()
const
131 {
return *
static_cast<
const T *>(storage()); }
133 inline const QtPrivate::QMetaTypeInterface *typeInterface()
const
135 return reinterpret_cast<
const QtPrivate::QMetaTypeInterface *>(packedType << 2);
138 inline QMetaType type()
const
140 return QMetaType(typeInterface());
144#if QT_DEPRECATED_SINCE(6
, 0
)
145 enum QT_DEPRECATED_VERSION_X_6_0(
"Use QMetaType::Type instead.") Type
147 Invalid = QMetaType::UnknownType,
148 Bool = QMetaType::Bool,
149 Int = QMetaType::Int,
150 UInt = QMetaType::UInt,
151 LongLong = QMetaType::LongLong,
152 ULongLong = QMetaType::ULongLong,
153 Double = QMetaType::Double,
154 Char = QMetaType::QChar,
155 Map = QMetaType::QVariantMap,
156 List = QMetaType::QVariantList,
157 String = QMetaType::QString,
158 StringList = QMetaType::QStringList,
159 ByteArray = QMetaType::QByteArray,
160 BitArray = QMetaType::QBitArray,
161 Date = QMetaType::QDate,
162 Time = QMetaType::QTime,
163 DateTime = QMetaType::QDateTime,
164 Url = QMetaType::QUrl,
165 Locale = QMetaType::QLocale,
166 Rect = QMetaType::QRect,
167 RectF = QMetaType::QRectF,
168 Size = QMetaType::QSize,
169 SizeF = QMetaType::QSizeF,
170 Line = QMetaType::QLine,
171 LineF = QMetaType::QLineF,
172 Point = QMetaType::QPoint,
173 PointF = QMetaType::QPointF,
174#if QT_CONFIG(regularexpression)
175 RegularExpression = QMetaType::QRegularExpression,
177 Hash = QMetaType::QVariantHash,
178#if QT_CONFIG(easingcurve)
179 EasingCurve = QMetaType::QEasingCurve,
181 Uuid = QMetaType::QUuid,
182#if QT_CONFIG(itemmodel)
183 ModelIndex = QMetaType::QModelIndex,
184 PersistentModelIndex = QMetaType::QPersistentModelIndex,
186 LastCoreType = QMetaType::LastCoreType,
188 Font = QMetaType::QFont,
189 Pixmap = QMetaType::QPixmap,
190 Brush = QMetaType::QBrush,
191 Color = QMetaType::QColor,
192 Palette = QMetaType::QPalette,
193 Image = QMetaType::QImage,
194 Polygon = QMetaType::QPolygon,
195 Region = QMetaType::QRegion,
196 Bitmap = QMetaType::QBitmap,
197 Cursor = QMetaType::QCursor,
198#if QT_CONFIG(shortcut)
199 KeySequence = QMetaType::QKeySequence,
201 Pen = QMetaType::QPen,
202 TextLength = QMetaType::QTextLength,
203 TextFormat = QMetaType::QTextFormat,
204 Transform = QMetaType::QTransform,
205 Matrix4x4 = QMetaType::QMatrix4x4,
206 Vector2D = QMetaType::QVector2D,
207 Vector3D = QMetaType::QVector3D,
208 Vector4D = QMetaType::QVector4D,
209 Quaternion = QMetaType::QQuaternion,
210 PolygonF = QMetaType::QPolygonF,
211 Icon = QMetaType::QIcon,
212 LastGuiType = QMetaType::LastGuiType,
214 SizePolicy = QMetaType::QSizePolicy,
216 UserType = QMetaType::User,
217 LastType = 0xffffffff
220 QVariant()
noexcept : d() {}
222 explicit QVariant(QMetaType type,
const void *copy =
nullptr);
223 QVariant(
const QVariant &other);
226 template <
typename T,
typename ...Args>
227 using is_noexcept_constructible = std::conjunction<
228 std::bool_constant<Private::CanUseInternalSpace<T>>,
229 std::is_nothrow_constructible<T, Args...>
233 template<
typename Indirect>
236 template<
typename Indirect>
240 friend class Reference<Indirect>;
241 const Indirect m_referred;
246 explicit ConstReference(
const Indirect &referred)
247 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
248 : m_referred(referred) {}
249 explicit ConstReference(Indirect &&referred)
250 noexcept(std::is_nothrow_move_constructible_v<Indirect>)
251 : m_referred(std::move(referred)) {}
252 ConstReference(
const ConstReference &)
253 noexcept(std::is_nothrow_copy_constructible_v<Indirect>) =
default;
259 ConstReference(ConstReference &&) =
delete;
261 ConstReference(
const Reference<Indirect> &)
262 noexcept(std::is_nothrow_copy_constructible_v<Indirect>);
270 ~ConstReference() =
default;
271 ConstReference &operator=(
const ConstReference &value) =
delete;
272 ConstReference &operator=(ConstReference &&value) =
delete;
275 operator QVariant()
const noexcept(Indirect::CanNoexceptConvertToQVariant);
278 template<
typename Indirect>
282 friend class ConstReference<Indirect>;
285 friend void swap(Reference a, Reference b) {
return a.swap(b); }
290 explicit Reference(
const Indirect &referred)
291 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
292 : m_referred(referred) {}
293 explicit Reference(Indirect &&referred)
294 noexcept(std::is_nothrow_move_constructible_v<Indirect>)
295 : m_referred(std::move(referred)) {}
296 Reference(
const Reference &) =
default;
302 Reference(Reference &&) =
delete;
304 ~Reference() =
default;
306 Reference &operator=(
const Reference &value)
307 noexcept(Indirect::CanNoexceptAssignQVariant)
309 return operator=(QVariant(value));
312 Reference &operator=(Reference &&value)
313 noexcept(Indirect::CanNoexceptAssignQVariant)
315 return operator=(QVariant(value));
318 Reference &operator=(
const ConstReference<Indirect> &value)
319 noexcept(Indirect::CanNoexceptAssignQVariant)
321 return operator=(QVariant(value));
324 Reference &operator=(ConstReference<Indirect> &&value)
325 noexcept(Indirect::CanNoexceptAssignQVariant)
327 return operator=(QVariant(value));
330 operator QVariant()
const noexcept(Indirect::CanNoexceptConvertToQVariant)
332 return ConstReference(m_referred);
335 void swap(Reference b)
338 QVariant tmp = *
this;
339 *
this = std::move(b);
344 Reference &operator=(
const QVariant &value)
noexcept(Indirect::CanNoexceptAssignQVariant);
347 template<
typename Indirect>
354 explicit ConstPointer(
const Indirect &pointed)
355 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
356 : m_pointed(pointed) {}
357 explicit ConstPointer(Indirect &&pointed)
358 noexcept(std::is_nothrow_move_constructible_v<Indirect>)
359 : m_pointed(std::move(pointed)) {}
361 ConstReference<Indirect> operator*()
362 const noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
364 return ConstReference<Indirect>(m_pointed);
368 template<
typename Indirect>
375 explicit Pointer(
const Indirect &pointed)
376 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
377 : m_pointed(pointed) {}
378 explicit Pointer(Indirect &&pointed)
379 noexcept(std::is_nothrow_move_constructible_v<Indirect>)
380 : m_pointed(std::move(pointed)) {}
382 Reference<Indirect> operator*()
383 const noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
385 return Reference<Indirect>(m_pointed);
388 operator ConstPointer<Indirect>()
const
389 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
391 return ConstPointer(m_pointed);
395 template <
typename T,
typename... Args,
396 if_constructible<T, Args...> =
true>
397 explicit QVariant(std::in_place_type_t<T>, Args&&... args)
398 noexcept(is_noexcept_constructible<q20::remove_cvref_t<T>, Args...>::value)
399 : QVariant(std::in_place, QMetaType::fromType<q20::remove_cvref_t<T>>() )
401 void *data =
const_cast<
void *>(constData());
402 new (data) T(std::forward<Args>(args)...);
405 template <
typename T,
typename U,
typename... Args,
406 if_constructible<T, std::initializer_list<U> &, Args...> =
true>
407 explicit QVariant(std::in_place_type_t<T>, std::initializer_list<U> il, Args&&... args)
408 noexcept(is_noexcept_constructible<q20::remove_cvref_t<T>,
409 std::initializer_list<U> &,
412 : QVariant(std::in_place, QMetaType::fromType<q20::remove_cvref_t<T>>())
414 void *data =
const_cast<
void *>(constData());
415 new (data) T(il, std::forward<Args>(args)...);
419 QVariant(
int i)
noexcept;
420 QVariant(uint ui)
noexcept;
421 QVariant(qlonglong ll)
noexcept;
422 QVariant(qulonglong ull)
noexcept;
423 QVariant(
bool b)
noexcept;
424 QVariant(
double d)
noexcept;
425 QVariant(
float f)
noexcept;
428 QVariant(QChar qchar)
noexcept;
429 QVariant(QDate date)
noexcept;
430 QVariant(QTime time)
noexcept;
431 QVariant(
const QBitArray &bitarray)
noexcept;
432 QVariant(
const QByteArray &bytearray)
noexcept;
433 QVariant(
const QDateTime &datetime)
noexcept;
434 QVariant(
const QHash<QString, QVariant> &hash)
noexcept;
435 QVariant(
const QJsonArray &jsonArray)
noexcept;
436 QVariant(
const QJsonObject &jsonObject)
noexcept;
437 QVariant(
const QList<QVariant> &list)
noexcept;
438 QVariant(
const QLocale &locale)
noexcept;
439 QVariant(
const QMap<QString, QVariant> &map)
noexcept;
440 QVariant(
const QRegularExpression &re)
noexcept;
441 QVariant(
const QString &string)
noexcept;
442 QVariant(
const QStringList &stringlist)
noexcept;
443 QVariant(
const QUrl &url)
noexcept;
447 QVariant(
const QJsonValue &jsonValue)
noexcept(Private::FitsInInternalSize<
sizeof(CborValueStandIn)>);
448 QVariant(
const QModelIndex &modelIndex)
noexcept(Private::FitsInInternalSize<8 + 2 *
sizeof(quintptr)>);
449 QVariant(QUuid uuid)
noexcept(Private::FitsInInternalSize<16>);
450 QVariant(QSize size)
noexcept;
451 QVariant(QSizeF size)
noexcept(Private::FitsInInternalSize<
sizeof(qreal) * 2>);
452 QVariant(QPoint pt)
noexcept;
453 QVariant(QPointF pt)
noexcept(Private::FitsInInternalSize<
sizeof(qreal) * 2>);
454 QVariant(QLine line)
noexcept(Private::FitsInInternalSize<
sizeof(
int) * 4>);
455 QVariant(QLineF line)
noexcept(Private::FitsInInternalSize<
sizeof(qreal) * 4>);
456 QVariant(QRect rect)
noexcept(Private::FitsInInternalSize<
sizeof(
int) * 4>);
457 QVariant(QRectF rect)
noexcept(Private::FitsInInternalSize<
sizeof(qreal) * 4>);
460 QVariant(
const QEasingCurve &easing)
noexcept(
false);
461 QVariant(
const QJsonDocument &jsonDocument)
noexcept(
false);
462 QVariant(
const QPersistentModelIndex &modelIndex)
noexcept(
false);
464#ifndef QT_NO_CAST_FROM_ASCII
465 QT_ASCII_CAST_WARN QVariant(
const char *str)
noexcept(
false)
466 : QVariant(QString::fromUtf8(str))
469 QVariant(QLatin1StringView string)
noexcept(
false);
471#if !defined(Q_CC_GHS)
473 template <
typename T,
474 std::enable_if_t<std::disjunction_v<std::is_pointer<T>, std::is_member_pointer<T>>,
bool> =
false>
475 QVariant(T) =
delete;
477 QVariant(
const volatile void *) =
delete;
480#if QT_CORE_REMOVED_SINCE(6
, 5
)
481 QVariant(
const QSize &size);
482 QVariant(
const QSizeF &size);
483 QVariant(
const QPoint &pt);
484 QVariant(
const QPointF &pt);
485 QVariant(
const QLine &line);
486 QVariant(
const QLineF &line);
487 QVariant(
const QRect &rect);
488 QVariant(
const QRectF &rect);
489 QVariant(
const QUuid &uuid);
492 QVariant& operator=(
const QVariant &other);
493 inline QVariant(QVariant &&other)
noexcept : d(other.d)
494 { other.d = Private(); }
495 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QVariant)
497 inline void swap(QVariant &other)
noexcept { std::swap(d, other.d); }
499 int userType()
const {
return typeId(); }
503 const QtPrivate::QMetaTypeInterface *mt = metaType().iface();
506 int id = mt->typeId.loadRelaxed();
511 QT_CORE_INLINE_SINCE(6, 10)
512 const char *typeName()
const;
513 QT_CORE_INLINE_SINCE(6, 10)
514 QMetaType metaType()
const;
516 bool canConvert(QMetaType targetType)
const
517 {
return QMetaType::canConvert(d.type(), targetType); }
518 bool convert(QMetaType type);
520 bool canView(QMetaType targetType)
const
521 {
return QMetaType::canView(d.type(), targetType); }
523#if QT_DEPRECATED_SINCE(6
, 0
)
524 QT_DEPRECATED_VERSION_6_0
525 bool canConvert(
int targetTypeId)
const
526 {
return QMetaType::canConvert(d.type(), QMetaType(targetTypeId)); }
527 QT_DEPRECATED_VERSION_6_0
528 bool convert(
int targetTypeId)
529 {
return convert(QMetaType(targetTypeId)); }
532 inline bool isValid()
const;
538 inline bool isDetached()
const;
540 int toInt(
bool *ok =
nullptr)
const;
541 uint toUInt(
bool *ok =
nullptr)
const;
542 qlonglong toLongLong(
bool *ok =
nullptr)
const;
543 qulonglong toULongLong(
bool *ok =
nullptr)
const;
545 double toDouble(
bool *ok =
nullptr)
const;
546 float toFloat(
bool *ok =
nullptr)
const;
547 qreal toReal(
bool *ok =
nullptr)
const;
548 QByteArray toByteArray()
const;
549 QBitArray toBitArray()
const;
550 QString toString()
const;
551 QStringList toStringList()
const;
552 QChar toChar()
const;
553 QDate toDate()
const;
554 QTime toTime()
const;
555 QDateTime toDateTime()
const;
556 QList<QVariant> toList()
const;
557 QMap<QString, QVariant> toMap()
const;
558 QHash<QString, QVariant> toHash()
const;
560 QPoint toPoint()
const;
561 QPointF toPointF()
const;
562 QRect toRect()
const;
563 QSize toSize()
const;
564 QSizeF toSizeF()
const;
565 QLine toLine()
const;
566 QLineF toLineF()
const;
567 QRectF toRectF()
const;
568 QLocale toLocale()
const;
569#if QT_CONFIG(regularexpression)
570 QRegularExpression toRegularExpression()
const;
572#if QT_CONFIG(easingcurve)
573 QEasingCurve toEasingCurve()
const;
575 QUuid toUuid()
const;
577 QJsonValue toJsonValue()
const;
578 QJsonObject toJsonObject()
const;
579 QJsonArray toJsonArray()
const;
580 QJsonDocument toJsonDocument()
const;
581#if QT_CONFIG(itemmodel)
582 QModelIndex toModelIndex()
const;
583 QPersistentModelIndex toPersistentModelIndex()
const;
586#ifndef QT_NO_DATASTREAM
587 void load(QDataStream &ds);
588 void save(QDataStream &ds)
const;
590#if QT_DEPRECATED_SINCE(6
, 0
)
592 QT_WARNING_DISABLE_DEPRECATED
593 QT_DEPRECATED_VERSION_X_6_0(
"Use the constructor taking a QMetaType instead.")
594 explicit QVariant(Type type)
595 : QVariant(QMetaType(
int(type)))
597 QT_DEPRECATED_VERSION_X_6_0(
"Use typeId() or metaType().")
600 int type = d.type().id();
601 return type >= QMetaType::User ? UserType :
static_cast<Type>(type);
603 QT_DEPRECATED_VERSION_6_0
604 static const char *typeToName(
int typeId)
605 {
return QMetaType(typeId).name(); }
606 QT_DEPRECATED_VERSION_6_0
607 static Type nameToType(
const char *name)
609 int metaType = QMetaType::fromName(name).id();
610 return metaType <=
int(UserType) ? QVariant::Type(metaType) : UserType;
616 const void *constData()
const
617 {
return d.storage(); }
618 inline const void *data()
const {
return constData(); }
621 template <
typename T>
622 void verifySuitableForEmplace()
624 static_assert(!std::is_reference_v<T>,
625 "QVariant does not support reference types");
626 static_assert(!std::is_const_v<T>,
627 "QVariant does not support const types");
628 static_assert(std::is_copy_constructible_v<T>,
629 "QVariant requires that the type is copyable");
630 static_assert(std::is_destructible_v<T>,
631 "QVariant requires that the type is destructible");
634 template <
typename T,
typename... Args>
635 T &emplaceImpl(Args&&... args)
637 verifySuitableForEmplace<T>();
638 auto data =
static_cast<T *>(prepareForEmplace(QMetaType::fromType<T>()));
639 return *q20::construct_at(data, std::forward<Args>(args)...);
643 template <
typename T,
typename... Args,
644 if_constructible<T, Args...> =
true>
645 T &emplace(Args&&... args)
647 return emplaceImpl<T>(std::forward<Args>(args)...);
650 template <
typename T,
typename U,
typename... Args,
651 if_constructible<T, std::initializer_list<U> &, Args...> =
true>
652 T &emplace(std::initializer_list<U> list, Args&&... args)
654 return emplaceImpl<T>(list, std::forward<Args>(args)...);
657 template<
typename T,
typename = std::enable_if_t<!std::is_same_v<std::decay_t<T>, QVariant>>>
658 void setValue(T &&avalue)
660 using VT = std::decay_t<T>;
661 QMetaType metaType = QMetaType::fromType<VT>();
663 if (isDetached() && d.type() == metaType) {
664 *
reinterpret_cast<VT *>(
const_cast<
void *>(constData())) = std::forward<T>(avalue);
667 *
this = QVariant::fromValue<VT>(std::forward<T>(avalue));
671 void setValue(
const QVariant &avalue)
676 void setValue(QVariant &&avalue)
678 *
this = std::move(avalue);
682 inline T value()
const &
683 {
return qvariant_cast<T>(*
this); }
689 QMetaType::view(metaType(), data(), QMetaType::fromType<T>(), &t);
695 {
return qvariant_cast<T>(std::move(*
this)); }
697 template<
typename T, if_rvalue<T> =
true>
700
701
702 static inline auto fromValue(T &&value)
703 noexcept(std::is_nothrow_copy_constructible_v<T> && Private::CanUseInternalSpace<T>)
704 -> std::enable_if_t<std::conjunction_v<std::is_copy_constructible<T>,
705 std::is_destructible<T>>, QVariant>
707 static inline QVariant fromValue(T &&value)
711 using Type = std::remove_cv_t<T>;
712 if constexpr (std::is_null_pointer_v<Type>)
713 return QVariant::fromMetaType(QMetaType::fromType<std::nullptr_t>());
714 else if constexpr (std::is_same_v<Type, QVariant>)
715 return std::forward<T>(value);
716 else if constexpr (std::is_same_v<Type, std::monostate>)
718 QMetaType mt = QMetaType::fromType<Type>();
723 if constexpr (std::conjunction_v<std::is_move_constructible<Type>, std::negation<std::is_const<T>>>)
724 return moveConstruct(QMetaType::fromType<Type>(), std::addressof(value));
726 return copyConstruct(mt, std::addressof(value));
731 static inline auto fromValue(
const T &value)
732 noexcept(std::is_nothrow_copy_constructible_v<T> && Private::CanUseInternalSpace<T>)
733 -> std::enable_if_t<std::is_copy_constructible_v<T> && std::is_destructible_v<T>, QVariant>
735 static inline QVariant fromValue(
const T &value)
738 if constexpr (std::is_null_pointer_v<T>)
739 return QVariant(QMetaType::fromType<std::nullptr_t>());
740 else if constexpr (std::is_same_v<T, QVariant>)
742 else if constexpr (std::is_same_v<T, std::monostate>)
744 return QVariant(QMetaType::fromType<T>(), std::addressof(value));
747 template<
typename... Types>
748 static inline QVariant fromStdVariant(
const std::variant<Types...> &value)
750 return fromStdVariantImpl(value);
753 template<
typename... Types>
754 static QVariant fromStdVariant(std::variant<Types...> &&value)
756 return fromStdVariantImpl(std::move(value));
759 static QVariant fromMetaType(QMetaType type,
const void *copy =
nullptr);
762 bool canConvert()
const
763 {
return canConvert(QMetaType::fromType<T>()); }
767 {
return canView(QMetaType::fromType<T>()); }
769 static QPartialOrdering compare(
const QVariant &lhs,
const QVariant &rhs);
772 template <
typename StdVariant>
773 static QVariant fromStdVariantImpl(StdVariant &&v)
775 if (Q_UNLIKELY(v.valueless_by_exception()))
777 auto visitor = [](
auto &&arg) {
778 return QVariant::fromValue(q23::forward_like<StdVariant>(arg));
780 return std::visit(visitor, std::forward<StdVariant>(v));
783 friend bool comparesEqual(
const QVariant &a,
const QVariant &b)
784 {
return a.equals(b); }
785 Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QVariant)
787#ifndef QT_NO_DEBUG_STREAM
788 template <
typename T>
789 friend auto operator<<(
const QDebug &debug,
const T &variant) -> std::enable_if_t<std::is_same_v<T, QVariant>, QDebug> {
790 return variant.qdebugHelper(debug);
792 QDebug qdebugHelper(QDebug)
const;
795 template <
typename T>
796 friend T *get_if(QVariant *v)
noexcept
799 if (!v || v->d.type() != QMetaType::fromType<T>())
801 return static_cast<T*>(v->data());
803 template <
typename T>
804 friend const T *get_if(
const QVariant *v)
noexcept
807 if (!v || v->d.is_null || v->d.type() != QMetaType::fromType<T>())
809 return static_cast<
const T*>(v->data());
812#define Q_MK_GET(cvref)
813 template <typename T>
814 friend T cvref get(QVariant cvref v)
816 if constexpr (std::is_const_v<T cvref>)
817 Q_ASSERT(!v.d.is_null);
818 Q_ASSERT(v.d.type() == QMetaType::fromType<q20::remove_cvref_t<T>>());
819 return static_cast<T cvref>(*get_if<T>(&v));
828 static QVariant moveConstruct(QMetaType type,
void *data);
829 static QVariant copyConstruct(QMetaType type,
const void *data);
832 friend inline T qvariant_cast(
const QVariant &);
834 friend inline T qvariant_cast(QVariant &&);
838 void create(
int type,
const void *copy);
839 void create(QMetaType type,
const void *copy);
840 bool equals(
const QVariant &other)
const;
841 bool convert(
int type,
void *ptr)
const;
842 bool view(
int type,
void *ptr);
846 inline QVariant(
void *) =
delete;
853 QVariant(QMetaType::Type) =
delete;
856 QVariant(std::in_place_t, QMetaType type);
858 void *prepareForEmplace(QMetaType type);
865 QVariant(Qt::GlobalColor) =
delete;
866 QVariant(Qt::BrushStyle) =
delete;
867 QVariant(Qt::PenStyle) =
delete;
868 QVariant(Qt::CursorShape) =
delete;
869#ifdef QT_NO_CAST_FROM_ASCII
871 inline QVariant(
const char *) =
delete;
874 typedef Private DataPtr;
875 inline DataPtr &data_ptr() {
return d; }
876 inline const DataPtr &data_ptr()
const {
return d; }