Skip to main content

toad_jni/java/
primitive.rs

1use jni::objects::{JValue, JValueOwned};
2
3use crate::java;
4
5/// Primitive java values that can be cheaply converted to / from [`JValue`]
6/// and can be wrapped by an Object class.
7pub trait Primitive
8  where Self: java::Type + Sized + Copy
9{
10  /// The Object type that this type may be wrapped with
11  type PrimitiveWrapper: java::Class;
12
13  /// Create a new instance of [`Self::PrimitiveWrapper`] from a copy of `self`
14  fn to_primitive_wrapper(&self, e: &mut java::Env) -> Self::PrimitiveWrapper;
15
16  /// Perform the inverse conversion, yielding `Self` from `Self::PrimitiveWrapper`
17  fn from_primitive_wrapper(e: &mut java::Env, w: Self::PrimitiveWrapper) -> Self;
18
19  /// Convert a local JValue reference to `Self`
20  fn from_jvalue_ref(jv: JValue) -> Self;
21
22  /// Convert an owned local JValue to Self
23  fn from_jvalue(jv: JValueOwned) -> Self;
24
25  /// Convert self to a JValue
26  fn into_jvalue<'local>(self) -> JValueOwned<'local>;
27}
28
29impl Primitive for i8 {
30  type PrimitiveWrapper = java::lang::Byte;
31
32  fn to_primitive_wrapper(&self, e: &mut java::Env) -> Self::PrimitiveWrapper {
33    java::lang::Byte::new(e, *self)
34  }
35
36  fn from_primitive_wrapper(e: &mut java::Env, w: Self::PrimitiveWrapper) -> Self {
37    w.inner(e)
38  }
39
40  fn from_jvalue_ref(jv: JValue) -> i8 {
41    jv.b().unwrap()
42  }
43
44  fn from_jvalue(jv: JValueOwned) -> Self {
45    jv.b().unwrap()
46  }
47
48  fn into_jvalue<'local>(self) -> JValueOwned<'local> {
49    self.into()
50  }
51}
52
53impl Primitive for u16 {
54  type PrimitiveWrapper = java::lang::Char;
55
56  fn to_primitive_wrapper(&self, e: &mut java::Env) -> Self::PrimitiveWrapper {
57    java::lang::Char::new(e, *self)
58  }
59
60  fn from_primitive_wrapper(e: &mut java::Env, w: Self::PrimitiveWrapper) -> Self {
61    w.inner(e)
62  }
63
64  fn from_jvalue_ref(jv: JValue) -> u16 {
65    jv.c().unwrap()
66  }
67
68  fn from_jvalue(jv: JValueOwned) -> Self {
69    Self::from_jvalue_ref((&jv).into())
70  }
71
72  fn into_jvalue<'local>(self) -> JValueOwned<'local> {
73    self.into()
74  }
75}
76
77impl Primitive for i16 {
78  type PrimitiveWrapper = java::lang::Short;
79
80  fn to_primitive_wrapper(&self, e: &mut java::Env) -> Self::PrimitiveWrapper {
81    java::lang::Short::new(e, *self)
82  }
83
84  fn from_primitive_wrapper(e: &mut java::Env, w: Self::PrimitiveWrapper) -> Self {
85    w.inner(e)
86  }
87
88  fn from_jvalue_ref(jv: JValue) -> i16 {
89    jv.s().unwrap()
90  }
91
92  fn from_jvalue(jv: JValueOwned) -> Self {
93    Self::from_jvalue_ref((&jv).into())
94  }
95
96  fn into_jvalue<'local>(self) -> JValueOwned<'local> {
97    self.into()
98  }
99}
100
101impl Primitive for i32 {
102  type PrimitiveWrapper = java::lang::Integer;
103
104  fn to_primitive_wrapper(&self, e: &mut java::Env) -> Self::PrimitiveWrapper {
105    java::lang::Integer::new(e, *self)
106  }
107
108  fn from_primitive_wrapper(e: &mut java::Env, w: Self::PrimitiveWrapper) -> Self {
109    w.inner(e)
110  }
111
112  fn from_jvalue_ref(jv: JValue) -> i32 {
113    jv.i().unwrap()
114  }
115
116  fn from_jvalue(jv: JValueOwned) -> Self {
117    Self::from_jvalue_ref((&jv).into())
118  }
119
120  fn into_jvalue<'local>(self) -> JValueOwned<'local> {
121    self.into()
122  }
123}
124
125impl Primitive for i64 {
126  type PrimitiveWrapper = java::lang::Long;
127
128  fn to_primitive_wrapper(&self, e: &mut java::Env) -> Self::PrimitiveWrapper {
129    java::lang::Long::new(e, *self)
130  }
131
132  fn from_primitive_wrapper(e: &mut java::Env, w: Self::PrimitiveWrapper) -> Self {
133    w.inner(e)
134  }
135
136  fn from_jvalue_ref(jv: JValue) -> i64 {
137    jv.j().unwrap()
138  }
139
140  fn from_jvalue(jv: JValueOwned) -> Self {
141    Self::from_jvalue_ref((&jv).into())
142  }
143
144  fn into_jvalue<'local>(self) -> JValueOwned<'local> {
145    self.into()
146  }
147}
148
149impl Primitive for f32 {
150  type PrimitiveWrapper = java::lang::Float;
151
152  fn to_primitive_wrapper(&self, e: &mut java::Env) -> Self::PrimitiveWrapper {
153    java::lang::Float::new(e, *self)
154  }
155
156  fn from_primitive_wrapper(e: &mut java::Env, w: Self::PrimitiveWrapper) -> Self {
157    w.inner(e)
158  }
159
160  fn from_jvalue_ref(jv: JValue) -> f32 {
161    jv.f().unwrap()
162  }
163
164  fn from_jvalue(jv: JValueOwned) -> Self {
165    Self::from_jvalue_ref((&jv).into())
166  }
167
168  fn into_jvalue<'local>(self) -> JValueOwned<'local> {
169    self.into()
170  }
171}
172
173impl Primitive for f64 {
174  type PrimitiveWrapper = java::lang::Double;
175
176  fn to_primitive_wrapper(&self, e: &mut java::Env) -> Self::PrimitiveWrapper {
177    java::lang::Double::new(e, *self)
178  }
179
180  fn from_primitive_wrapper(e: &mut java::Env, w: Self::PrimitiveWrapper) -> Self {
181    w.inner(e)
182  }
183
184  fn from_jvalue_ref(jv: JValue) -> f64 {
185    jv.d().unwrap()
186  }
187
188  fn from_jvalue(jv: JValueOwned) -> Self {
189    Self::from_jvalue_ref((&jv).into())
190  }
191
192  fn into_jvalue<'local>(self) -> JValueOwned<'local> {
193    self.into()
194  }
195}
196
197impl Primitive for bool {
198  type PrimitiveWrapper = java::lang::Bool;
199
200  fn to_primitive_wrapper(&self, e: &mut java::Env) -> Self::PrimitiveWrapper {
201    java::lang::Bool::new(e, *self)
202  }
203
204  fn from_primitive_wrapper(e: &mut java::Env, w: Self::PrimitiveWrapper) -> Self {
205    w.inner(e)
206  }
207
208  fn from_jvalue_ref(jv: JValue) -> bool {
209    jv.z().unwrap()
210  }
211
212  fn from_jvalue(jv: JValueOwned) -> Self {
213    Self::from_jvalue_ref((&jv).into())
214  }
215
216  fn into_jvalue<'local>(self) -> JValueOwned<'local> {
217    self.into()
218  }
219}