use std::ops::Deref;
#[allow(non_camel_case_types)]
type jlong = i64;
#[allow(non_camel_case_types)]
pub type jptr = jlong;
#[derive(Debug)]
pub struct Pointer<Kind> {
value: Box<Kind>,
}
impl<Kind> Pointer<Kind> {
pub fn new(value: Kind) -> Self {
Pointer {
value: Box::new(value),
}
}
pub fn borrow<'a>(self) -> &'a mut Kind {
Box::leak(self.value)
}
}
impl<Kind> From<Pointer<Kind>> for jptr {
fn from(pointer: Pointer<Kind>) -> Self {
Box::into_raw(pointer.value) as _
}
}
impl<Kind> From<jptr> for Pointer<Kind> {
fn from(pointer: jptr) -> Self {
Self {
value: unsafe { Box::from_raw(pointer as *mut Kind) },
}
}
}
impl<Kind> Deref for Pointer<Kind> {
type Target = Kind;
fn deref(&self) -> &Self::Target {
&self.value
}
}
#[cfg(test)]
mod tests {
use crate::{jlong, Pointer};
struct Value {
num: i64,
s: String
}
#[test]
pub fn can_recover_value_from_pointer(){
let value = Value {
num: 6,
s: "Some string".into()
};
let pointer: Pointer<_> = Pointer::new(value);
let pointer_n: jlong = pointer.into();
let pointer2: Pointer<Value> = pointer_n.into();
assert_eq!(pointer2.s, Into::<String>::into("Some string"));
assert_eq!(pointer2.num, 6);
}
}