Skip to content

Commit 2d9d4a8

Browse files
committed
Add java/util/Vector::indexOf
1 parent b5809a2 commit 2d9d4a8

File tree

2 files changed

+48
-5
lines changed

2 files changed

+48
-5
lines changed

java_runtime/src/classes/java/util/vector.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ impl Vector {
3636
JavaMethodProto::new("remove", "(I)Ljava/lang/Object;", Self::remove, Default::default()),
3737
JavaMethodProto::new("removeAllElements", "()V", Self::remove_all_elements, Default::default()),
3838
JavaMethodProto::new("removeElementAt", "(I)V", Self::remove_element_at, Default::default()),
39+
JavaMethodProto::new("indexOf", "(Ljava/lang/Object;)I", Self::index_of, Default::default()),
3940
JavaMethodProto::new("lastIndexOf", "(Ljava/lang/Object;)I", Self::last_index_of, Default::default()),
4041
JavaMethodProto::new("lastIndexOf", "(Ljava/lang/Object;I)I", Self::last_index_of_index, Default::default()),
4142
JavaMethodProto::new("firstElement", "()Ljava/lang/Object;", Self::first_element, Default::default()),
@@ -181,6 +182,30 @@ impl Vector {
181182
Ok(())
182183
}
183184

185+
async fn index_of(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>, element: ClassInstanceRef<Object>) -> Result<i32> {
186+
tracing::debug!("java.util.Vector::indexOf({:?}, {:?})", &this, &element);
187+
188+
let rust_vector = Self::get_rust_vector(jvm, &this).await?;
189+
let vector = rust_vector.lock();
190+
191+
for (i, item) in vector.iter().enumerate() {
192+
if item.is_none() && element.is_null() {
193+
return Ok(i as i32);
194+
}
195+
196+
if item.is_none() || element.is_null() {
197+
continue;
198+
}
199+
200+
let value: Box<dyn ClassInstance> = element.clone().into();
201+
if item.as_ref().unwrap().equals(&*value)? {
202+
return Ok(i as i32);
203+
}
204+
}
205+
206+
Ok(-1)
207+
}
208+
184209
async fn last_index_of(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>, element: ClassInstanceRef<Object>) -> Result<i32> {
185210
tracing::debug!("java.util.Vector::lastIndexOf({:?}, {:?})", &this, &element);
186211

@@ -213,10 +238,11 @@ impl Vector {
213238
let vector = rust_vector.lock();
214239

215240
for (i, item) in vector[..=index as usize].iter().enumerate().rev() {
216-
if item.is_none() {
217-
if element.is_null() {
218-
return Ok(i as i32);
219-
}
241+
if item.is_none() && element.is_null() {
242+
return Ok(i as i32);
243+
}
244+
245+
if item.is_none() || element.is_null() {
220246
continue;
221247
}
222248

java_runtime/tests/classes/java/util/test_vector.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ async fn test_vector_null() -> Result<()> {
5959
}
6060

6161
#[tokio::test]
62-
async fn test_vector_last_index_of() -> Result<()> {
62+
async fn test_vector_index_of() -> Result<()> {
6363
let jvm = test_jvm().await?;
6464

6565
let vector = jvm.new_class("java/util/Vector", "()V", ()).await?;
@@ -98,5 +98,22 @@ async fn test_vector_last_index_of() -> Result<()> {
9898
let index: i32 = jvm.invoke_virtual(&vector, "lastIndexOf", "(Ljava/lang/Object;)I", (None,)).await?;
9999
assert_eq!(index, 4);
100100

101+
let index: i32 = jvm.invoke_virtual(&vector, "indexOf", "(Ljava/lang/Object;)I", (element2,)).await?;
102+
assert_eq!(index, 1);
103+
104+
let index: i32 = jvm.invoke_virtual(&vector, "indexOf", "(Ljava/lang/Object;)I", (None,)).await?;
105+
assert_eq!(index, 4);
106+
107+
let non_existing_element = JavaLangString::from_rust_string(&jvm, "nonExisting").await?;
108+
let index: i32 = jvm
109+
.invoke_virtual(&vector, "indexOf", "(Ljava/lang/Object;)I", (non_existing_element.clone(),))
110+
.await?;
111+
assert_eq!(index, -1);
112+
113+
let index: i32 = jvm
114+
.invoke_virtual(&vector, "lastIndexOf", "(Ljava/lang/Object;)I", (non_existing_element,))
115+
.await?;
116+
assert_eq!(index, -1);
117+
101118
Ok(())
102119
}

0 commit comments

Comments
 (0)