cs431_homework/test/adt/
set.rs

1//! Testing utilities for set types.
2
3use 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
12// A set can be seen as a map with value `()`. Thus, we can reuse the tests for maps.
13impl<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
27/// See `map::stress_sequential`.
28pub 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
34/// See `map::stress_concurrent`.
35pub 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
42/// See `map::log_concurrent`.
43pub 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}