jvm 0.3.0

Core abstractions and runtime services for embeddable JVM implementations
Documentation
use alloc::{
    boxed::Box,
    vec::{self, Vec},
};
use core::{array, iter};

use crate::value::JavaValue;

pub trait InvokeArg: Sync + Send {
    type IntoIter: Iterator<Item = JavaValue>;

    fn into_arg(self) -> Box<[JavaValue]>;
    fn into_iter(self) -> Self::IntoIter;
}

impl InvokeArg for Vec<JavaValue> {
    type IntoIter = vec::IntoIter<JavaValue>;
    fn into_arg(self) -> Box<[JavaValue]> {
        self.into_boxed_slice()
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter(self)
    }
}

impl<const N: usize> InvokeArg for [JavaValue; N] {
    type IntoIter = array::IntoIter<JavaValue, N>;

    fn into_arg(self) -> Box<[JavaValue]> {
        self.into()
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter(self)
    }
}

impl InvokeArg for () {
    type IntoIter = array::IntoIter<JavaValue, 0>;

    fn into_arg(self) -> Box<[JavaValue]> {
        Box::new([])
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter([])
    }
}

impl<T1> InvokeArg for (T1,)
where
    T1: Into<JavaValue> + Sync + Send,
{
    type IntoIter = array::IntoIter<JavaValue, 1>;

    fn into_arg(self) -> Box<[JavaValue]> {
        Box::new([self.0.into()])
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter([self.0.into()])
    }
}

impl<T1, T2> InvokeArg for (T1, T2)
where
    T1: Into<JavaValue> + Sync + Send,
    T2: Into<JavaValue> + Sync + Send,
{
    type IntoIter = array::IntoIter<JavaValue, 2>;

    fn into_arg(self) -> Box<[JavaValue]> {
        Box::new([self.0.into(), self.1.into()])
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter([self.0.into(), self.1.into()])
    }
}

impl<T1, T2, T3> InvokeArg for (T1, T2, T3)
where
    T1: Into<JavaValue> + Sync + Send,
    T2: Into<JavaValue> + Sync + Send,
    T3: Into<JavaValue> + Sync + Send,
{
    type IntoIter = array::IntoIter<JavaValue, 3>;

    fn into_arg(self) -> Box<[JavaValue]> {
        Box::new([self.0.into(), self.1.into(), self.2.into()])
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter([self.0.into(), self.1.into(), self.2.into()])
    }
}

impl<T1, T2, T3, T4> InvokeArg for (T1, T2, T3, T4)
where
    T1: Into<JavaValue> + Sync + Send,
    T2: Into<JavaValue> + Sync + Send,
    T3: Into<JavaValue> + Sync + Send,
    T4: Into<JavaValue> + Sync + Send,
{
    type IntoIter = array::IntoIter<JavaValue, 4>;

    fn into_arg(self) -> Box<[JavaValue]> {
        Box::new([self.0.into(), self.1.into(), self.2.into(), self.3.into()])
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter([self.0.into(), self.1.into(), self.2.into(), self.3.into()])
    }
}

impl<T1, T2, T3, T4, T5> InvokeArg for (T1, T2, T3, T4, T5)
where
    T1: Into<JavaValue> + Sync + Send,
    T2: Into<JavaValue> + Sync + Send,
    T3: Into<JavaValue> + Sync + Send,
    T4: Into<JavaValue> + Sync + Send,
    T5: Into<JavaValue> + Sync + Send,
{
    type IntoIter = array::IntoIter<JavaValue, 5>;

    fn into_arg(self) -> Box<[JavaValue]> {
        Box::new([self.0.into(), self.1.into(), self.2.into(), self.3.into(), self.4.into()])
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter([self.0.into(), self.1.into(), self.2.into(), self.3.into(), self.4.into()])
    }
}

impl<T1, T2, T3, T4, T5, T6> InvokeArg for (T1, T2, T3, T4, T5, T6)
where
    T1: Into<JavaValue> + Sync + Send,
    T2: Into<JavaValue> + Sync + Send,
    T3: Into<JavaValue> + Sync + Send,
    T4: Into<JavaValue> + Sync + Send,
    T5: Into<JavaValue> + Sync + Send,
    T6: Into<JavaValue> + Sync + Send,
{
    type IntoIter = array::IntoIter<JavaValue, 6>;

    fn into_arg(self) -> Box<[JavaValue]> {
        Box::new([self.0.into(), self.1.into(), self.2.into(), self.3.into(), self.4.into(), self.5.into()])
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter([self.0.into(), self.1.into(), self.2.into(), self.3.into(), self.4.into(), self.5.into()])
    }
}

impl<T1, T2, T3, T4, T5, T6, T7> InvokeArg for (T1, T2, T3, T4, T5, T6, T7)
where
    T1: Into<JavaValue> + Sync + Send,
    T2: Into<JavaValue> + Sync + Send,
    T3: Into<JavaValue> + Sync + Send,
    T4: Into<JavaValue> + Sync + Send,
    T5: Into<JavaValue> + Sync + Send,
    T6: Into<JavaValue> + Sync + Send,
    T7: Into<JavaValue> + Sync + Send,
{
    type IntoIter = array::IntoIter<JavaValue, 7>;

    fn into_arg(self) -> Box<[JavaValue]> {
        Box::new([
            self.0.into(),
            self.1.into(),
            self.2.into(),
            self.3.into(),
            self.4.into(),
            self.5.into(),
            self.6.into(),
        ])
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter([
            self.0.into(),
            self.1.into(),
            self.2.into(),
            self.3.into(),
            self.4.into(),
            self.5.into(),
            self.6.into(),
        ])
    }
}

impl<T1, T2, T3, T4, T5, T6, T7, T8> InvokeArg for (T1, T2, T3, T4, T5, T6, T7, T8)
where
    T1: Into<JavaValue> + Sync + Send,
    T2: Into<JavaValue> + Sync + Send,
    T3: Into<JavaValue> + Sync + Send,
    T4: Into<JavaValue> + Sync + Send,
    T5: Into<JavaValue> + Sync + Send,
    T6: Into<JavaValue> + Sync + Send,
    T7: Into<JavaValue> + Sync + Send,
    T8: Into<JavaValue> + Sync + Send,
{
    type IntoIter = array::IntoIter<JavaValue, 8>;

    fn into_arg(self) -> Box<[JavaValue]> {
        Box::new([
            self.0.into(),
            self.1.into(),
            self.2.into(),
            self.3.into(),
            self.4.into(),
            self.5.into(),
            self.6.into(),
            self.7.into(),
        ])
    }

    fn into_iter(self) -> Self::IntoIter {
        iter::IntoIterator::into_iter([
            self.0.into(),
            self.1.into(),
            self.2.into(),
            self.3.into(),
            self.4.into(),
            self.5.into(),
            self.6.into(),
            self.7.into(),
        ])
    }
}