hexga_number/arithmetic/
increment.rs1use super::*;
2
3pub trait Increment: One + Add<Self, Output = Self> + AddAssign<Self> + Copy + Sized
5{
6 #[inline(always)]
8 fn increment(&mut self) { *self += Self::ONE; }
9 #[inline(always)]
11 fn increment_checked(&mut self) -> Result<(), ()>
12 where
13 Self: OverflowBehavior + MaxValue + PartialEq,
14 {
15 if self.can_increment()
16 {
17 self.increment();
18 Ok(())
19 }
20 else
21 {
22 Err(())
23 }
24 }
25
26 #[inline(always)]
30 fn can_increment(&self) -> bool
31 where
32 Self: OverflowBehavior + MaxValue + PartialEq,
33 {
34 Self::OVERFLOW_BEHAVIOR.is_wrapping() || self.is_not_max()
35 }
36
37 #[inline(always)]
39 fn successor(self) -> Self { self + Self::ONE }
40 #[inline(always)]
42 fn successor_checked(&mut self) -> Result<Self, ()>
43 where
44 Self: OverflowBehavior + MaxValue + PartialEq,
45 {
46 if self.have_successor() { Ok(self.successor()) } else { Err(()) }
47 }
48
49 #[inline(always)]
53 fn have_successor(self) -> bool
54 where
55 Self: OverflowBehavior + MaxValue + PartialEq,
56 {
57 self.can_increment()
58 }
59}
60impl<T> Increment for T where T: One + Add<T, Output = T> + AddAssign<Self> + Copy {}
61
62pub trait Decrement: One + Sub<Self, Output = Self> + SubAssign<Self> + Copy + Sized
64{
65 #[inline(always)]
67 fn decrement(&mut self) { *self -= Self::ONE; }
68 #[inline(always)]
70 fn decrement_checked(&mut self) -> Result<(), ()>
71 where
72 Self: OverflowBehavior + MinValue + PartialEq,
73 {
74 if self.can_decrement()
75 {
76 self.decrement();
77 Ok(())
78 }
79 else
80 {
81 Err(())
82 }
83 }
84
85 #[inline(always)]
89 fn can_decrement(&self) -> bool
90 where
91 Self: OverflowBehavior + MinValue + PartialEq,
92 {
93 Self::OVERFLOW_BEHAVIOR.is_wrapping() || self.is_not_min()
94 }
95
96 #[inline(always)]
98 fn predecessor(self) -> Self { self - Self::ONE }
99 #[inline(always)]
101 fn predecessor_checked(&mut self) -> Result<Self, ()>
102 where
103 Self: OverflowBehavior + MinValue + PartialEq,
104 {
105 if self.have_predecessor() { Ok(self.predecessor()) } else { Err(()) }
106 }
107
108 #[inline(always)]
112 fn have_predecessor(self) -> bool
113 where
114 Self: OverflowBehavior + MinValue + PartialEq,
115 {
116 self.can_decrement()
117 }
118}
119impl<T> Decrement for T where T: One + Sub<Self, Output = Self> + SubAssign<Self> + Copy + Sized {}