mod atomic_value;
mod concurrent_map;
mod concurrent_vec;
mod versioned_map;
pub use atomic_value::AtomicValue;
pub use concurrent_map::ConcurrentMap;
pub use concurrent_vec::ConcurrentVec;
pub use versioned_map::{VersionError, VersionedEntry, VersionedMap};
#[cfg(test)]
mod integration_tests {
use super::*;
use std::sync::Arc;
use std::thread;
#[test]
fn test_all_containers_concurrent() {
let map: Arc<ConcurrentMap<String, i32>> = Arc::new(ConcurrentMap::new());
let vec: Arc<ConcurrentVec<i32>> = Arc::new(ConcurrentVec::new());
let value: Arc<AtomicValue<i32>> = Arc::new(AtomicValue::new(0));
let vmap: Arc<VersionedMap<String, i32>> = Arc::new(VersionedMap::new());
let handles: Vec<_> = (0..4)
.map(|i| {
let map = Arc::clone(&map);
let vec = Arc::clone(&vec);
let value = Arc::clone(&value);
let vmap = Arc::clone(&vmap);
thread::spawn(move || {
map.insert(format!("key_{}", i), i);
vec.push(i);
value.store(i);
vmap.insert(format!("vkey_{}", i), i * 10);
})
})
.collect();
for handle in handles {
handle.join().unwrap();
}
assert_eq!(map.len(), 4);
assert_eq!(vec.len(), 4);
let final_value = *value.load();
assert!((0..4).contains(&final_value));
assert_eq!(vmap.len(), 4);
}
}