-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: pushkarm029 <pushkarmishra029@gmail.com>
- Loading branch information
1 parent
5872949
commit d98b080
Showing
9 changed files
with
338 additions
and
138 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
pub mod btree_wrapper; | ||
pub mod wrapper_btreemap; | ||
pub mod file_storage; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
use crate::wrapper_btreemap::WrapperBTreeMap; | ||
use crate::file_storage::FileStorage; | ||
// This is the interface to the JVM that we'll call the majority of our | ||
// methods on. | ||
use jni::JNIEnv; | ||
|
||
// These objects are what you should use as arguments to your native | ||
// function. They carry extra lifetime information to prevent them escaping | ||
// this context and getting used after being GC'd. | ||
use jni::objects::{JClass, JObject, JString, JValue}; | ||
|
||
// This is just a pointer. We'll be returning it from our function. We | ||
// can't return one of the objects with lifetime information because the | ||
// lifetime checker won't let us. | ||
use jni::sys::{jboolean, jlong, jobject, jstring}; | ||
use jnix::{IntoJava, JnixEnv}; | ||
|
||
impl WrapperBTreeMap<String, String> { | ||
pub fn from_jlong(value: jlong) -> &'static mut Self { | ||
unsafe { &mut *(value as *mut WrapperBTreeMap<String, String>) } | ||
} | ||
} | ||
|
||
// JNI bindings | ||
|
||
// #[no_mangle] | ||
// pub extern "system" fn Java_FileStorage_create<'local>( | ||
// mut env: JNIEnv<'local>, | ||
// _class: JClass, | ||
// label: JString<'local>, | ||
// path: JString<'local>, | ||
// ) -> jlong { | ||
// let label: String = env | ||
// .get_string(&label) | ||
// .expect("Couldn't get label!") | ||
// .into(); | ||
// let path: String = env | ||
// .get_string(&path) | ||
// .expect("Couldn't get path!") | ||
// .into(); | ||
|
||
// let file_storage: FileStorage<String, String> = | ||
// FileStorage::new(label, Path::new(&path)).unwrap_or_else(|err| { | ||
// env.throw_new("java/lang/RuntimeException", &err.to_string()) | ||
// .expect("Failed to throw RuntimeException"); | ||
// FileStorage::new("".to_string(), Path::new("")).unwrap() | ||
// }); | ||
// Box::into_raw(Box::new(file_storage)) as jlong | ||
// } | ||
|
||
#[no_mangle] | ||
pub extern "system" fn Java_WrapperBTreeMap_create<'local>( | ||
mut env: JNIEnv<'local>, | ||
_class: JClass, | ||
storage_ptr: jlong, | ||
) -> jlong { | ||
// currently, only for file_storage | ||
let filestorage = FileStorage::from_jlong(storage_ptr); | ||
let wrapper = WrapperBTreeMap::new(filestorage); | ||
Box::into_raw(Box::new(wrapper)) as jlong | ||
} | ||
|
||
#[no_mangle] | ||
pub extern "system" fn Java_WrapperBTreeMap_get<'local>( | ||
mut env: JNIEnv<'local>, | ||
_class: JClass, | ||
id: JString<'local>, | ||
wrapper_ptr: jlong, | ||
) -> jstring { | ||
let id: String = env.get_string(&id).expect("msg").into(); | ||
let wrapper = WrapperBTreeMap::from_jlong(wrapper_ptr); | ||
let data: String = wrapper.get_data(id); | ||
env.new_string(data).unwrap().into_raw() | ||
} | ||
|
||
// match value { | ||
// Some(value) => env.new_string(value).unwrap().into_raw(), | ||
// None => { | ||
// env.throw_new( | ||
// "java/lang/RuntimeException", | ||
// &"no value present for this key".to_string(), | ||
// ) | ||
// .unwrap(); | ||
// env.new_string("").unwrap().into_raw() | ||
// } | ||
// } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
use crate::base_storage::BaseStorage; | ||
use std::cell::RefCell; | ||
use std::collections::btree_map::{IntoIter, Iter}; | ||
use std::collections::BTreeMap; | ||
use std::rc::Rc; | ||
|
||
pub struct WrapperBTreeMap<K, V> { | ||
data: Rc<RefCell<BTreeMap<K, V>>>, | ||
index: usize, | ||
} | ||
|
||
impl<K, V> WrapperBTreeMap<K, V> | ||
where | ||
K: Ord + Clone, | ||
V: Clone, | ||
{ | ||
pub fn new<S: BaseStorage<K, V>>(storage: &S) -> Self { | ||
WrapperBTreeMap { | ||
data: Rc::new(RefCell::new(storage.as_ref().clone())), | ||
index: 0, | ||
} | ||
} | ||
|
||
pub fn get_data(&self, id: K) -> V { | ||
let borrow = self.data.borrow(); | ||
borrow.get(&id).unwrap().clone() | ||
} | ||
|
||
// pub fn has_next(&self) -> bool { | ||
// let borrow = self.data.borrow_mut(); | ||
// let iter = borrow.iter(); | ||
// iter.clone().nth(self.index).is_some() | ||
// } | ||
|
||
// pub fn native_next(&mut self) -> Option<(K, V)> { | ||
// let borrow = self.data.borrow_mut(); | ||
// let mut iter = borrow.iter(); | ||
// iter.nth(self.index).map(|(k, v)| { | ||
// self.index += 1; | ||
// (k.clone(), v.clone()) | ||
// }) | ||
// } | ||
} | ||
|
||
pub struct WrapperBTreeMapIterator<'a, K, V> { | ||
iter: Iter<'a, K, V>, | ||
} | ||
|
||
impl<'a, K, V> WrapperBTreeMapIterator<'a, K, V> | ||
where | ||
K: Ord + Clone, | ||
V: Clone, | ||
{ | ||
pub fn new(storage: WrapperBTreeMap<K, V>) -> Self { | ||
let binding = storage.data.clone(); | ||
let borrow = binding.borrow(); | ||
// let iter = <std::collections::BTreeMap<K, V> as Clone>::clone(&borrow) | ||
// .iter(); | ||
WrapperBTreeMapIterator { | ||
iter: borrow.iter(), | ||
} | ||
} | ||
|
||
pub fn has_next(&mut self) -> bool { | ||
// let borrow = self.iter.clone(); | ||
// self.iter.peekable().peek().is_some() | ||
} | ||
|
||
pub fn native_next(&mut self) -> Option<(K, V)> { | ||
self.iter | ||
.next() | ||
.map(|(k, v)| (k.clone(), v.clone())) | ||
} | ||
|
||
// pub fn native_next(&self) -> Option<(K, V)> { | ||
// let borrow = self.iter.borrow_mut(); | ||
// borrow.clone().next().map(|(k, v)| (k.clone(), v.clone())) | ||
// } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.