use crate::jvm::JavaScalar;
use crate::jvm::Jvm;
use crate::jvm::JvmOp;
use crate::jvm::JvmRefOp;
use crate::jvm::JvmScalarOp;
use crate::Java;
use crate::JavaObject;
use crate::Local;
use crate::Null;
macro_rules! identity_jvm_op {
($([$($param:tt)*] $t:ty,)*) => {
$(
impl<$($param)*> JvmOp for $t {
type Output<'jvm> = Self;
fn do_jni<'jvm>(self, _jvm: &mut Jvm<'jvm>) -> crate::LocalResult<'jvm, Self::Output<'jvm>> {
Ok(self)
}
}
)*
};
}
identity_jvm_op! {
[] bool, [] i8, [] i16, [] i32, [] i64,
[] char, [] u16,
[] (),
[] f32, [] f64,
[R: JavaObject] &R,
[R: JavaObject] &Local<'_, R>,
[R: JavaObject] &Java<R>,
[R: JavaObject] &Option<Local<'_, R>>,
[R: JavaObject] &Option<Java<R>>,
[] Null,
}
pub trait IntoJava<T: JavaObject> {
type JvmOp: JvmRefOp<T>;
fn into_op(self) -> Self::JvmOp;
}
impl<J, T> IntoJava<T> for J
where
T: JavaObject,
J: JvmRefOp<T>,
{
type JvmOp = J;
fn into_op(self) -> Self::JvmOp {
self
}
}
pub trait IntoScalar<T: JavaScalar> {
type JvmOp: JvmScalarOp<T>;
fn into_op(self) -> Self::JvmOp;
}
impl<J, T> IntoScalar<T> for J
where
T: JavaScalar,
J: JvmScalarOp<T>,
{
type JvmOp = J;
fn into_op(self) -> Self::JvmOp {
self
}
}
pub trait JavaConstructor<T: JavaObject>
where
Self: for<'jvm> JvmOp<Output<'jvm> = Local<'jvm, T>>,
Self: std::ops::Deref<Target = T::OfOp<Self>>,
{
}
impl<J, T> JavaConstructor<T> for J
where
T: JavaObject,
J: for<'jvm> JvmOp<Output<'jvm> = Local<'jvm, T>>,
J: std::ops::Deref<Target = T::OfOp<Self>>,
{
}
pub trait IntoVoid: for<'jvm> JvmOp<Output<'jvm> = ()> {}
impl<J> IntoVoid for J where J: for<'jvm> JvmOp<Output<'jvm> = ()> {}
pub trait JavaMethod<T>
where
T: JavaObject,
Self: for<'jvm> JvmOp<Output<'jvm> = Option<Local<'jvm, T>>>,
Self: std::ops::Deref<Target = T::OfOp<Self>>,
{
}
impl<J, T> JavaMethod<T> for J
where
T: JavaObject,
for<'jvm> Self: JvmOp<Output<'jvm> = Option<Local<'jvm, T>>>,
J: std::ops::Deref<Target = T::OfOp<J>>,
{
}
pub trait ScalarMethod<T>
where
T: JavaScalar,
for<'jvm> Self: JvmOp<Output<'jvm> = T>,
{
}
impl<J, T> ScalarMethod<T> for J
where
T: JavaScalar,
for<'jvm> Self: JvmOp<Output<'jvm> = T>,
{
}
pub trait VoidMethod
where
for<'jvm> Self: JvmOp<Output<'jvm> = ()>,
{
}
impl<J> VoidMethod for J where for<'jvm> Self: JvmOp<Output<'jvm> = ()> {}
pub trait JavaField<T>
where
T: JavaObject,
for<'jvm> Self: JvmOp<Output<'jvm> = Option<Local<'jvm, T>>>,
{
}
impl<J, T> JavaField<T> for J
where
T: JavaObject,
for<'jvm> Self: JvmOp<Output<'jvm> = Option<Local<'jvm, T>>>,
{
}
pub trait ScalarField<T>
where
T: JavaScalar,
for<'jvm> Self: JvmOp<Output<'jvm> = T>,
{
}
impl<J, T> ScalarField<T> for J
where
T: JavaScalar,
for<'jvm> Self: JvmOp<Output<'jvm> = T>,
{
}