summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2024-02-01 10:07:52 +0100
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2024-02-23 19:11:04 +0100
commita0fbe7712c8a10b9763094eee1d78b733759177e (patch)
tree8fc9561771b496c2ef161c0db5feb5d76652d433 /src/corelib/kernel
parenta730c426084f18d3890e5fc4462e535e72dbadc6 (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.h24
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))