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>
126 explicit Private(std::in_place_t, T &&t);
127#if QT_DEPRECATED_SINCE(6
, 12
)
128 template <
typename T>
129 QT_DEPRECATED_VERSION_X_6_12(
"use the std::in_place overload and check whether you can move into it.")
130 explicit Private(std::piecewise_construct_t,
const T &t)
131 : Private{std::in_place, t} {}
134 const void *storage()
const
135 {
return is_shared ? data.shared->data() : &data.data; }
137 template<
typename T>
const T &get()
const
138 {
return *
static_cast<
const T *>(storage()); }
140 inline const QtPrivate::QMetaTypeInterface *typeInterface()
const
142 return reinterpret_cast<
const QtPrivate::QMetaTypeInterface *>(packedType << 2);
145 inline QMetaType type()
const
147 return QMetaType(typeInterface());
151#if QT_DEPRECATED_SINCE(6
, 0
)
152 enum QT_DEPRECATED_VERSION_X_6_0(
"Use QMetaType::Type instead.") Type
154 Invalid = QMetaType::UnknownType,
155 Bool = QMetaType::Bool,
156 Int = QMetaType::Int,
157 UInt = QMetaType::UInt,
158 LongLong = QMetaType::LongLong,
159 ULongLong = QMetaType::ULongLong,
160 Double = QMetaType::Double,
161 Char = QMetaType::QChar,
162 Map = QMetaType::QVariantMap,
163 List = QMetaType::QVariantList,
164 String = QMetaType::QString,
165 StringList = QMetaType::QStringList,
166 ByteArray = QMetaType::QByteArray,
167 BitArray = QMetaType::QBitArray,
168 Date = QMetaType::QDate,
169 Time = QMetaType::QTime,
170 DateTime = QMetaType::QDateTime,
171 Url = QMetaType::QUrl,
172 Locale = QMetaType::QLocale,
173 Rect = QMetaType::QRect,
174 RectF = QMetaType::QRectF,
175 Size = QMetaType::QSize,
176 SizeF = QMetaType::QSizeF,
177 Line = QMetaType::QLine,
178 LineF = QMetaType::QLineF,
179 Point = QMetaType::QPoint,
180 PointF = QMetaType::QPointF,
181#if QT_CONFIG(regularexpression)
182 RegularExpression = QMetaType::QRegularExpression,
184 Hash = QMetaType::QVariantHash,
185#if QT_CONFIG(easingcurve)
186 EasingCurve = QMetaType::QEasingCurve,
188 Uuid = QMetaType::QUuid,
189#if QT_CONFIG(itemmodel)
190 ModelIndex = QMetaType::QModelIndex,
191 PersistentModelIndex = QMetaType::QPersistentModelIndex,
193 LastCoreType = QMetaType::LastCoreType,
195 Font = QMetaType::QFont,
196 Pixmap = QMetaType::QPixmap,
197 Brush = QMetaType::QBrush,
198 Color = QMetaType::QColor,
199 Palette = QMetaType::QPalette,
200 Image = QMetaType::QImage,
201 Polygon = QMetaType::QPolygon,
202 Region = QMetaType::QRegion,
203 Bitmap = QMetaType::QBitmap,
204 Cursor = QMetaType::QCursor,
205#if QT_CONFIG(shortcut)
206 KeySequence = QMetaType::QKeySequence,
208 Pen = QMetaType::QPen,
209 TextLength = QMetaType::QTextLength,
210 TextFormat = QMetaType::QTextFormat,
211 Transform = QMetaType::QTransform,
212 Matrix4x4 = QMetaType::QMatrix4x4,
213 Vector2D = QMetaType::QVector2D,
214 Vector3D = QMetaType::QVector3D,
215 Vector4D = QMetaType::QVector4D,
216 Quaternion = QMetaType::QQuaternion,
217 PolygonF = QMetaType::QPolygonF,
218 Icon = QMetaType::QIcon,
219 LastGuiType = QMetaType::LastGuiType,
221 SizePolicy = QMetaType::QSizePolicy,
223 UserType = QMetaType::User,
224 LastType = 0xffffffff
227 QVariant()
noexcept : d() {}
229 explicit QVariant(QMetaType type,
const void *copy =
nullptr);
230 QVariant(
const QVariant &other);
233 template <
typename T,
typename ...Args>
234 using is_noexcept_constructible = std::conjunction<
235 std::bool_constant<Private::CanUseInternalSpace<T>>,
236 std::is_nothrow_constructible<T, Args...>
240 template<
typename Indirect>
243 template<
typename Indirect>
247 friend class Reference<Indirect>;
248 const Indirect m_referred;
253 explicit ConstReference(
const Indirect &referred)
254 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
255 : m_referred(referred) {}
256 explicit ConstReference(Indirect &&referred)
257 noexcept(std::is_nothrow_move_constructible_v<Indirect>)
258 : m_referred(std::move(referred)) {}
259 ConstReference(
const ConstReference &)
260 noexcept(std::is_nothrow_copy_constructible_v<Indirect>) =
default;
266 ConstReference(ConstReference &&) =
delete;
268 ConstReference(
const Reference<Indirect> &)
269 noexcept(std::is_nothrow_copy_constructible_v<Indirect>);
277 ~ConstReference() =
default;
278 ConstReference &operator=(
const ConstReference &value) =
delete;
279 ConstReference &operator=(ConstReference &&value) =
delete;
282 operator QVariant()
const noexcept(Indirect::CanNoexceptConvertToQVariant);
285 template<
typename Indirect>
289 friend class ConstReference<Indirect>;
292 friend void swap(Reference a, Reference b) {
return a.swap(b); }
297 explicit Reference(
const Indirect &referred)
298 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
299 : m_referred(referred) {}
300 explicit Reference(Indirect &&referred)
301 noexcept(std::is_nothrow_move_constructible_v<Indirect>)
302 : m_referred(std::move(referred)) {}
303 Reference(
const Reference &) =
default;
309 Reference(Reference &&) =
delete;
311 ~Reference() =
default;
313 Reference &operator=(
const Reference &value)
314 noexcept(Indirect::CanNoexceptAssignQVariant)
316 return operator=(QVariant(value));
319 Reference &operator=(Reference &&value)
320 noexcept(Indirect::CanNoexceptAssignQVariant)
322 return operator=(QVariant(value));
325 Reference &operator=(
const ConstReference<Indirect> &value)
326 noexcept(Indirect::CanNoexceptAssignQVariant)
328 return operator=(QVariant(value));
331 Reference &operator=(ConstReference<Indirect> &&value)
332 noexcept(Indirect::CanNoexceptAssignQVariant)
334 return operator=(QVariant(value));
337 operator QVariant()
const noexcept(Indirect::CanNoexceptConvertToQVariant)
339 return ConstReference<Indirect>(m_referred);
342 void swap(Reference b)
345 QVariant tmp = *
this;
346 *
this = std::move(b);
351 Reference &operator=(
const QVariant &value)
noexcept(Indirect::CanNoexceptAssignQVariant);
354 template<
typename Indirect>
361 explicit ConstPointer(
const Indirect &pointed)
362 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
363 : m_pointed(pointed) {}
364 explicit ConstPointer(Indirect &&pointed)
365 noexcept(std::is_nothrow_move_constructible_v<Indirect>)
366 : m_pointed(std::move(pointed)) {}
368 ConstReference<Indirect> operator*()
369 const noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
371 return ConstReference<Indirect>(m_pointed);
375 template<
typename Indirect>
382 explicit Pointer(
const Indirect &pointed)
383 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
384 : m_pointed(pointed) {}
385 explicit Pointer(Indirect &&pointed)
386 noexcept(std::is_nothrow_move_constructible_v<Indirect>)
387 : m_pointed(std::move(pointed)) {}
389 Reference<Indirect> operator*()
390 const noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
392 return Reference<Indirect>(m_pointed);
395 operator ConstPointer<Indirect>()
const
396 noexcept(std::is_nothrow_copy_constructible_v<Indirect>)
398 return ConstPointer<Indirect>(m_pointed);
402 template <
typename T,
typename... Args,
403 if_constructible<T, Args...> =
true>
404 explicit QVariant(std::in_place_type_t<T>, Args&&... args)
405 noexcept(is_noexcept_constructible<q20::remove_cvref_t<T>, Args...>::value)
406 : QVariant(std::in_place, QMetaType::fromType<q20::remove_cvref_t<T>>() )
408 void *data =
const_cast<
void *>(constData());
409 new (data) T(std::forward<Args>(args)...);
412 template <
typename T,
typename U,
typename... Args,
413 if_constructible<T, std::initializer_list<U> &, Args...> =
true>
414 explicit QVariant(std::in_place_type_t<T>, std::initializer_list<U> il, Args&&... args)
415 noexcept(is_noexcept_constructible<q20::remove_cvref_t<T>,
416 std::initializer_list<U> &,
419 : QVariant(std::in_place, QMetaType::fromType<q20::remove_cvref_t<T>>())
421 void *data =
const_cast<
void *>(constData());
422 new (data) T(il, std::forward<Args>(args)...);
426 QVariant(
int i)
noexcept;
427 QVariant(uint ui)
noexcept;
428 QVariant(qlonglong ll)
noexcept;
429 QVariant(qulonglong ull)
noexcept;
430 QVariant(
bool b)
noexcept;
431 QVariant(
double d)
noexcept;
432 QVariant(
float f)
noexcept;
435 QVariant(QChar qchar)
noexcept;
436 QVariant(QDate date)
noexcept;
437 QVariant(QTime time)
noexcept;
438 QVariant(
const QBitArray &bitarray)
noexcept;
439 QVariant(QBitArray &&bitarray)
noexcept;
440 QVariant(
const QByteArray &bytearray)
noexcept;
441 QVariant(QByteArray &&bytearray)
noexcept;
442 QVariant(
const QDateTime &datetime)
noexcept;
443 QVariant(QDateTime &&datetime)
noexcept;
444 QVariant(
const QHash<QString, QVariant> &hash)
noexcept;
445 QVariant(QHash<QString, QVariant> &&hash)
noexcept;
446 QVariant(
const QJsonArray &jsonArray)
noexcept;
447 QVariant(QJsonArray &&jsonArray)
noexcept;
448 QVariant(
const QJsonObject &jsonObject)
noexcept;
449 QVariant(QJsonObject &&jsonObject)
noexcept;
450 QVariant(
const QList<QVariant> &list)
noexcept;
451 QVariant(QList<QVariant> &&list)
noexcept;
452 QVariant(
const QLocale &locale)
noexcept;
453 QVariant(QLocale &&locale)
noexcept;
454 QVariant(
const QMap<QString, QVariant> &map)
noexcept;
455 QVariant(QMap<QString, QVariant> &&map)
noexcept;
456 QVariant(
const QRegularExpression &re)
noexcept;
457 QVariant(QRegularExpression &&re)
noexcept;
458 QVariant(
const QString &string)
noexcept;
459 QVariant(QString &&string)
noexcept;
460 QVariant(
const QStringList &stringlist)
noexcept;
461 QVariant(QStringList &&stringlist)
noexcept;
462 QVariant(
const QUrl &url)
noexcept;
463 QVariant(QUrl &&url)
noexcept;
467 QVariant(
const QJsonValue &jsonValue)
noexcept(Private::FitsInInternalSize<
sizeof(CborValueStandIn)>);
468 QVariant(QJsonValue &&jsonValue)
noexcept(Private::FitsInInternalSize<
sizeof(CborValueStandIn)>);
469 QVariant(
const QModelIndex &modelIndex)
noexcept(Private::FitsInInternalSize<8 + 2 *
sizeof(quintptr)>);
470 QVariant(QUuid uuid)
noexcept(Private::FitsInInternalSize<16>);
471 QVariant(QSize size)
noexcept;
472 QVariant(QSizeF size)
noexcept(Private::FitsInInternalSize<
sizeof(qreal) * 2>);
473 QVariant(QPoint pt)
noexcept;
474 QVariant(QPointF pt)
noexcept(Private::FitsInInternalSize<
sizeof(qreal) * 2>);
475 QVariant(QLine line)
noexcept(Private::FitsInInternalSize<
sizeof(
int) * 4>);
476 QVariant(QLineF line)
noexcept(Private::FitsInInternalSize<
sizeof(qreal) * 4>);
477 QVariant(QRect rect)
noexcept(Private::FitsInInternalSize<
sizeof(
int) * 4>);
478 QVariant(QRectF rect)
noexcept(Private::FitsInInternalSize<
sizeof(qreal) * 4>);
481 QVariant(
const QEasingCurve &easing)
noexcept(
false);
482 QVariant(QEasingCurve &&easing)
noexcept;
483 QVariant(
const QJsonDocument &jsonDocument)
noexcept(
false);
484 QVariant(QJsonDocument &&jsonDocument)
noexcept;
485 QVariant(
const QPersistentModelIndex &modelIndex)
noexcept(
false);
486 QVariant(QPersistentModelIndex &&modelIndex)
noexcept;
488#ifndef QT_NO_CAST_FROM_ASCII
489 QT_ASCII_CAST_WARN QVariant(
const char *str)
noexcept(
false)
490 : QVariant(QString::fromUtf8(str))
493 QVariant(QLatin1StringView string)
noexcept(
false);
495#if !defined(Q_CC_GHS)
497 template <
typename T,
498 std::enable_if_t<std::disjunction_v<std::is_pointer<T>, std::is_member_pointer<T>>,
bool> =
false>
499 QVariant(T) =
delete;
501 QVariant(
const volatile void *) =
delete;
504#if QT_CORE_REMOVED_SINCE(6
, 5
)
505 QVariant(
const QSize &size);
506 QVariant(
const QSizeF &size);
507 QVariant(
const QPoint &pt);
508 QVariant(
const QPointF &pt);
509 QVariant(
const QLine &line);
510 QVariant(
const QLineF &line);
511 QVariant(
const QRect &rect);
512 QVariant(
const QRectF &rect);
513 QVariant(
const QUuid &uuid);
516 QVariant& operator=(
const QVariant &other);
517 inline QVariant(QVariant &&other)
noexcept : d(other.d)
518 { other.d = Private(); }
519 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QVariant)
521 inline void swap(QVariant &other)
noexcept { std::swap(d, other.d); }
523 int userType()
const {
return typeId(); }
527 const QtPrivate::QMetaTypeInterface *mt = metaType().iface();
530 int id = mt->typeId.loadRelaxed();
535 QT_CORE_INLINE_SINCE(6, 10)
536 const char *typeName()
const;
537 QT_CORE_INLINE_SINCE(6, 10)
538 QMetaType metaType()
const;
540 bool canConvert(QMetaType targetType)
const
541 {
return QMetaType::canConvert(d.type(), targetType); }
542 bool convert(QMetaType type);
544 bool canView(QMetaType targetType)
const
545 {
return QMetaType::canView(d.type(), targetType); }
547#if QT_DEPRECATED_SINCE(6
, 0
)
548 QT_DEPRECATED_VERSION_6_0
549 bool canConvert(
int targetTypeId)
const
550 {
return QMetaType::canConvert(d.type(), QMetaType(targetTypeId)); }
551 QT_DEPRECATED_VERSION_6_0
552 bool convert(
int targetTypeId)
553 {
return convert(QMetaType(targetTypeId)); }
556 inline bool isValid()
const;
562 inline bool isDetached()
const;
564 int toInt(
bool *ok =
nullptr)
const;
565 uint toUInt(
bool *ok =
nullptr)
const;
566 qlonglong toLongLong(
bool *ok =
nullptr)
const;
567 qulonglong toULongLong(
bool *ok =
nullptr)
const;
569 double toDouble(
bool *ok =
nullptr)
const;
570 float toFloat(
bool *ok =
nullptr)
const;
571 qreal toReal(
bool *ok =
nullptr)
const;
572 QByteArray toByteArray()
const;
573 QBitArray toBitArray()
const;
574 QString toString()
const;
575 QStringList toStringList()
const;
576 QChar toChar()
const;
577 QDate toDate()
const;
578 QTime toTime()
const;
579 QDateTime toDateTime()
const;
580 QList<QVariant> toList()
const;
581 QMap<QString, QVariant> toMap()
const;
582 QHash<QString, QVariant> toHash()
const;
584 QPoint toPoint()
const;
585 QPointF toPointF()
const;
586 QRect toRect()
const;
587 QSize toSize()
const;
588 QSizeF toSizeF()
const;
589 QLine toLine()
const;
590 QLineF toLineF()
const;
591 QRectF toRectF()
const;
592 QLocale toLocale()
const;
593#if QT_CONFIG(regularexpression)
594 QRegularExpression toRegularExpression()
const;
596#if QT_CONFIG(easingcurve)
597 QEasingCurve toEasingCurve()
const;
599 QUuid toUuid()
const;
601 QJsonValue toJsonValue()
const;
602 QJsonObject toJsonObject()
const;
603 QJsonArray toJsonArray()
const;
604 QJsonDocument toJsonDocument()
const;
605#if QT_CONFIG(itemmodel)
606 QModelIndex toModelIndex()
const;
607 QPersistentModelIndex toPersistentModelIndex()
const;
610#ifndef QT_NO_DATASTREAM
611 void load(QDataStream &ds);
612 void save(QDataStream &ds)
const;
614#if QT_DEPRECATED_SINCE(6
, 0
)
616 QT_WARNING_DISABLE_DEPRECATED
617 QT_DEPRECATED_VERSION_X_6_0(
"Use the constructor taking a QMetaType instead.")
618 explicit QVariant(Type type)
619 : QVariant(QMetaType(
int(type)))
621 QT_DEPRECATED_VERSION_X_6_0(
"Use typeId() or metaType().")
624 int type = d.type().rawId();
625 return type >= QMetaType::User ? UserType :
static_cast<Type>(type);
627 QT_DEPRECATED_VERSION_6_0
628 static const char *typeToName(
int typeId)
629 {
return QMetaType(typeId).name(); }
630 QT_DEPRECATED_VERSION_6_0
631 static Type nameToType(
const char *name)
633 int metaType = QMetaType::fromName(name).rawId();
634 return metaType <=
int(UserType) ? QVariant::Type(metaType) : UserType;
640 const void *constData()
const
641 {
return d.storage(); }
642 inline const void *data()
const {
return constData(); }
645 template <
typename T>
646 void verifySuitableForEmplace()
648 static_assert(!std::is_reference_v<T>,
649 "QVariant does not support reference types");
650 static_assert(!std::is_const_v<T>,
651 "QVariant does not support const types");
652 static_assert(std::is_copy_constructible_v<T>,
653 "QVariant requires that the type is copyable");
654 static_assert(std::is_destructible_v<T>,
655 "QVariant requires that the type is destructible");
658 template <
typename T,
typename... Args>
659 T &emplaceImpl(Args&&... args)
661 verifySuitableForEmplace<T>();
662 auto data =
static_cast<T *>(prepareForEmplace(QMetaType::fromType<T>()));
663 return *q20::construct_at(data, std::forward<Args>(args)...);
667 template <
typename T,
typename... Args,
668 if_constructible<T, Args...> =
true>
669 T &emplace(Args&&... args)
671 return emplaceImpl<T>(std::forward<Args>(args)...);
674 template <
typename T,
typename U,
typename... Args,
675 if_constructible<T, std::initializer_list<U> &, Args...> =
true>
676 T &emplace(std::initializer_list<U> list, Args&&... args)
678 return emplaceImpl<T>(list, std::forward<Args>(args)...);
681 template<
typename T,
typename = std::enable_if_t<!std::is_same_v<std::decay_t<T>, QVariant>>>
682 void setValue(T &&avalue)
684 using VT = std::decay_t<T>;
685 QMetaType metaType = QMetaType::fromType<VT>();
687 if (isDetached() && d.type() == metaType) {
688 *
reinterpret_cast<VT *>(
const_cast<
void *>(constData())) = std::forward<T>(avalue);
691 *
this = QVariant::fromValue<VT>(std::forward<T>(avalue));
695 void setValue(
const QVariant &avalue)
700 void setValue(QVariant &&avalue)
702 *
this = std::move(avalue);
706 inline T value()
const &
707 {
return qvariant_cast<T>(*
this); }
713 QMetaType::view(metaType(), data(), QMetaType::fromType<T>(), &t);
719 {
return qvariant_cast<T>(std::move(*
this)); }
721 template<
typename T, if_rvalue<T> =
true>
724
725
726 static inline auto fromValue(T &&value)
727 noexcept(std::is_nothrow_copy_constructible_v<T> && Private::CanUseInternalSpace<T>)
728 -> std::enable_if_t<std::conjunction_v<std::is_copy_constructible<T>,
729 std::is_destructible<T>>, QVariant>
731 static inline QVariant fromValue(T &&value)
735 using Type = std::remove_cv_t<T>;
736 if constexpr (std::is_null_pointer_v<Type>)
737 return QVariant::fromMetaType(QMetaType::fromType<std::nullptr_t>());
738 else if constexpr (std::is_same_v<Type, QVariant>)
739 return std::forward<T>(value);
740 else if constexpr (std::is_same_v<Type, std::monostate>)
742 QMetaType mt = QMetaType::fromType<Type>();
747 if constexpr (std::conjunction_v<std::is_move_constructible<Type>, std::negation<std::is_const<T>>>)
748 return moveConstruct(QMetaType::fromType<Type>(), std::addressof(value));
750 return copyConstruct(mt, std::addressof(value));
755 static inline auto fromValue(
const T &value)
756 noexcept(std::is_nothrow_copy_constructible_v<T> && Private::CanUseInternalSpace<T>)
757 -> std::enable_if_t<std::is_copy_constructible_v<T> && std::is_destructible_v<T>, QVariant>
759 static inline QVariant fromValue(
const T &value)
762 if constexpr (std::is_null_pointer_v<T>)
763 return QVariant(QMetaType::fromType<std::nullptr_t>());
764 else if constexpr (std::is_same_v<T, QVariant>)
766 else if constexpr (std::is_same_v<T, std::monostate>)
768 return QVariant(QMetaType::fromType<T>(), std::addressof(value));
771 template<
typename... Types>
772 static inline QVariant fromStdVariant(
const std::variant<Types...> &value)
774 return fromStdVariantImpl(value);
777 template<
typename... Types>
778 static QVariant fromStdVariant(std::variant<Types...> &&value)
780 return fromStdVariantImpl(std::move(value));
783 static QVariant fromMetaType(QMetaType type,
const void *copy =
nullptr);
786 bool canConvert()
const
787 {
return canConvert(QMetaType::fromType<T>()); }
791 {
return canView(QMetaType::fromType<T>()); }
793 static QPartialOrdering compare(
const QVariant &lhs,
const QVariant &rhs);
796 template <
typename StdVariant>
797 static QVariant fromStdVariantImpl(StdVariant &&v)
799 if (Q_UNLIKELY(v.valueless_by_exception()))
801 auto visitor = [](
auto &&arg) {
802 return QVariant::fromValue(q23::forward_like<StdVariant>(arg));
804 return std::visit(visitor, std::forward<StdVariant>(v));
807 friend bool comparesEqual(
const QVariant &a,
const QVariant &b)
808 {
return a.equals(b); }
809 Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QVariant)
811#ifndef QT_NO_DEBUG_STREAM
812 template <
typename T>
813 friend auto operator<<(
const QDebug &debug,
const T &variant) -> std::enable_if_t<std::is_same_v<T, QVariant>, QDebug> {
814 return variant.qdebugHelper(debug);
816 QDebug qdebugHelper(QDebug)
const;
819 template <
typename T,
typename Variant>
static constexpr
820 bool canGetTypeFromVariant(Variant *v)
noexcept
824 if (std::is_const_v<Variant> && v->d.is_null)
827 using NonConstT = std::remove_const_t<std::remove_pointer_t<T>>;
828 if constexpr (std::is_pointer_v<T> && !std::is_same_v<T, NonConstT *>) {
829 if (v->d.type() == QMetaType::fromType<NonConstT *>())
832 return v->d.type() == QMetaType::fromType<T>();
835 template <
typename T> T *typedData()
837 Q_PRE(canGetTypeFromVariant<T>(
this));
838 return static_cast<T *>(data());
841 template <
typename T>
const T *typedData()
const
843 Q_PRE(canGetTypeFromVariant<T>(
this));
847 template <
typename T>
848 friend T *get_if(QVariant *v)
noexcept
850 if (!canGetTypeFromVariant<T>(v))
852 return v->typedData<T>();
854 template <
typename T>
855 friend const T *get_if(
const QVariant *v)
noexcept
857 if (!canGetTypeFromVariant<T>(v))
859 return v->typedData<
const T>();
862#define Q_MK_GET(CONST, REF)
863 template <typename T> friend CONST T REF get(CONST QVariant REF v)
864 { return static_cast<CONST T REF>(*v.typedData<T>()); }
872 static QVariant moveConstruct(QMetaType type,
void *data);
873 static QVariant copyConstruct(QMetaType type,
const void *data);
876 friend inline T qvariant_cast(
const QVariant &);
878 friend inline T qvariant_cast(QVariant &&);
882 void create(
int type,
const void *copy);
883 void create(QMetaType type,
const void *copy);
884 bool equals(
const QVariant &other)
const;
885 bool convert(
int type,
void *ptr)
const;
886 bool view(
int type,
void *ptr);
890 inline QVariant(
void *) =
delete;
897 QVariant(QMetaType::Type) =
delete;
900 QVariant(std::in_place_t, QMetaType type);
902 void *prepareForEmplace(QMetaType type);
909 QVariant(Qt::GlobalColor) =
delete;
910 QVariant(Qt::BrushStyle) =
delete;
911 QVariant(Qt::PenStyle) =
delete;
912 QVariant(Qt::CursorShape) =
delete;
913#ifdef QT_NO_CAST_FROM_ASCII
915 inline QVariant(
const char *) =
delete;
918 typedef Private DataPtr;
919 inline DataPtr &data_ptr() {
return d; }
920 inline const DataPtr &data_ptr()
const {
return d; }