1use num_traits::ops::wrapping::WrappingAdd;
2use num_traits::{bounds::UpperBounded, One};
3use std::ops::{AddAssign, RemAssign};
4
5#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
9#[cfg_attr(feature = "constructor", derive(derive_more::Constructor))]
10#[cfg_attr(feature = "deref_mut", derive(derive_more::DerefMut))]
11#[cfg_attr(feature = "deref", derive(derive_more::Deref))]
12pub struct BoundedCounter<I>(pub I);
13
14impl<I> Iterator for BoundedCounter<I>
15where
16 I: Copy + RemAssign<I> + UpperBounded + AddAssign<I> + One,
17{
18 type Item = I;
19
20 fn next(&mut self) -> Option<Self::Item> {
21 let i = self.0;
22 self.0 %= I::max_value();
23 self.0 += I::one();
24 Some(i)
25 }
26}
27
28#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
32#[cfg_attr(feature = "constructor", derive(derive_more::Constructor))]
33#[cfg_attr(feature = "deref_mut", derive(derive_more::DerefMut))]
34#[cfg_attr(feature = "deref", derive(derive_more::Deref))]
35pub struct WrappedCounter<I>(pub I);
36
37impl<I> Iterator for WrappedCounter<I>
38where
39 I: Copy + One + WrappingAdd,
40{
41 type Item = I;
42
43 fn next(&mut self) -> Option<Self::Item> {
44 let i = self.0;
45 self.0 = self.0.wrapping_add(&I::one());
46 Some(i)
47 }
48}