diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index 743314f12b4..d690137ac06 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -70,18 +70,6 @@ class QJniArrayBase : public QJniObject > : std::true_type {}; public: - explicit QJniArrayBase(jarray array) - : QJniObject(static_cast(array)) - { - static_assert(sizeof(QJniArrayBase) == sizeof(QJniObject), - "QJniArrayBase must have the same size as QJniObject!"); - } - explicit QJniArrayBase(const QJniObject &object) - : QJniObject(object) - {} - explicit QJniArrayBase(QJniObject &&object) noexcept - : QJniObject(std::move(object)) - {} qsizetype size() const { @@ -91,9 +79,11 @@ public: } template - static constexpr bool CanConvert = CanConvertHelper::value; + static constexpr bool canConvert = CanConvertHelper::value; + template + using IfCanConvert = std::enable_if_t, bool>; template , bool> = true + , IfCanConvert = true > static auto fromContainer(Container &&container) { @@ -136,6 +126,20 @@ public: protected: QJniArrayBase() = default; + ~QJniArrayBase() = default; + + explicit QJniArrayBase(jarray array) + : QJniObject(static_cast(array)) + { + static_assert(sizeof(QJniArrayBase) == sizeof(QJniObject), + "QJniArrayBase must have the same size as QJniObject!"); + } + explicit QJniArrayBase(const QJniObject &object) + : QJniObject(object) + {} + explicit QJniArrayBase(QJniObject &&object) noexcept + : QJniObject(std::move(object)) + {} template static auto makeArray(List &&list, NewFn &&newArray, SetFn &&setRegion); @@ -151,10 +155,19 @@ public: using Type = T; using const_iterator = const QJniArrayIterator; - using QJniArrayBase::QJniArrayBase; + QJniArray() = default; + explicit QJniArray(jarray array) : QJniArrayBase(array) {} + explicit QJniArray(const QJniObject &object) : QJniArrayBase(object) {} + explicit QJniArray(QJniObject &&object) noexcept : QJniArrayBase(std::move(object)) {} + + // base class destructor is protected, so need to provide all SMFs + QJniArray(const QJniArray &other) = default; + QJniArray(QJniArray &&other) noexcept = default; + QJniArray &operator=(const QJniArray &other) = default; + QJniArray &operator=(QJniArray &&other) noexcept = default; template , bool> = true + , IfCanConvert = true > explicit QJniArray(Container &&container); @@ -326,12 +339,11 @@ auto QJniArrayBase::makeObjectArray(List &&list) template template , bool> + , QJniArrayBase::IfCanConvert > QJniArray::QJniArray(Container &&container) - : QJniArrayBase() + : QJniArrayBase(QJniArrayBase::fromContainer(std::forward(container))) { - *this = QJniArrayBase::fromContainer(std::forward(container)); } namespace QtJniTypes diff --git a/src/corelib/kernel/qjniobject.h b/src/corelib/kernel/qjniobject.h index ee111b49cd9..292596d2089 100644 --- a/src/corelib/kernel/qjniobject.h +++ b/src/corelib/kernel/qjniobject.h @@ -815,7 +815,7 @@ auto QJniObject::LocalFrame::convertToJni(T &&value) return newLocalRef(QJniObject::fromString(value)); } else if constexpr (QtJniTypes::IsJniArray::value) { return value.arrayObject(); - } else if constexpr (QJniArrayBase::CanConvert) { + } else if constexpr (QJniArrayBase::canConvert) { using QJniArrayType = decltype(QJniArrayBase::fromContainer(std::forward(value))); using ArrayType = decltype(std::declval().arrayObject()); return newLocalRef(QJniArrayBase::fromContainer(std::forward(value)).template object()); @@ -836,7 +836,7 @@ auto QJniObject::LocalFrame::convertFromJni(QJniObject &&object) return object.toString(); } else if constexpr (QtJniTypes::IsJniArray::value) { return T{object}; - } else if constexpr (QJniArrayBase::CanConvert) { + } else if constexpr (QJniArrayBase::canConvert) { // if we were to create a QJniArray from Type... using QJniArrayType = decltype(QJniArrayBase::fromContainer(std::declval())); // then that QJniArray would have elements of type