diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2024-02-01 10:07:52 +0100 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2024-02-23 19:11:04 +0100 |
commit | a0fbe7712c8a10b9763094eee1d78b733759177e (patch) | |
tree | 8fc9561771b496c2ef161c0db5feb5d76652d433 /src/corelib/kernel | |
parent | a730c426084f18d3890e5fc4462e535e72dbadc6 (diff) |
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 <marc.mutz@qt.io>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qjniarray.h | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index 862bd71baf..302a8aa9dc 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -10,8 +10,9 @@ #include <QtCore/qbytearray.h> #include <QtCore/qjniobject.h> +#include <iterator> #include <utility> -#include <type_traits> +#include <QtCore/q20type_traits.h> QT_BEGIN_NAMESPACE @@ -90,8 +91,9 @@ class QJniArrayBase // for SFINAE'ing out the fromContainer named constructor template <typename Container, typename = void> struct CanConvertHelper : std::false_type {}; template <typename Container> - struct CanConvertHelper<Container, std::void_t<decltype(std::declval<Container>().data()), - decltype(std::declval<Container>().size()) + struct CanConvertHelper<Container, std::void_t<decltype(std::data(std::declval<Container>())), + decltype(std::size(std::declval<Container>())), + typename Container::value_type > > : std::true_type {}; @@ -113,7 +115,7 @@ public: } template <typename Container> - static constexpr bool canConvert = CanConvertHelper<Container>::value; + static constexpr bool canConvert = CanConvertHelper<q20::remove_cvref_t<Container>>::value; template <typename Container> using IfCanConvert = std::enable_if_t<canConvert<Container>, bool>; template <typename Container @@ -121,7 +123,7 @@ public: > static auto fromContainer(Container &&container) { - Q_ASSERT_X(size_t(container.size()) <= size_t((std::numeric_limits<size_type>::max)()), + Q_ASSERT_X(size_t(std::size(container)) <= size_t((std::numeric_limits<size_type>::max)()), "QJniArray::fromContainer", "Container is too large for a Java array"); using ElementType = typename std::remove_reference_t<Container>::value_type; @@ -356,7 +358,7 @@ public: template <typename ElementType, typename List, typename NewFn, typename SetFn> 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<const ElementType *>(std::as_const(list).data())); + reinterpret_cast<const ElementType *>(std::data(std::as_const(list)))); } return QJniArray<ElementType>(localArray); }; @@ -378,21 +380,21 @@ auto QJniArrayBase::makeObjectArray(List &&list) std::declval<ElementType>())) >; - 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_same<ElementType, QJniObject>, std::is_base_of<QtJniTypes::JObjectBase, ElementType>>) { - elementClass = list.first().objectClass(); + elementClass = std::begin(list)->objectClass(); } else if constexpr (std::is_same_v<ElementType, QString>) { 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)) |