454 |
454 |
455 template <typename T> |
455 template <typename T> |
456 inline void qVariantSetValue(QVariant &v, const T &t) |
456 inline void qVariantSetValue(QVariant &v, const T &t) |
457 { |
457 { |
458 //if possible we reuse the current QVariant private |
458 //if possible we reuse the current QVariant private |
459 const int type = qMetaTypeId<T>(reinterpret_cast<T *>(0)); |
459 const uint type = qMetaTypeId<T>(reinterpret_cast<T *>(0)); |
460 QVariant::Private &d = v.data_ptr(); |
460 QVariant::Private &d = v.data_ptr(); |
461 if (v.isDetached() && (type <= int(QVariant::Char) || type == d.type)) { |
461 if (v.isDetached() && (type == d.type || (type <= uint(QVariant::Char) && d.type <= uint(QVariant::Char)))) { |
462 d.type = type; |
462 d.type = type; |
|
463 d.is_null = false; |
463 T *old = reinterpret_cast<T*>(d.is_shared ? d.data.shared->ptr : &d.data.ptr); |
464 T *old = reinterpret_cast<T*>(d.is_shared ? d.data.shared->ptr : &d.data.ptr); |
464 if (QTypeInfo<T>::isComplex) |
465 if (QTypeInfo<T>::isComplex) |
465 old->~T(); |
466 old->~T(); |
466 new (old) T(t); //call the copy constructor |
467 new (old) T(t); //call the copy constructor |
467 } else { |
468 } else { |
468 v = QVariant(type, &t, QTypeInfo<T>::isPointer); |
469 v = QVariant(type, &t, QTypeInfo<T>::isPointer); |
469 } |
470 } |
470 } |
471 } |
|
472 |
|
473 template <> |
|
474 inline void qVariantSetValue<QVariant>(QVariant &v, const QVariant &t) |
|
475 { |
|
476 v = t; |
|
477 } |
|
478 |
471 |
479 |
472 inline QVariant::QVariant() {} |
480 inline QVariant::QVariant() {} |
473 inline bool QVariant::isValid() const { return d.type != Invalid; } |
481 inline bool QVariant::isValid() const { return d.type != Invalid; } |
474 |
482 |
475 #ifdef QT3_SUPPORT |
483 #ifdef QT3_SUPPORT |
556 return !operator==(v1, v2); |
564 return !operator==(v1, v2); |
557 } |
565 } |
558 #endif |
566 #endif |
559 |
567 |
560 #ifndef QT_MOC |
568 #ifndef QT_MOC |
561 #if !defined qdoc && defined Q_CC_MSVC && _MSC_VER < 1300 |
569 template<typename T> inline T qvariant_cast(const QVariant &v) |
562 |
|
563 template<typename T> T qvariant_cast(const QVariant &v, T * = 0) |
|
564 { |
570 { |
565 const int vid = qMetaTypeId<T>(static_cast<T *>(0)); |
571 const int vid = qMetaTypeId<T>(static_cast<T *>(0)); |
566 if (vid == v.userType()) |
572 if (vid == v.userType()) |
567 return *reinterpret_cast<const T *>(v.constData()); |
573 return *reinterpret_cast<const T *>(v.constData()); |
568 if (vid < int(QMetaType::User)) { |
574 if (vid < int(QMetaType::User)) { |
571 return t; |
577 return t; |
572 } |
578 } |
573 return T(); |
579 return T(); |
574 } |
580 } |
575 |
581 |
576 template<typename T> |
582 template<> inline QVariant qvariant_cast<QVariant>(const QVariant &v) |
577 inline T qVariantValue(const QVariant &variant, T *t = 0) |
583 { |
578 { return qvariant_cast<T>(variant, t); } |
584 static const int vid = qRegisterMetaType<QVariant>("QVariant"); |
579 |
|
580 template<typename T> |
|
581 inline bool qVariantCanConvert(const QVariant &variant, T *t = 0) |
|
582 { |
|
583 return variant.canConvert(static_cast<QVariant::Type>(qMetaTypeId<T>(t))); |
|
584 } |
|
585 #else |
|
586 |
|
587 template<typename T> T qvariant_cast(const QVariant &v) |
|
588 { |
|
589 const int vid = qMetaTypeId<T>(static_cast<T *>(0)); |
|
590 if (vid == v.userType()) |
585 if (vid == v.userType()) |
591 return *reinterpret_cast<const T *>(v.constData()); |
586 return *reinterpret_cast<const QVariant *>(v.constData()); |
592 if (vid < int(QMetaType::User)) { |
587 return v; |
593 T t; |
|
594 if (qvariant_cast_helper(v, QVariant::Type(vid), &t)) |
|
595 return t; |
|
596 } |
|
597 return T(); |
|
598 } |
588 } |
599 |
589 |
600 template<typename T> |
590 template<typename T> |
601 inline T qVariantValue(const QVariant &variant) |
591 inline T qVariantValue(const QVariant &variant) |
602 { return qvariant_cast<T>(variant); } |
592 { return qvariant_cast<T>(variant); } |
606 { |
596 { |
607 return variant.canConvert(static_cast<QVariant::Type>( |
597 return variant.canConvert(static_cast<QVariant::Type>( |
608 qMetaTypeId<T>(static_cast<T *>(0)))); |
598 qMetaTypeId<T>(static_cast<T *>(0)))); |
609 } |
599 } |
610 #endif |
600 #endif |
611 #endif |
|
612 Q_DECLARE_SHARED(QVariant) |
601 Q_DECLARE_SHARED(QVariant) |
613 Q_DECLARE_TYPEINFO(QVariant, Q_MOVABLE_TYPE); |
602 Q_DECLARE_TYPEINFO(QVariant, Q_MOVABLE_TYPE); |
614 |
603 |
615 #ifndef QT_NO_DEBUG_STREAM |
604 #ifndef QT_NO_DEBUG_STREAM |
616 Q_CORE_EXPORT QDebug operator<<(QDebug, const QVariant &); |
605 Q_CORE_EXPORT QDebug operator<<(QDebug, const QVariant &); |