cs431_homework/test/adt/
set.rs1use core::fmt::Debug;
4use core::hash::Hash;
5
6use crossbeam_epoch::Guard;
7
8use super::map;
9use crate::test::RandGen;
10use crate::{ConcurrentMap, ConcurrentSet};
11
12impl<T, S: ConcurrentSet<T>> ConcurrentMap<T, ()> for S {
14 fn lookup<'a>(&'a self, key: &T, _guard: &'a Guard) -> Option<&'a ()> {
15 if self.contains(key) { Some(&()) } else { None }
16 }
17
18 fn insert(&self, key: T, _value: (), _guard: &Guard) -> Result<(), ()> {
19 if self.insert(key) { Ok(()) } else { Err(()) }
20 }
21
22 fn delete<'a>(&'a self, key: &T, _guard: &'a Guard) -> Result<&'a (), ()> {
23 if self.remove(key) { Ok(&()) } else { Err(()) }
24 }
25}
26
27pub fn stress_sequential<T: Debug + Clone + Eq + Hash + RandGen, S: Default + ConcurrentSet<T>>(
29 steps: usize,
30) {
31 map::stress_sequential::<T, (), S>(steps);
32}
33
34pub fn stress_concurrent<T: Debug + Eq + RandGen, S: Default + Sync + ConcurrentSet<T>>(
36 threads: usize,
37 steps: usize,
38) {
39 map::stress_concurrent::<T, (), S>(threads, steps);
40}
41
42pub fn log_concurrent<
44 T: Clone + Debug + Eq + Hash + RandGen + Send,
45 S: Default + Sync + ConcurrentSet<T>,
46>(
47 threads: usize,
48 steps: usize,
49) {
50 map::log_concurrent::<T, (), S>(threads, steps);
51}