src/corelib/kernel/qvariant.h
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
2:56cd8111b7f7 3:41300fa6a67c
   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 &);