Skip to content

Commit 0713d2e

Browse files
[jnigen] added .filled ctor to JArray (#130)
Closed #129.
1 parent f77a3d7 commit 0713d2e

File tree

2 files changed

+55
-17
lines changed

2 files changed

+55
-17
lines changed

pkgs/jni/lib/src/jarray.dart

+32-11
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,38 @@ class JArray<E> extends JObject {
2222
/// Construct a new [JArray] with [reference] as its underlying reference.
2323
JArray.fromRef(JArrayPtr reference) : super.fromRef(reference);
2424

25-
JArray(JType<E> typeClass, int length)
26-
: super.fromRef(
27-
(typeClass._type == JniCallType.objectType)
28-
? _accessors
29-
.newObjectArray(
30-
length, typeClass._getClass().reference, nullptr)
31-
.checkedRef
32-
: _accessors
33-
.newPrimitiveArray(length, typeClass._type)
34-
.checkedRef,
35-
);
25+
/// Creates a [JArray] of the given length from the given [type].
26+
///
27+
/// The [length] must be a non-negative integer.
28+
factory JArray(JType<E> type, int length) {
29+
if (type._type == JniCallType.objectType) {
30+
final clazz = type._getClass();
31+
final array = JArray<E>.fromRef(
32+
_accessors.newObjectArray(length, clazz.reference, nullptr).checkedRef,
33+
);
34+
clazz.delete();
35+
return array;
36+
}
37+
return JArray.fromRef(
38+
_accessors.newPrimitiveArray(length, type._type).checkedRef,
39+
);
40+
}
41+
42+
/// Creates a [JArray] of the given length with [fill] at each position.
43+
///
44+
/// The [length] must be a non-negative integer.
45+
/// The [fill] must be a non-null [JObject].
46+
static JArray<E> filled<E extends JObject>(int length, E fill) {
47+
assert(!fill.isNull, "fill must not be null.");
48+
final clazz = fill.getClass();
49+
final array = JArray<E>.fromRef(
50+
_accessors
51+
.newObjectArray(length, clazz.reference, fill.reference)
52+
.checkedRef,
53+
);
54+
clazz.delete();
55+
return array;
56+
}
3657

3758
int? _length;
3859

pkgs/jni/test/jarray_test.dart

+23-6
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,9 @@ void main() {
199199
array[0] = "حس".toJString()..deletedIn(arena);
200200
array[1] = "\$".toJString()..deletedIn(arena);
201201
array[2] = "33".toJString()..deletedIn(arena);
202-
expect(array[0].toDartString(), "حس");
203-
expect(array[1].toDartString(), "\$");
204-
expect(array[2].toDartString(), "33");
202+
expect(array[0].toDartString(deleteOriginal: true), "حس");
203+
expect(array[1].toDartString(deleteOriginal: true), "\$");
204+
expect(array[2].toDartString(deleteOriginal: true), "33");
205205
array.setRange(
206206
0,
207207
3,
@@ -213,9 +213,9 @@ void main() {
213213
],
214214
1,
215215
);
216-
expect(array[0].toDartString(), "55");
217-
expect(array[1].toDartString(), "66");
218-
expect(array[2].toDartString(), "77");
216+
expect(array[0].toDartString(deleteOriginal: true), "55");
217+
expect(array[1].toDartString(deleteOriginal: true), "66");
218+
expect(array[2].toDartString(deleteOriginal: true), "77");
219219
expect(() {
220220
final _ = array[-1];
221221
}, throwsRangeError);
@@ -256,4 +256,21 @@ void main() {
256256
expect(twoDimArray[2][2], 4);
257257
});
258258
});
259+
test("JArray.filled", () {
260+
using((arena) {
261+
final string = "abc".toJString()..deletedIn(arena);
262+
final array = JArray.filled(3, string)..deletedIn(arena);
263+
expect(
264+
() {
265+
final _ = JArray.filled(3, JString.fromRef(nullptr))
266+
..deletedIn(arena);
267+
},
268+
throwsA(isA<AssertionError>()),
269+
);
270+
expect(array.length, 3);
271+
expect(array[0].toDartString(deleteOriginal: true), "abc");
272+
expect(array[1].toDartString(deleteOriginal: true), "abc");
273+
expect(array[2].toDartString(deleteOriginal: true), "abc");
274+
});
275+
});
259276
}

0 commit comments

Comments
 (0)