From 3454e08bb1170e1bb2378a2d3acf7891a849f6e1 Mon Sep 17 00:00:00 2001 From: Mat Sutcliffe Date: Thu, 28 Feb 2019 20:09:49 +0000 Subject: [PATCH] Using more constexpr in metaclass system, that was not possible before due to compiler bugs. --- src/blackmisc/compare.h | 10 +++++----- src/blackmisc/dbus.h | 4 ++-- src/blackmisc/dictionary.h | 2 +- src/blackmisc/json.h | 4 ++-- src/blackmisc/metaclass.h | 16 ++++++++-------- src/blackmisc/simulation/aircraftmodel.cpp | 4 ++-- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/blackmisc/compare.h b/src/blackmisc/compare.h index 0ee854c83..5b30df373 100644 --- a/src/blackmisc/compare.h +++ b/src/blackmisc/compare.h @@ -58,7 +58,7 @@ namespace BlackMisc private: static bool equals(const Derived &a, const Derived &b) { - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); bool result = baseEquals(static_cast *>(&a), static_cast *>(&b)); meta.forEachMember([ & ](auto member) { result = result && EqualsByMetaClass::membersEqual(member.in(a), member.in(b), member.m_flags); }); return result; @@ -122,7 +122,7 @@ namespace BlackMisc private: static bool less(const Derived &a, const Derived &b) { - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); bool result = baseLess(static_cast *>(&a), static_cast *>(&b)); bool gt = baseLess(static_cast *>(&b), static_cast *>(&a)); 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: static int compareImpl(const Derived &a, const Derived &b) { - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); int result = baseCompare(static_cast *>(&a), static_cast *>(&b)); meta.forEachMember([ & ](auto member) { result = result ? result : CompareByMetaClass::membersCompare(member.in(a), member.in(b), member.m_flags); }); return result; @@ -194,7 +194,7 @@ namespace BlackMisc template ::value, int> = 0> QList> operator ()(const T &a, const T &b) const { - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); auto result = baseEquals(static_cast *>(&a), static_cast *>(&b)); meta.forEachMember([ & ](auto member) { @@ -209,7 +209,7 @@ namespace BlackMisc QList> operator ()(const T &a, const T &b, QStringList memberNames) const // clazy:exclude=function-args-by-ref { if (memberNames.isEmpty()) { return CMetaMemberComparator()(a, b); } - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); auto result = baseEquals(static_cast *>(&a), static_cast *>(&b), memberNames); const auto memberName = memberNames.takeFirst(); meta.forEachMember([ & ](auto member) diff --git a/src/blackmisc/dbus.h b/src/blackmisc/dbus.h index 94533f396..67bd693f4 100644 --- a/src/blackmisc/dbus.h +++ b/src/blackmisc/dbus.h @@ -91,7 +91,7 @@ namespace BlackMisc void marshallToDbus(QDBusArgument &arg, Tags...) const { baseMarshall(static_cast *>(derived()), arg); - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); meta.forEachMember([ &, this ](auto member) { using lossless = std::integral_constant())>; @@ -103,7 +103,7 @@ namespace BlackMisc void unmarshallFromDbus(const QDBusArgument &arg, Tags...) { baseUnmarshall(static_cast *>(derived()), arg); - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); meta.forEachMember([ &, this ](auto member) { using lossless = std::integral_constant())>; diff --git a/src/blackmisc/dictionary.h b/src/blackmisc/dictionary.h index b086ee69b..d78be66f9 100644 --- a/src/blackmisc/dictionary.h +++ b/src/blackmisc/dictionary.h @@ -517,7 +517,7 @@ namespace BlackMisc static uint hashImpl(const Derived &value) { uint hash = baseHash(static_cast *>(&value)); - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); meta.forEachMember(Private::Hasher { value, hash }); return hash; } diff --git a/src/blackmisc/json.h b/src/blackmisc/json.h index e507d25ec..57737a383 100644 --- a/src/blackmisc/json.h +++ b/src/blackmisc/json.h @@ -404,7 +404,7 @@ namespace BlackMisc QJsonObject toJson() const { QJsonObject json; - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); meta.forEachMember([ &, this ](auto member) { json << std::make_pair(CExplicitLatin1String(member.latin1Name()), std::cref(member.in(*this->derived()))); @@ -423,7 +423,7 @@ namespace BlackMisc void convertFromJson(const QJsonObject &json) { baseConvertFromJson(static_cast *>(derived()), json); - auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); meta.forEachMember([ &, this ](auto member) { const auto value = json.value(CExplicitLatin1String(member.latin1Name())); diff --git a/src/blackmisc/metaclass.h b/src/blackmisc/metaclass.h index 269486004..fd8ce796a 100644 --- a/src/blackmisc/metaclass.h +++ b/src/blackmisc/metaclass.h @@ -239,12 +239,12 @@ namespace BlackMisc //! Return a CMetaClassIntrospector covering only those members which have the given flags. //! \see BlackMisc::MetaFlags template - static auto with(Flags) { return filter(MaskSequence<(members().at(index()).has(Flags()))...>()); } + constexpr static auto with(Flags) { return filter(MaskSequence<(members().at(index()).has(Flags()))...>()); } //! Return a CMetaClassIntrospector covering only those members which do not have the given flags. //! \see BlackMisc::MetaFlags template - static auto without(Flags) { return filter(MaskSequence<(! members().at(index()).has(Flags()))...>()); } + constexpr static auto without(Flags) { return filter(MaskSequence<(! members().at(index()).has(Flags()))...>()); } //! For each metamember in metaclass, pass metamember as argument to visitor function. template @@ -263,7 +263,7 @@ namespace BlackMisc using MaskSequence = Private::MaskSequence, Mask...>; template - static auto filter(std::index_sequence) { return CMetaClassIntrospector(); } + constexpr static auto filter(std::index_sequence) { return CMetaClassIntrospector(); } template using index = std::integral_constant; @@ -278,22 +278,22 @@ namespace BlackMisc struct CMetaClassAccessor { template - static auto getIntrospector(std::index_sequence) + constexpr static auto getIntrospector(std::index_sequence) { return CMetaClassIntrospector(); } template - static auto getIntrospector() + constexpr static auto getIntrospector() { return getIntrospector(std::make_index_sequence()); } template - static std::true_type hasMetaClass(int, typename T::MetaClass * = nullptr) { return {}; } + constexpr static std::true_type hasMetaClass(int, typename T::MetaClass * = nullptr) { return {}; } template - static std::false_type hasMetaClass(...) { return {}; } + constexpr static std::false_type hasMetaClass(...) { return {}; } }; } @@ -303,7 +303,7 @@ namespace BlackMisc * \ingroup MetaClass */ template - auto introspect() + constexpr auto introspect() { return Private::CMetaClassAccessor::getIntrospector(); } diff --git a/src/blackmisc/simulation/aircraftmodel.cpp b/src/blackmisc/simulation/aircraftmodel.cpp index 24309d205..048f371f6 100644 --- a/src/blackmisc/simulation/aircraftmodel.cpp +++ b/src/blackmisc/simulation/aircraftmodel.cpp @@ -125,7 +125,7 @@ namespace BlackMisc QJsonObject CAircraftModel::toMemoizedJson(MemoHelper::CMemoizer &helper) const { QJsonObject json; - const auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); meta.forEachMember([ &, this ](auto member) { auto &&maybeMemo = helper.maybeMemoize(member.in(*this)); @@ -136,7 +136,7 @@ namespace BlackMisc void CAircraftModel::convertFromMemoizedJson(const QJsonObject &json, const MemoHelper::CUnmemoizer &helper) { - const auto meta = introspect().without(MetaFlags()); + constexpr auto meta = introspect().without(MetaFlags()); meta.forEachMember([ &, this ](auto member) { auto it = json.find(CExplicitLatin1String(member.latin1Name()));