mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-31 21:15:33 +08:00
refs #403 reimplement maybe methods with type dependent templates
This commit is contained in:
@@ -361,13 +361,13 @@ namespace BlackMisc
|
||||
//! Virtual method to return QVariant, used with DBus QVariant lists
|
||||
virtual QVariant toQVariant() const
|
||||
{
|
||||
return maybeToQVariant(IsRegisteredQMetaType<Derived>());
|
||||
return maybeToQVariant<Derived>();
|
||||
}
|
||||
|
||||
//! Set from QVariant
|
||||
virtual void convertFromQVariant(const QVariant &variant)
|
||||
{
|
||||
return maybeConvertFromQVariant(variant, IsRegisteredQMetaType<Derived>());
|
||||
return maybeConvertFromQVariant<Derived>(variant);
|
||||
}
|
||||
|
||||
//! Set property by index
|
||||
@@ -412,7 +412,7 @@ namespace BlackMisc
|
||||
//! Returns the Qt meta type ID of this object.
|
||||
virtual int getMetaTypeId() const
|
||||
{
|
||||
return maybeGetMetaTypeId(IsRegisteredQMetaType<Derived>());
|
||||
return maybeGetMetaTypeId<Derived>();
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -422,7 +422,7 @@ namespace BlackMisc
|
||||
virtual bool isA(int metaTypeId) const
|
||||
{
|
||||
if (metaTypeId == QMetaType::UnknownType) { return false; }
|
||||
if (metaTypeId == maybeGetMetaTypeId(IsRegisteredQMetaType<Derived>())) { return true; }
|
||||
if (metaTypeId == maybeGetMetaTypeId<Derived>()) { return true; }
|
||||
return BaseOrDummy::isA(metaTypeId);
|
||||
}
|
||||
|
||||
@@ -445,13 +445,42 @@ namespace BlackMisc
|
||||
Derived *derived() { return static_cast<Derived *>(this); }
|
||||
|
||||
// fallbacks in case Derived is not a registered meta type
|
||||
template <class T> using IsRegisteredQMetaType = std::integral_constant<bool, QMetaTypeId<T>::Defined>;
|
||||
static int maybeGetMetaTypeId(std::true_type) { return qMetaTypeId<Derived>(); }
|
||||
static int maybeGetMetaTypeId(std::false_type) { return QMetaType::UnknownType; }
|
||||
QVariant maybeToQVariant(std::true_type) const { return QVariant::fromValue(*derived()); }
|
||||
QVariant maybeToQVariant(std::false_type) const { return {}; }
|
||||
void maybeConvertFromQVariant(const QVariant &variant, std::true_type) { BlackMisc::setFromQVariant(derived(), variant); }
|
||||
void maybeConvertFromQVariant(const QVariant &variant, std::false_type) { Q_UNUSED(variant); }
|
||||
|
||||
template <typename T, typename std::enable_if<!QMetaTypeId2<T>::Defined>::type* = nullptr>
|
||||
static int maybeGetMetaTypeId()
|
||||
{
|
||||
return QMetaType::UnknownType;
|
||||
}
|
||||
|
||||
template <class T, typename std::enable_if<QMetaTypeId2<T>::Defined>::type* = nullptr>
|
||||
static int maybeGetMetaTypeId()
|
||||
{
|
||||
return qMetaTypeId<T>();
|
||||
}
|
||||
|
||||
template <class T, typename std::enable_if<!QMetaTypeId2<T>::Defined>::type* = nullptr>
|
||||
QVariant maybeToQVariant() const
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
template <class T, typename std::enable_if<QMetaTypeId2<T>::Defined>::type* = nullptr>
|
||||
QVariant maybeToQVariant() const
|
||||
{
|
||||
return QVariant::fromValue(*derived());
|
||||
}
|
||||
|
||||
template <class T, typename std::enable_if<!QMetaTypeId2<T>::Defined>::type* = nullptr>
|
||||
void maybeConvertFromQVariant(const QVariant &variant)
|
||||
{
|
||||
Q_UNUSED(variant);
|
||||
}
|
||||
|
||||
template <class T, typename std::enable_if<QMetaTypeId2<T>::Defined>::type* = nullptr>
|
||||
void maybeConvertFromQVariant(const QVariant &variant)
|
||||
{
|
||||
BlackMisc::setFromQVariant(derived(), variant);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -58,12 +58,11 @@ namespace BlackMisc
|
||||
static void registerImpl() { QMetaTypeAndDBusOnly::registerImpl<T>(); maybeRegisterMetaValueType<T>(); }
|
||||
|
||||
private:
|
||||
template <class T>
|
||||
static void maybeRegisterMetaValueType() { maybeRegisterMetaValueType<T>(std::is_base_of<CEmpty, T>()); } // FIXME use TemplateIsBaseOf
|
||||
template <class T>
|
||||
static void maybeRegisterMetaValueType(std::true_type) { BlackMisc::registerMetaValueType<T>(); }
|
||||
template <class T>
|
||||
static void maybeRegisterMetaValueType(std::false_type) {}
|
||||
// FIXME use TemplateIsBaseOf
|
||||
template <class T, typename std::enable_if<std::is_base_of<CEmpty, T>::value>::type* = nullptr>
|
||||
static void maybeRegisterMetaValueType() { BlackMisc::registerMetaValueType<T>(); }
|
||||
template <class T, typename std::enable_if<!std::is_base_of<CEmpty, T>::value>::type* = nullptr>
|
||||
static void maybeRegisterMetaValueType() {}
|
||||
};
|
||||
|
||||
//! CValueObject registerMetadata policy which inherits the policy of the base class
|
||||
|
||||
Reference in New Issue
Block a user