[wpiutil] jni_util: Add JSpan and CriticalJSpan (#5554)

These replace JArrayRef et al and support statically sized arrays similar to std::span.
This commit is contained in:
Joseph Eng
2023-08-24 00:02:56 -07:00
committed by GitHub
parent 8f3d6a1d4b
commit 2e4ad35e36
19 changed files with 333 additions and 317 deletions

View File

@@ -77,7 +77,7 @@ void JNI_UnloadTypes(JNIEnv* env) {
} // namespace nt
static std::vector<int> FromJavaBooleanArray(JNIEnv* env, jbooleanArray jarr) {
CriticalJBooleanArrayRef ref{env, jarr};
CriticalJSpan<const jboolean> ref{env, jarr};
if (!ref) {
return {};
}
@@ -214,7 +214,7 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_setRaw
indexOobEx.Throw(env, "len must be >= 0");
return false;
}
CriticalJByteArrayRef cvalue{env, value};
CriticalJSpan<const jbyte> cvalue{env, value};
if (static_cast<unsigned int>(start + len) > cvalue.size()) {
indexOobEx.Throw(env, "start + len must be smaller than array length");
return false;
@@ -243,7 +243,7 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_setRawBuffer
indexOobEx.Throw(env, "len must be >= 0");
return false;
}
JByteArrayRef cvalue{env, value, start + len};
JSpan<const jbyte> cvalue{env, value, static_cast<size_t>(start + len)};
if (!cvalue) {
illegalArgEx.Throw(env, "value must be a native ByteBuffer");
return false;
@@ -310,7 +310,7 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_setDefaultRaw
indexOobEx.Throw(env, "len must be >= 0");
return false;
}
CriticalJByteArrayRef cvalue{env, defaultValue};
CriticalJSpan<const jbyte> cvalue{env, defaultValue};
if (static_cast<unsigned int>(start + len) > cvalue.size()) {
indexOobEx.Throw(env, "start + len must be smaller than array length");
return false;
@@ -339,7 +339,7 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_setDefaultRawBuffer
indexOobEx.Throw(env, "len must be >= 0");
return false;
}
JByteArrayRef cvalue{env, defaultValue, start + len};
JSpan<const jbyte> cvalue{env, defaultValue, static_cast<size_t>(start + len)};
if (!cvalue) {
illegalArgEx.Throw(env, "value must be a native ByteBuffer");
return false;

View File

@@ -190,7 +190,7 @@
"jtype": "jbyteArray",
"jtypestr": "[B",
"JavaObject": true,
"FromJavaBegin": "CriticalJByteArrayRef{env, ",
"FromJavaBegin": "CriticalJSpan<const jbyte>{env, ",
"FromJavaEnd": "}.uarray()",
"ToJavaBegin": "MakeJByteArray(env, ",
"ToJavaEnd": ")",
@@ -262,7 +262,7 @@
"jtype": "jlongArray",
"jtypestr": "[J",
"JavaObject": true,
"FromJavaBegin": "CriticalJLongArrayRef{env, ",
"FromJavaBegin": "CriticalJSpan<const jlong>{env, ",
"FromJavaEnd": "}",
"ToJavaBegin": "MakeJLongArray(env, ",
"ToJavaEnd": ")",
@@ -298,7 +298,7 @@
"jtype": "jfloatArray",
"jtypestr": "[F",
"JavaObject": true,
"FromJavaBegin": "CriticalJFloatArrayRef{env, ",
"FromJavaBegin": "CriticalJSpan<const jfloat>{env, ",
"FromJavaEnd": "}",
"ToJavaBegin": "MakeJFloatArray(env, ",
"ToJavaEnd": ")",
@@ -334,7 +334,7 @@
"jtype": "jdoubleArray",
"jtypestr": "[D",
"JavaObject": true,
"FromJavaBegin": "CriticalJDoubleArrayRef{env, ",
"FromJavaBegin": "CriticalJSpan<const jdouble>{env, ",
"FromJavaEnd": "}",
"ToJavaBegin": "MakeJDoubleArray(env, ",
"ToJavaEnd": ")",

View File

@@ -1262,7 +1262,7 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_setServer__I_3Ljava_lang_Strin
"serverNames and ports arrays must be the same size");
return;
}
jint* portInts = env->GetIntArrayElements(ports, nullptr);
JSpan<const jint> portInts{env, ports};
if (!portInts) {
return;
}
@@ -1282,7 +1282,6 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_setServer__I_3Ljava_lang_Strin
servers.emplace_back(
std::make_pair(std::string_view{names.back()}, portInts[i]));
}
env->ReleaseIntArrayElements(ports, portInts, JNI_ABORT);
nt::SetServer(inst, servers);
}