-
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathhash_map_key_set.rs
More file actions
97 lines (70 loc) · 4.25 KB
/
Copy pathhash_map_key_set.rs
File metadata and controls
97 lines (70 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use alloc::vec;
use java_class_proto::{JavaFieldProto, JavaMethodProto};
use jvm::{ClassInstanceRef, Jvm, Result};
use crate::{RuntimeClassProto, RuntimeContext, classes::java::lang::Object};
use super::HashMap;
// class java.util.HashMap$KeySet
pub struct HashMapKeySet;
impl HashMapKeySet {
pub fn as_proto() -> RuntimeClassProto {
RuntimeClassProto {
name: "java/util/HashMap$KeySet",
parent_class: Some("java/util/AbstractSet"),
interfaces: vec![],
methods: vec![
JavaMethodProto::new("<init>", "(Ljava/util/HashMap;)V", Self::init, Default::default()),
JavaMethodProto::new("size", "()I", Self::size, Default::default()),
JavaMethodProto::new("isEmpty", "()Z", Self::is_empty, Default::default()),
JavaMethodProto::new("contains", "(Ljava/lang/Object;)Z", Self::contains, Default::default()),
JavaMethodProto::new("remove", "(Ljava/lang/Object;)Z", Self::remove, Default::default()),
JavaMethodProto::new("clear", "()V", Self::clear, Default::default()),
JavaMethodProto::new("iterator", "()Ljava/util/Iterator;", Self::iterator, Default::default()),
],
fields: vec![JavaFieldProto::new("map", "Ljava/util/HashMap;", Default::default())],
access_flags: Default::default(),
}
}
async fn init(jvm: &Jvm, _: &mut RuntimeContext, mut this: ClassInstanceRef<Self>, map: ClassInstanceRef<HashMap>) -> Result<()> {
tracing::debug!("java.util.HashMap$KeySet::<init>({this:?}, {map:?})");
let _: () = jvm.invoke_special(&this, "java/util/AbstractSet", "<init>", "()V", ()).await?;
jvm.put_field(&mut this, "map", "Ljava/util/HashMap;", map).await?;
Ok(())
}
async fn size(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<i32> {
tracing::debug!("java.util.HashMap$KeySet::size({this:?})");
let map: ClassInstanceRef<HashMap> = jvm.get_field(&this, "map", "Ljava/util/HashMap;").await?;
jvm.invoke_virtual(&map, "size", "()I", ()).await
}
async fn is_empty(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<bool> {
tracing::debug!("java.util.HashMap$KeySet::isEmpty({this:?})");
let map: ClassInstanceRef<HashMap> = jvm.get_field(&this, "map", "Ljava/util/HashMap;").await?;
jvm.invoke_virtual(&map, "isEmpty", "()Z", ()).await
}
async fn contains(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>, key: ClassInstanceRef<Object>) -> Result<bool> {
tracing::debug!("java.util.HashMap$KeySet::contains({this:?}, {key:?})");
let map: ClassInstanceRef<HashMap> = jvm.get_field(&this, "map", "Ljava/util/HashMap;").await?;
jvm.invoke_virtual(&map, "containsKey", "(Ljava/lang/Object;)Z", (key,)).await
}
async fn remove(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>, key: ClassInstanceRef<Object>) -> Result<bool> {
tracing::debug!("java.util.HashMap$KeySet::remove({this:?}, {key:?})");
let map: ClassInstanceRef<HashMap> = jvm.get_field(&this, "map", "Ljava/util/HashMap;").await?;
let contains: bool = jvm.invoke_virtual(&map, "containsKey", "(Ljava/lang/Object;)Z", (key.clone(),)).await?;
if !contains {
return Ok(false);
}
let _: ClassInstanceRef<Object> = jvm
.invoke_virtual(&map, "remove", "(Ljava/lang/Object;)Ljava/lang/Object;", (key,))
.await?;
Ok(true)
}
async fn clear(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<()> {
tracing::debug!("java.util.HashMap$KeySet::clear({this:?})");
let map: ClassInstanceRef<HashMap> = jvm.get_field(&this, "map", "Ljava/util/HashMap;").await?;
jvm.invoke_virtual(&map, "clear", "()V", ()).await
}
async fn iterator(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<ClassInstanceRef<Object>> {
tracing::debug!("java.util.HashMap$KeySet::iterator({this:?})");
let map: ClassInstanceRef<HashMap> = jvm.get_field(&this, "map", "Ljava/util/HashMap;").await?;
jvm.invoke_virtual(&map, "keyIterator", "()Ljava/util/Iterator;", ()).await
}
}