From a0fbe7712c8a10b9763094eee1d78b733759177e Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Thu, 1 Feb 2024 10:07:52 +0100 Subject: [PATCH] JNI: don't depend on Qt-specific container API in QJniArray Use std::size, std::data, std::begin instead of member functions that do not exist in e.g. std::initializer_list or arrays. Change-Id: I073b69f51ef93c2fe87104f1d7f8fbed3c603b33 Reviewed-by: Marc Mutz --- src/corelib/kernel/qjniarray.h | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index 862bd71bafc..302a8aa9dc0 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -10,8 +10,9 @@ #include #include +#include #include -#include +#include QT_BEGIN_NAMESPACE @@ -90,8 +91,9 @@ class QJniArrayBase // for SFINAE'ing out the fromContainer named constructor template struct CanConvertHelper : std::false_type {}; template - struct CanConvertHelper().data()), - decltype(std::declval().size()) + struct CanConvertHelper())), + decltype(std::size(std::declval())), + typename Container::value_type > > : std::true_type {}; @@ -113,7 +115,7 @@ public: } template - static constexpr bool canConvert = CanConvertHelper::value; + static constexpr bool canConvert = CanConvertHelper>::value; template using IfCanConvert = std::enable_if_t, bool>; template static auto fromContainer(Container &&container) { - Q_ASSERT_X(size_t(container.size()) <= size_t((std::numeric_limits::max)()), + Q_ASSERT_X(size_t(std::size(container)) <= size_t((std::numeric_limits::max)()), "QJniArray::fromContainer", "Container is too large for a Java array"); using ElementType = typename std::remove_reference_t::value_type; @@ -356,7 +358,7 @@ public: template auto QJniArrayBase::makeArray(List &&list, NewFn &&newArray, SetFn &&setRegion) { - const size_type length = size_type(list.size()); + const size_type length = size_type(std::size(list)); JNIEnv *env = QJniEnvironment::getJniEnv(); auto localArray = (env->*newArray)(length); if (QJniEnvironment::checkAndClearExceptions(env)) @@ -365,7 +367,7 @@ auto QJniArrayBase::makeArray(List &&list, NewFn &&newArray, SetFn &&setRegion) // can't use static_cast here because we have signed/unsigned mismatches if (length) { (env->*setRegion)(localArray, 0, length, - reinterpret_cast(std::as_const(list).data())); + reinterpret_cast(std::data(std::as_const(list)))); } return QJniArray(localArray); }; @@ -378,21 +380,21 @@ auto QJniArrayBase::makeObjectArray(List &&list) std::declval())) >; - if (list.isEmpty()) + if (std::size(list) == 0) return ResultType(); JNIEnv *env = QJniEnvironment::getJniEnv(); - const size_type length = size_type(list.size()); + const size_type length = size_type(std::size(list)); // this assumes that all objects in the list have the same class jclass elementClass = nullptr; if constexpr (std::disjunction_v, std::is_base_of>) { - elementClass = list.first().objectClass(); + elementClass = std::begin(list)->objectClass(); } else if constexpr (std::is_same_v) { elementClass = env->FindClass("java/lang/String"); } else { - elementClass = env->GetObjectClass(list.first()); + elementClass = env->GetObjectClass(*std::begin(list)); } auto localArray = env->NewObjectArray(length, elementClass, nullptr); if (QJniEnvironment::checkAndClearExceptions(env))