mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-18 03:15:34 +08:00
Using more constexpr in metaclass system, that was not possible before due to compiler bugs.
This commit is contained in:
@@ -58,7 +58,7 @@ namespace BlackMisc
|
|||||||
private:
|
private:
|
||||||
static bool equals(const Derived &a, const Derived &b)
|
static bool equals(const Derived &a, const Derived &b)
|
||||||
{
|
{
|
||||||
auto meta = introspect<Derived>().without(MetaFlags<DisabledForComparison>());
|
constexpr auto meta = introspect<Derived>().without(MetaFlags<DisabledForComparison>());
|
||||||
bool result = baseEquals(static_cast<const TBaseOfT<Derived> *>(&a), static_cast<const TBaseOfT<Derived> *>(&b));
|
bool result = baseEquals(static_cast<const TBaseOfT<Derived> *>(&a), static_cast<const TBaseOfT<Derived> *>(&b));
|
||||||
meta.forEachMember([ & ](auto member) { result = result && EqualsByMetaClass::membersEqual(member.in(a), member.in(b), member.m_flags); });
|
meta.forEachMember([ & ](auto member) { result = result && EqualsByMetaClass::membersEqual(member.in(a), member.in(b), member.m_flags); });
|
||||||
return result;
|
return result;
|
||||||
@@ -122,7 +122,7 @@ namespace BlackMisc
|
|||||||
private:
|
private:
|
||||||
static bool less(const Derived &a, const Derived &b)
|
static bool less(const Derived &a, const Derived &b)
|
||||||
{
|
{
|
||||||
auto meta = introspect<Derived>().without(MetaFlags<DisabledForComparison>());
|
constexpr auto meta = introspect<Derived>().without(MetaFlags<DisabledForComparison>());
|
||||||
bool result = baseLess(static_cast<const TBaseOfT<Derived> *>(&a), static_cast<const TBaseOfT<Derived> *>(&b));
|
bool result = baseLess(static_cast<const TBaseOfT<Derived> *>(&a), static_cast<const TBaseOfT<Derived> *>(&b));
|
||||||
bool gt = baseLess(static_cast<const TBaseOfT<Derived> *>(&b), static_cast<const TBaseOfT<Derived> *>(&a));
|
bool gt = baseLess(static_cast<const TBaseOfT<Derived> *>(&b), static_cast<const TBaseOfT<Derived> *>(&a));
|
||||||
meta.forEachMember([ & ](auto member) { result = result || LessThanByMetaClass::membersLess(gt, member.in(a), member.in(b), member.m_flags); });
|
meta.forEachMember([ & ](auto member) { result = result || LessThanByMetaClass::membersLess(gt, member.in(a), member.in(b), member.m_flags); });
|
||||||
@@ -159,7 +159,7 @@ namespace BlackMisc
|
|||||||
private:
|
private:
|
||||||
static int compareImpl(const Derived &a, const Derived &b)
|
static int compareImpl(const Derived &a, const Derived &b)
|
||||||
{
|
{
|
||||||
auto meta = introspect<Derived>().without(MetaFlags<DisabledForComparison>());
|
constexpr auto meta = introspect<Derived>().without(MetaFlags<DisabledForComparison>());
|
||||||
int result = baseCompare(static_cast<const TBaseOfT<Derived> *>(&a), static_cast<const TBaseOfT<Derived> *>(&b));
|
int result = baseCompare(static_cast<const TBaseOfT<Derived> *>(&a), static_cast<const TBaseOfT<Derived> *>(&b));
|
||||||
meta.forEachMember([ & ](auto member) { result = result ? result : CompareByMetaClass::membersCompare(member.in(a), member.in(b), member.m_flags); });
|
meta.forEachMember([ & ](auto member) { result = result ? result : CompareByMetaClass::membersCompare(member.in(a), member.in(b), member.m_flags); });
|
||||||
return result;
|
return result;
|
||||||
@@ -194,7 +194,7 @@ namespace BlackMisc
|
|||||||
template <typename T, std::enable_if_t<THasMetaClass<T>::value, int> = 0>
|
template <typename T, std::enable_if_t<THasMetaClass<T>::value, int> = 0>
|
||||||
QList<QPair<QString, bool>> operator ()(const T &a, const T &b) const
|
QList<QPair<QString, bool>> operator ()(const T &a, const T &b) const
|
||||||
{
|
{
|
||||||
auto meta = introspect<T>().without(MetaFlags<DisabledForComparison>());
|
constexpr auto meta = introspect<T>().without(MetaFlags<DisabledForComparison>());
|
||||||
auto result = baseEquals(static_cast<const TBaseOfT<T> *>(&a), static_cast<const TBaseOfT<T> *>(&b));
|
auto result = baseEquals(static_cast<const TBaseOfT<T> *>(&a), static_cast<const TBaseOfT<T> *>(&b));
|
||||||
meta.forEachMember([ & ](auto member)
|
meta.forEachMember([ & ](auto member)
|
||||||
{
|
{
|
||||||
@@ -209,7 +209,7 @@ namespace BlackMisc
|
|||||||
QList<QPair<QString, bool>> operator ()(const T &a, const T &b, QStringList memberNames) const // clazy:exclude=function-args-by-ref
|
QList<QPair<QString, bool>> operator ()(const T &a, const T &b, QStringList memberNames) const // clazy:exclude=function-args-by-ref
|
||||||
{
|
{
|
||||||
if (memberNames.isEmpty()) { return CMetaMemberComparator()(a, b); }
|
if (memberNames.isEmpty()) { return CMetaMemberComparator()(a, b); }
|
||||||
auto meta = introspect<T>().without(MetaFlags<DisabledForComparison>());
|
constexpr auto meta = introspect<T>().without(MetaFlags<DisabledForComparison>());
|
||||||
auto result = baseEquals(static_cast<const TBaseOfT<T> *>(&a), static_cast<const TBaseOfT<T> *>(&b), memberNames);
|
auto result = baseEquals(static_cast<const TBaseOfT<T> *>(&a), static_cast<const TBaseOfT<T> *>(&b), memberNames);
|
||||||
const auto memberName = memberNames.takeFirst();
|
const auto memberName = memberNames.takeFirst();
|
||||||
meta.forEachMember([ & ](auto member)
|
meta.forEachMember([ & ](auto member)
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ namespace BlackMisc
|
|||||||
void marshallToDbus(QDBusArgument &arg, Tags...) const
|
void marshallToDbus(QDBusArgument &arg, Tags...) const
|
||||||
{
|
{
|
||||||
baseMarshall(static_cast<const TBaseOfT<Derived> *>(derived()), arg);
|
baseMarshall(static_cast<const TBaseOfT<Derived> *>(derived()), arg);
|
||||||
auto meta = introspect<Derived>().without(MetaFlags<DisabledForMarshalling>());
|
constexpr auto meta = introspect<Derived>().without(MetaFlags<DisabledForMarshalling>());
|
||||||
meta.forEachMember([ &, this ](auto member)
|
meta.forEachMember([ &, this ](auto member)
|
||||||
{
|
{
|
||||||
using lossless = std::integral_constant<bool, member.has(MetaFlags<LosslessMarshalling>())>;
|
using lossless = std::integral_constant<bool, member.has(MetaFlags<LosslessMarshalling>())>;
|
||||||
@@ -103,7 +103,7 @@ namespace BlackMisc
|
|||||||
void unmarshallFromDbus(const QDBusArgument &arg, Tags...)
|
void unmarshallFromDbus(const QDBusArgument &arg, Tags...)
|
||||||
{
|
{
|
||||||
baseUnmarshall(static_cast<TBaseOfT<Derived> *>(derived()), arg);
|
baseUnmarshall(static_cast<TBaseOfT<Derived> *>(derived()), arg);
|
||||||
auto meta = introspect<Derived>().without(MetaFlags<DisabledForMarshalling>());
|
constexpr auto meta = introspect<Derived>().without(MetaFlags<DisabledForMarshalling>());
|
||||||
meta.forEachMember([ &, this ](auto member)
|
meta.forEachMember([ &, this ](auto member)
|
||||||
{
|
{
|
||||||
using lossless = std::integral_constant<bool, member.has(MetaFlags<LosslessMarshalling>())>;
|
using lossless = std::integral_constant<bool, member.has(MetaFlags<LosslessMarshalling>())>;
|
||||||
|
|||||||
@@ -517,7 +517,7 @@ namespace BlackMisc
|
|||||||
static uint hashImpl(const Derived &value)
|
static uint hashImpl(const Derived &value)
|
||||||
{
|
{
|
||||||
uint hash = baseHash(static_cast<const TBaseOfT<Derived> *>(&value));
|
uint hash = baseHash(static_cast<const TBaseOfT<Derived> *>(&value));
|
||||||
auto meta = introspect<Derived>().without(MetaFlags<DisabledForHashing>());
|
constexpr auto meta = introspect<Derived>().without(MetaFlags<DisabledForHashing>());
|
||||||
meta.forEachMember(Private::Hasher<Derived> { value, hash });
|
meta.forEachMember(Private::Hasher<Derived> { value, hash });
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -404,7 +404,7 @@ namespace BlackMisc
|
|||||||
QJsonObject toJson() const
|
QJsonObject toJson() const
|
||||||
{
|
{
|
||||||
QJsonObject json;
|
QJsonObject json;
|
||||||
auto meta = introspect<Derived>().without(MetaFlags<DisabledForJson>());
|
constexpr auto meta = introspect<Derived>().without(MetaFlags<DisabledForJson>());
|
||||||
meta.forEachMember([ &, this ](auto member)
|
meta.forEachMember([ &, this ](auto member)
|
||||||
{
|
{
|
||||||
json << std::make_pair(CExplicitLatin1String(member.latin1Name()), std::cref(member.in(*this->derived())));
|
json << std::make_pair(CExplicitLatin1String(member.latin1Name()), std::cref(member.in(*this->derived())));
|
||||||
@@ -423,7 +423,7 @@ namespace BlackMisc
|
|||||||
void convertFromJson(const QJsonObject &json)
|
void convertFromJson(const QJsonObject &json)
|
||||||
{
|
{
|
||||||
baseConvertFromJson(static_cast<TBaseOfT<Derived> *>(derived()), json);
|
baseConvertFromJson(static_cast<TBaseOfT<Derived> *>(derived()), json);
|
||||||
auto meta = introspect<Derived>().without(MetaFlags<DisabledForJson>());
|
constexpr auto meta = introspect<Derived>().without(MetaFlags<DisabledForJson>());
|
||||||
meta.forEachMember([ &, this ](auto member)
|
meta.forEachMember([ &, this ](auto member)
|
||||||
{
|
{
|
||||||
const auto value = json.value(CExplicitLatin1String(member.latin1Name()));
|
const auto value = json.value(CExplicitLatin1String(member.latin1Name()));
|
||||||
|
|||||||
@@ -239,12 +239,12 @@ namespace BlackMisc
|
|||||||
//! Return a CMetaClassIntrospector<T> covering only those members which have the given flags.
|
//! Return a CMetaClassIntrospector<T> covering only those members which have the given flags.
|
||||||
//! \see BlackMisc::MetaFlags
|
//! \see BlackMisc::MetaFlags
|
||||||
template <typename Flags>
|
template <typename Flags>
|
||||||
static auto with(Flags) { return filter(MaskSequence<(members().at(index<Is>()).has(Flags()))...>()); }
|
constexpr static auto with(Flags) { return filter(MaskSequence<(members().at(index<Is>()).has(Flags()))...>()); }
|
||||||
|
|
||||||
//! Return a CMetaClassIntrospector<T> covering only those members which do not have the given flags.
|
//! Return a CMetaClassIntrospector<T> covering only those members which do not have the given flags.
|
||||||
//! \see BlackMisc::MetaFlags
|
//! \see BlackMisc::MetaFlags
|
||||||
template <typename Flags>
|
template <typename Flags>
|
||||||
static auto without(Flags) { return filter(MaskSequence<(! members().at(index<Is>()).has(Flags()))...>()); }
|
constexpr static auto without(Flags) { return filter(MaskSequence<(! members().at(index<Is>()).has(Flags()))...>()); }
|
||||||
|
|
||||||
//! For each metamember in metaclass, pass metamember as argument to visitor function.
|
//! For each metamember in metaclass, pass metamember as argument to visitor function.
|
||||||
template <typename F>
|
template <typename F>
|
||||||
@@ -263,7 +263,7 @@ namespace BlackMisc
|
|||||||
using MaskSequence = Private::MaskSequence<std::index_sequence<Is...>, Mask...>;
|
using MaskSequence = Private::MaskSequence<std::index_sequence<Is...>, Mask...>;
|
||||||
|
|
||||||
template <size_t... Js>
|
template <size_t... Js>
|
||||||
static auto filter(std::index_sequence<Js...>) { return CMetaClassIntrospector<T, MetaClass, Js...>(); }
|
constexpr static auto filter(std::index_sequence<Js...>) { return CMetaClassIntrospector<T, MetaClass, Js...>(); }
|
||||||
|
|
||||||
template <size_t I>
|
template <size_t I>
|
||||||
using index = std::integral_constant<size_t, I>;
|
using index = std::integral_constant<size_t, I>;
|
||||||
@@ -278,22 +278,22 @@ namespace BlackMisc
|
|||||||
struct CMetaClassAccessor
|
struct CMetaClassAccessor
|
||||||
{
|
{
|
||||||
template <typename T, size_t... Is>
|
template <typename T, size_t... Is>
|
||||||
static auto getIntrospector(std::index_sequence<Is...>)
|
constexpr static auto getIntrospector(std::index_sequence<Is...>)
|
||||||
{
|
{
|
||||||
return CMetaClassIntrospector<T, typename T::MetaClass, Is...>();
|
return CMetaClassIntrospector<T, typename T::MetaClass, Is...>();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static auto getIntrospector()
|
constexpr static auto getIntrospector()
|
||||||
{
|
{
|
||||||
return getIntrospector<T>(std::make_index_sequence<T::MetaClass::getMemberList().c_size>());
|
return getIntrospector<T>(std::make_index_sequence<T::MetaClass::getMemberList().c_size>());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static std::true_type hasMetaClass(int, typename T::MetaClass * = nullptr) { return {}; }
|
constexpr static std::true_type hasMetaClass(int, typename T::MetaClass * = nullptr) { return {}; }
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static std::false_type hasMetaClass(...) { return {}; }
|
constexpr static std::false_type hasMetaClass(...) { return {}; }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -303,7 +303,7 @@ namespace BlackMisc
|
|||||||
* \ingroup MetaClass
|
* \ingroup MetaClass
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
auto introspect()
|
constexpr auto introspect()
|
||||||
{
|
{
|
||||||
return Private::CMetaClassAccessor::getIntrospector<T>();
|
return Private::CMetaClassAccessor::getIntrospector<T>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ namespace BlackMisc
|
|||||||
QJsonObject CAircraftModel::toMemoizedJson(MemoHelper::CMemoizer &helper) const
|
QJsonObject CAircraftModel::toMemoizedJson(MemoHelper::CMemoizer &helper) const
|
||||||
{
|
{
|
||||||
QJsonObject json;
|
QJsonObject json;
|
||||||
const auto meta = introspect<CAircraftModel>().without(MetaFlags<DisabledForJson>());
|
constexpr auto meta = introspect<CAircraftModel>().without(MetaFlags<DisabledForJson>());
|
||||||
meta.forEachMember([ &, this ](auto member)
|
meta.forEachMember([ &, this ](auto member)
|
||||||
{
|
{
|
||||||
auto &&maybeMemo = helper.maybeMemoize(member.in(*this));
|
auto &&maybeMemo = helper.maybeMemoize(member.in(*this));
|
||||||
@@ -136,7 +136,7 @@ namespace BlackMisc
|
|||||||
|
|
||||||
void CAircraftModel::convertFromMemoizedJson(const QJsonObject &json, const MemoHelper::CUnmemoizer &helper)
|
void CAircraftModel::convertFromMemoizedJson(const QJsonObject &json, const MemoHelper::CUnmemoizer &helper)
|
||||||
{
|
{
|
||||||
const auto meta = introspect<CAircraftModel>().without(MetaFlags<DisabledForJson>());
|
constexpr auto meta = introspect<CAircraftModel>().without(MetaFlags<DisabledForJson>());
|
||||||
meta.forEachMember([ &, this ](auto member)
|
meta.forEachMember([ &, this ](auto member)
|
||||||
{
|
{
|
||||||
auto it = json.find(CExplicitLatin1String(member.latin1Name()));
|
auto it = json.find(CExplicitLatin1String(member.latin1Name()));
|
||||||
|
|||||||
Reference in New Issue
Block a user