behavior_actors/atomic/
capacity.rs1use core::num::NonZeroUsize;
4
5use thiserror::Error;
6
7#[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}