use lockfree_cuckoohash::{pin, LockFreeCuckooHash};
use std::ops::Not;
use std::sync::Arc;
fn simple_read_write_example() {
let map = LockFreeCuckooHash::new();
let guard = pin();
let key = 1;
let value = "value";
assert!(map.insert(key, value).not());
assert!(map.insert(key, "value2"));
assert_eq!(map.insert_with_guard(key, value, &guard), Some(&"value2"));
assert_eq!(map.get(&key, &guard), Some(&value));
assert_eq!(map.get(&2, &guard), None);
assert!(map.remove(&2).not());
assert!(map.remove(&key));
assert!(map.remove(&key).not());
map.insert(key, value);
assert_eq!(map.remove_with_guard(&key, &guard), Some(&value));
assert_eq!(map.remove_with_guard(&key, &guard), None);
}
fn multi_threads_read_write() {
let map = Arc::new(LockFreeCuckooHash::new());
let mut handles = Vec::with_capacity(4);
for i in 0..4 {
let map = map.clone();
let handle = std::thread::spawn(move || {
for j in 0..100 {
let key = i * 100 + j;
let value = i;
map.insert(key, value);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let guard = pin();
assert_eq!(map.size(), 4 * 100);
for i in 0..4 {
for j in 0..100 {
let key = i * 100 + j;
let value = i;
let ret = map.get(&key, &guard);
assert_eq!(ret, Some(&value));
}
}
}
fn main() {
simple_read_write_example();
multi_threads_read_write();
}