diff --git a/src/blackgui/blackguiexport.h b/src/blackgui/blackguiexport.h index e9cb4e023..900601359 100644 --- a/src/blackgui/blackguiexport.h +++ b/src/blackgui/blackguiexport.h @@ -17,7 +17,6 @@ * \def BLACKGUI_EXPORT * Export a class or function from the library */ - #ifndef WITH_STATIC # if defined(BUILD_BLACKGUI_LIB) # define BLACKGUI_EXPORT Q_DECL_EXPORT @@ -32,20 +31,10 @@ * \def BLACKGUI_EXPORT_DECLARE_TEMPLATE * BLACKGUI Export explicit template declaration */ - -/*! - * \def BLACKGUI_EXPORT_DEFINE_TEMPLATE - * BLACKGUI Export explicit template definition - */ #if defined(Q_OS_WIN) && defined(Q_CC_GNU) # define BLACKGUI_EXPORT_DECLARE_TEMPLATE BLACKGUI_EXPORT -# define BLACKGUI_EXPORT_DEFINE_TEMPLATE -#elif defined(Q_OS_WIN) && defined(Q_CC_CLANG) -# define BLACKGUI_EXPORT_DECLARE_TEMPLATE -# define BLACKGUI_EXPORT_DEFINE_TEMPLATE BLACKGUI_EXPORT #else # define BLACKGUI_EXPORT_DECLARE_TEMPLATE -# define BLACKGUI_EXPORT_DEFINE_TEMPLATE #endif #endif // guard diff --git a/src/blackmisc/audio/registermetadataaudio.cpp b/src/blackmisc/audio/registermetadataaudio.cpp index d9f47973c..cb2309da1 100644 --- a/src/blackmisc/audio/registermetadataaudio.cpp +++ b/src/blackmisc/audio/registermetadataaudio.cpp @@ -32,12 +32,4 @@ namespace BlackMisc } } -#if defined(Q_OS_WIN) && defined(Q_CC_CLANG) - namespace Private - { - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert>(int); - } // ns -#endif - } // ns diff --git a/src/blackmisc/aviation/modulator.cpp b/src/blackmisc/aviation/modulator.cpp index fde0299f1..406ba5582 100644 --- a/src/blackmisc/aviation/modulator.cpp +++ b/src/blackmisc/aviation/modulator.cpp @@ -261,9 +261,9 @@ namespace BlackMisc::Aviation // see here for the reason of the forward instantiations // https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl //! \cond PRIVATE - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CModulator; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CModulator; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CModulator; + template class CModulator; + template class CModulator; + template class CModulator; //! \endcond } // namespace diff --git a/src/blackmisc/aviation/registermetadataaviation.cpp b/src/blackmisc/aviation/registermetadataaviation.cpp index 82faefc3b..6a10fc3b2 100644 --- a/src/blackmisc/aviation/registermetadataaviation.cpp +++ b/src/blackmisc/aviation/registermetadataaviation.cpp @@ -55,30 +55,4 @@ namespace BlackMisc } } -#if defined(Q_OS_WIN) && defined(Q_CC_CLANG) - namespace Private - { - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - } // ns -#endif - } // ns diff --git a/src/blackmisc/blackmiscexport.h b/src/blackmisc/blackmiscexport.h index e19b3bb57..65b89a617 100644 --- a/src/blackmisc/blackmiscexport.h +++ b/src/blackmisc/blackmiscexport.h @@ -31,20 +31,10 @@ * \def BLACKMISC_EXPORT_DECLARE_TEMPLATE * Export explicit template declaration */ - -/*! - * \def BLACKMISC_EXPORT_DEFINE_TEMPLATE - * Export explicit template definition - */ #if defined(Q_OS_WIN) && defined(Q_CC_GNU) # define BLACKMISC_EXPORT_DECLARE_TEMPLATE BLACKMISC_EXPORT -# define BLACKMISC_EXPORT_DEFINE_TEMPLATE -#elif defined(Q_OS_WIN) && defined(Q_CC_CLANG) -# define BLACKMISC_EXPORT_DECLARE_TEMPLATE -# define BLACKMISC_EXPORT_DEFINE_TEMPLATE BLACKMISC_EXPORT #else # define BLACKMISC_EXPORT_DECLARE_TEMPLATE -# define BLACKMISC_EXPORT_DEFINE_TEMPLATE #endif #endif // guard diff --git a/src/blackmisc/db/registermetadatadb.cpp b/src/blackmisc/db/registermetadatadb.cpp index bac97a494..29c8ed8b7 100644 --- a/src/blackmisc/db/registermetadatadb.cpp +++ b/src/blackmisc/db/registermetadatadb.cpp @@ -27,16 +27,4 @@ namespace BlackMisc } } -#if defined(Q_OS_WIN) && defined(Q_CC_CLANG) - namespace Private - { - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - } // ns -#endif - } // ns diff --git a/src/blackmisc/geo/earthangle.cpp b/src/blackmisc/geo/earthangle.cpp index df4ddc7df..82e3091a9 100644 --- a/src/blackmisc/geo/earthangle.cpp +++ b/src/blackmisc/geo/earthangle.cpp @@ -180,8 +180,8 @@ namespace BlackMisc::Geo // see here for the reason of thess forward instantiations // https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl //! \cond PRIVATE - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CEarthAngle; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CEarthAngle; + template class CEarthAngle; + template class CEarthAngle; //! \endcond } // namespace diff --git a/src/blackmisc/geo/registermetadatageo.cpp b/src/blackmisc/geo/registermetadatageo.cpp index f9335246d..47d0569e7 100644 --- a/src/blackmisc/geo/registermetadatageo.cpp +++ b/src/blackmisc/geo/registermetadatageo.cpp @@ -24,12 +24,4 @@ namespace BlackMisc } } -#if defined(Q_OS_WIN) && defined(Q_CC_CLANG) - namespace Private - { - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert>(int); - } // ns -#endif - } // ns diff --git a/src/blackmisc/input/registermetadatainput.cpp b/src/blackmisc/input/registermetadatainput.cpp index 93f24cd16..76ac52bb9 100644 --- a/src/blackmisc/input/registermetadatainput.cpp +++ b/src/blackmisc/input/registermetadatainput.cpp @@ -30,16 +30,4 @@ namespace BlackMisc } } -#if defined(Q_OS_WIN) && defined(Q_CC_CLANG) - namespace Private - { - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - } // ns -#endif - } // ns diff --git a/src/blackmisc/mixin/mixinmetatype.h b/src/blackmisc/mixin/mixinmetatype.h index 02a36f481..6f9c80fec 100644 --- a/src/blackmisc/mixin/mixinmetatype.h +++ b/src/blackmisc/mixin/mixinmetatype.h @@ -13,7 +13,7 @@ #include "blackmisc/inheritancetraits.h" #include "blackmisc/propertyindexref.h" -#include "blackmisc/variantprivate.h" +#include "blackmisc/variant.h" #include #include #include @@ -79,23 +79,6 @@ namespace BlackMisc // *INDENT-ON* } // Mixin - - /*! - * This registers the value type T with the BlackMisc meta type system, - * making it available for use with the extended feature set of BlackMisc::CVariant. - * - * The implementation (ab)uses the QMetaType converter function registration mechanism - * to store a type-erased representation of the set of operations supported by T. - */ - template - void registerMetaValueType() - { - if (QMetaType::hasRegisteredConverterFunction()) { return; } - auto converter = [](const T &) { static Private::CValueObjectMetaInfo info; return &info; }; - bool ok = QMetaType::registerConverter(converter); - Q_ASSERT(ok); - Q_UNUSED(ok); - } } // namespace #endif diff --git a/src/blackmisc/network/registermetadatanetwork.cpp b/src/blackmisc/network/registermetadatanetwork.cpp index 4cedcd293..0edb04eaf 100644 --- a/src/blackmisc/network/registermetadatanetwork.cpp +++ b/src/blackmisc/network/registermetadatanetwork.cpp @@ -52,31 +52,4 @@ namespace BlackMisc } } -#if defined(Q_OS_WIN) && defined(Q_CC_CLANG) - namespace Private - { - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - } // ns -#endif - } // ns diff --git a/src/blackmisc/pq/physicalquantity.cpp b/src/blackmisc/pq/physicalquantity.cpp index 8604ba06d..3dd079165 100644 --- a/src/blackmisc/pq/physicalquantity.cpp +++ b/src/blackmisc/pq/physicalquantity.cpp @@ -577,15 +577,15 @@ namespace BlackMisc::PhysicalQuantities // see here for the reason of thess forward instantiations // https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl //! \cond PRIVATE - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CPhysicalQuantity; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CPhysicalQuantity; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CPhysicalQuantity; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CPhysicalQuantity; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CPhysicalQuantity; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CPhysicalQuantity; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CPhysicalQuantity; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CPhysicalQuantity; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CPhysicalQuantity; + template class CPhysicalQuantity; + template class CPhysicalQuantity; + template class CPhysicalQuantity; + template class CPhysicalQuantity; + template class CPhysicalQuantity; + template class CPhysicalQuantity; + template class CPhysicalQuantity; + template class CPhysicalQuantity; + template class CPhysicalQuantity; //! \endcond } // namespace diff --git a/src/blackmisc/registermetadata.cpp b/src/blackmisc/registermetadata.cpp index d30fc47fb..1be4175da 100644 --- a/src/blackmisc/registermetadata.cpp +++ b/src/blackmisc/registermetadata.cpp @@ -108,26 +108,4 @@ namespace BlackMisc qRegisterMetaTypeStreamOperators>(); } -#if defined(Q_OS_WIN) && defined(Q_CC_CLANG) - namespace Private - { - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - } -#endif - } // ns diff --git a/src/blackmisc/simulation/interpolator.cpp b/src/blackmisc/simulation/interpolator.cpp index 792c5f5f4..c42a8f04f 100644 --- a/src/blackmisc/simulation/interpolator.cpp +++ b/src/blackmisc/simulation/interpolator.cpp @@ -887,7 +887,7 @@ namespace BlackMisc::Simulation // see here for the reason of thess forward instantiations // https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl //! \cond PRIVATE - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CInterpolator; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE CInterpolator; + template class CInterpolator; + template class CInterpolator; //! \endcond } // namespace diff --git a/src/blackmisc/simulation/registermetadatasimulation.cpp b/src/blackmisc/simulation/registermetadatasimulation.cpp index 52b832bd5..f2638d54a 100644 --- a/src/blackmisc/simulation/registermetadatasimulation.cpp +++ b/src/blackmisc/simulation/registermetadatasimulation.cpp @@ -85,26 +85,4 @@ namespace BlackMisc } } -#if defined(Q_OS_WIN) && defined(Q_CC_CLANG) - namespace Private - { - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - } // ns -#endif - } // ns diff --git a/src/blackmisc/variant.cpp b/src/blackmisc/variant.cpp index c33801109..50b06e4e8 100644 --- a/src/blackmisc/variant.cpp +++ b/src/blackmisc/variant.cpp @@ -522,6 +522,28 @@ namespace BlackMisc return CIcon(toIcon()).toPixmap(); } + void CVariant::registerMetadata() + { + Private::MetaTypeHelper::maybeRegisterMetaType(); + } + + int CVariant::getMetaTypeId() const + { + return Private::MetaTypeHelper::maybeGetMetaTypeId(); + } + + QString CVariant::getClassName() const + { + return QMetaType::typeName(getMetaTypeId()); + } + + bool CVariant::isA(int metaTypeId) const + { + if (metaTypeId == QMetaType::UnknownType) { return false; } + if (metaTypeId == getMetaTypeId()) { return true; } + return false; + } + bool CVariant::matches(const CVariant &value) const { if (! isValid()) { return false; } diff --git a/src/blackmisc/variant.h b/src/blackmisc/variant.h index 474cc2711..43e789ed2 100644 --- a/src/blackmisc/variant.h +++ b/src/blackmisc/variant.h @@ -20,7 +20,6 @@ #include "blackmisc/mixin/mixinjson.h" #include "blackmisc/range.h" #include "blackmisc/mixin/mixinstring.h" -#include "blackmisc/mixin/mixinmetatype.h" #include "blackmisc/variantprivate.h" #include "blackmisc/icons.h" @@ -40,12 +39,28 @@ namespace BlackMisc class CIcon; class CPropertyIndex; + /*! + * This registers the value type T with the BlackMisc meta type system, + * making it available for use with the extended feature set of BlackMisc::CVariant. + * + * The implementation (ab)uses the QMetaType converter function registration mechanism + * to store a type-erased representation of the set of operations supported by T. + */ + template + void registerMetaValueType() + { + if (QMetaType::hasRegisteredConverterFunction()) { return; } + auto converter = [](const T &) { static Private::CValueObjectMetaInfo info; return &info; }; + bool ok = QMetaType::registerConverter(converter); + Q_ASSERT(ok); + Q_UNUSED(ok); + } + /*! * Wrapper around QVariant which provides transparent access to CValueObject methods * of the contained object if it is registered with BlackMisc::registerMetaValueType. */ class BLACKMISC_EXPORT CVariant : - public Mixin::MetaType, public Mixin::EqualsByCompare, public Mixin::LessThanByCompare, public Mixin::DBusOperators, @@ -267,6 +282,18 @@ namespace BlackMisc //! \copydoc BlackMisc::Mixin::Icon::toIcon CIcons::IconIndex toIcon() const; + //! \copydoc BlackMisc::Mixin::MetaType::registerMetadata + static void registerMetadata(); + + //! \copydoc BlackMisc::Mixin::MetaType::getMetaTypeId + int getMetaTypeId() const; + + //! \copydoc BlackMisc::Mixin::MetaType::getClassName + QString getClassName() const; + + //! \copydoc BlackMisc::Mixin::MetaType::isA + bool isA(int metaTypeId) const; + //! If this is an event subscription, return true if it matches the given event. bool matches(const CVariant &event) const; @@ -303,21 +330,25 @@ Q_DECLARE_METATYPE(BlackMisc::CVariant) namespace BlackMisc::Private { - //! \private - template - void maybeRegisterMetaListConvert(int) + //! \cond PRIVATE + template + void MetaTypeHelper::maybeRegisterMetaList() { - if (QMetaType::hasRegisteredConverterFunction(qMetaTypeId(), qMetaTypeId>())) { return; } + if constexpr (canConvertVariantList(0)) + { + if (QMetaType::hasRegisteredConverterFunction(qMetaTypeId(), qMetaTypeId>())) { return; } - QMetaType::registerConverter>([](const T &list) -> QVector - { - return list.transform([](const typename T::value_type &v) { return CVariant::from(v); }); - }); - QMetaType::registerConverter, T>([](const QVector &list) -> T - { - return makeRange(list).transform([](const CVariant &v) { return v.to(); }); - }); + QMetaType::registerConverter>([](const T &list) -> QVector + { + return list.transform([](const typename T::value_type &v) { return CVariant::from(v); }); + }); + QMetaType::registerConverter, T>([](const QVector &list) -> T + { + return makeRange(list).transform([](const CVariant &v) { return v.to(); }); + }); + } } + //! \endcond } // namespace #endif diff --git a/src/blackmisc/variantprivate.h b/src/blackmisc/variantprivate.h index 9aa73ec27..9d52fb80c 100644 --- a/src/blackmisc/variantprivate.h +++ b/src/blackmisc/variantprivate.h @@ -13,6 +13,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/inheritancetraits.h" +#include "blackmisc/propertyindexref.h" #include #include #include @@ -229,9 +230,9 @@ namespace BlackMisc //! \cond PRIVATE template , T> && ! std::is_same_v>> - void maybeRegisterMetaListConvert(int); + constexpr bool canConvertVariantList(int) { return true; } template - void maybeRegisterMetaListConvert(...) {} + constexpr bool canConvertVariantList(...) { return false; } template struct MetaTypeHelper @@ -249,9 +250,10 @@ namespace BlackMisc qDBusRegisterMetaType(); qRegisterMetaTypeStreamOperators(); registerMetaValueType(); - maybeRegisterMetaListConvert(0); + maybeRegisterMetaList(); } } + static void maybeRegisterMetaList(); }; //! \endcond } diff --git a/src/blackmisc/weather/registermetadataweather.cpp b/src/blackmisc/weather/registermetadataweather.cpp index ac517ab68..5b6aecd83 100644 --- a/src/blackmisc/weather/registermetadataweather.cpp +++ b/src/blackmisc/weather/registermetadataweather.cpp @@ -37,24 +37,4 @@ namespace BlackMisc } } -#if defined(Q_OS_WIN) && defined(Q_CC_CLANG) - namespace Private - { - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - template void maybeRegisterMetaListConvert>(int); - } // ns -#endif - } // ns