use crate::abstractions::iterator::Iterator;
use crate::class::Class;
use crate::object::Object;
use jni::errors::Result;
use jni::objects::JValue;
use jni::sys::_jobject;
use jni::JNIEnv;
pub struct Set<'a> {
pub inner: Object<'a>,
pub class: Class<'a>,
env: &'a JNIEnv<'a>,
}
#[allow(clippy::from_over_into)]
impl<'a> Into<*mut _jobject> for Set<'a> {
fn into(self) -> *mut _jobject {
self.inner.inner.into_inner()
}
}
impl<'a> Drop for Set<'a> {
fn drop(&mut self) {
let _ = self.env.delete_local_ref(self.inner.inner);
}
}
impl<'a> Set<'a> {
pub fn new(env: &'a JNIEnv<'a>, object: Object<'a>, class: Class<'a>) -> Self {
Self {
inner: object,
class,
env,
}
}
pub fn hashset(env: &'a JNIEnv<'a>, v_class: Class<'a>) -> Result<Self> {
let hashset = env.new_object("java/util/HashSet", "()V", &[])?;
Ok(Self {
inner: Object::new(env, hashset, Class::HashSet(env)?),
class: v_class,
env,
})
}
pub fn hashset_with_capacity(
env: &'a JNIEnv<'a>,
v_class: Class<'a>,
initial_capacity: i32,
) -> Result<Self> {
let hashset = env.new_object(
"java/util/HashSet",
"(I)V",
&[JValue::Int(initial_capacity)],
)?;
Ok(Self {
inner: Object::new(env, hashset, Class::HashSet(env)?),
class: v_class,
env,
})
}
pub fn hashset_with_capacity_and_load_factor(
env: &'a JNIEnv<'a>,
v_class: Class<'a>,
initial_capacity: i32,
load_factor: f32,
) -> Result<Self> {
let hashset = env.new_object(
"java/util/HashSet",
"(IF)V",
&[JValue::Int(initial_capacity), JValue::Float(load_factor)],
)?;
Ok(Self {
inner: Object::new(env, hashset, Class::HashSet(env)?),
class: v_class,
env,
})
}
pub fn size(&self) -> Result<i32> {
let size = self.env.call_method(self.inner.inner, "size", "()I", &[])?;
size.i()
}
pub fn iterator(&self) -> Result<Iterator<'a>> {
let iterator =
self.env
.call_method(self.inner.inner, "iterator", "()Ljava/util/Iterator;", &[])?;
let object = Object::new(self.env, iterator.l()?, Class::Iterator(self.env)?);
let iterator = Iterator::new(self.env, object, self.class.clone());
Ok(iterator)
}
pub fn to_vec(&self) -> Result<Vec<Object<'a>>> {
let mut vec = Vec::new();
let iter = self.iterator()?;
while let Some(i) = iter.next()? {
vec.push(i);
}
Ok(vec)
}
}