Skip to main content

behavior_actors/atomic/
capacity.rs

1//! Positive capacities shared by distinct atomic policies.
2
3use core::num::NonZeroUsize;
4
5use thiserror::Error;
6
7/// Zero cannot bound work that an atomic actor may accept.
8#[derive(Clone, Copy, Debug, Eq, Error, PartialEq)]
9#[error("capacity must be positive")]
10pub struct ZeroCapacity;
11
12#[derive(Clone, Copy, Debug, Eq, PartialEq)]
13pub(in crate::atomic) struct PositiveCapacity(NonZeroUsize);
14
15impl PositiveCapacity {
16    pub(in crate::atomic) fn new(maximum: usize) -> Result<Self, ZeroCapacity> {
17        NonZeroUsize::new(maximum).map(Self).ok_or(ZeroCapacity)
18    }
19
20    pub(in crate::atomic) const fn get(self) -> usize {
21        self.0.get()
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use super::{PositiveCapacity, ZeroCapacity};
28    use crate::atomic::{ActivationPolicy, BindingCapacity, EntryCapacity};
29
30    #[test]
31    fn every_atomic_capacity_rejects_zero() {
32        assert_eq!(ActivationPolicy::new(0), Err(ZeroCapacity));
33        assert_eq!(EntryCapacity::new(0), Err(ZeroCapacity));
34        assert_eq!(BindingCapacity::new(0), Err(ZeroCapacity));
35    }
36
37    #[test]
38    fn positive_capacity_preserves_the_validated_maximum() {
39        let capacity =
40            PositiveCapacity::new(7).unwrap_or_else(|_| panic!("seven is a positive capacity"));
41        assert_eq!(capacity.get(), 7);
42    }
43}