1use typed_jni_core::{JNIEnv, StrongRef};
2
3use crate::{Array, Class, LocalObject, Object, ObjectType, TypedArrayExt, TypedRef, builtin::JavaThrowable};
4
5pub trait TypedObjectArrayExt: TypedArrayExt {
7 fn typed_new_array<T: ObjectType, R: StrongRef>(
9 &self,
10 cls: &Class<R, T>,
11 len: i32,
12 ) -> Result<LocalObject<'_, Array<T>>, LocalObject<'_, JavaThrowable>>;
13
14 fn typed_new_array_with_initial<T: ObjectType, R: StrongRef, IR: StrongRef>(
16 &self,
17 cls: &Class<R, T>,
18 len: i32,
19 initial: &Object<IR, T>,
20 ) -> Result<LocalObject<'_, Array<T>>, LocalObject<'_, JavaThrowable>>;
21
22 fn typed_get_array_element<T: ObjectType, R: StrongRef>(
24 &self,
25 arr: &Object<R, Array<T>>,
26 index: i32,
27 ) -> Result<Option<LocalObject<'_, T>>, LocalObject<'_, JavaThrowable>>;
28
29 fn typed_set_array_element<T: ObjectType, R: StrongRef>(
31 &self,
32 arr: &Object<R, Array<T>>,
33 index: i32,
34 value: Option<&Object<R, T>>,
35 ) -> Result<(), LocalObject<'_, JavaThrowable>>;
36}
37
38impl<'vm> TypedObjectArrayExt for JNIEnv<'vm> {
39 fn typed_new_array<T: ObjectType, R: StrongRef>(
40 &self,
41 cls: &Class<R, T>,
42 len: i32,
43 ) -> Result<LocalObject<'_, Array<T>>, LocalObject<'_, JavaThrowable>> {
44 unsafe {
45 self.new_object_array(&**cls, len)
46 .map(|v| LocalObject::from_ref(v))
47 .map_err(|err| LocalObject::from_ref(err))
48 }
49 }
50
51 fn typed_new_array_with_initial<T: ObjectType, R: StrongRef, IR: StrongRef>(
52 &self,
53 cls: &Class<R, T>,
54 len: i32,
55 initial: &Object<IR, T>,
56 ) -> Result<LocalObject<'_, Array<T>>, LocalObject<'_, JavaThrowable>> {
57 unsafe {
58 self.new_object_array_with_initial(&**cls, len, &**initial)
59 .map(|v| LocalObject::from_ref(v))
60 .map_err(|err| LocalObject::from_ref(err))
61 }
62 }
63
64 fn typed_get_array_element<T: ObjectType, R: StrongRef>(
65 &self,
66 arr: &Object<R, Array<T>>,
67 index: i32,
68 ) -> Result<Option<LocalObject<'_, T>>, LocalObject<'_, JavaThrowable>> {
69 unsafe {
70 self.get_object_array_element(&**arr, index)
71 .map(|v| v.map(|v| LocalObject::from_ref(v)))
72 .map_err(|err| LocalObject::from_ref(err))
73 }
74 }
75
76 fn typed_set_array_element<T: ObjectType, R: StrongRef>(
77 &self,
78 arr: &Object<R, Array<T>>,
79 index: i32,
80 value: Option<&Object<R, T>>,
81 ) -> Result<(), LocalObject<'_, JavaThrowable>> {
82 unsafe {
83 self.set_object_array_element(&**arr, index, value.map(|v| &**v))
84 .map_err(|err| LocalObject::from_ref(err))
85 }
86 }
87}