numera/number/
no.rs

1//
2//! Not a number.
3//
4// TOC
5//
6// - Number
7// - Bound
8// - Count
9// - Ident
10// - Sign
11
12use crate::{error::NumeraResult, number::traits::*};
13
14/// The absence of a number.
15///
16/// This unit type alias implements every number trait, in order to be able to
17/// be used wherever a generic number is expected.
18pub type NoNumber = ();
19
20/* Number */
21
22#[rustfmt::skip]
23impl Number for NoNumber {
24    /// Itself.
25    type InnerRepr = NoNumber;
26    /// Itself.
27    type InnermostRepr = NoNumber;
28    /// Returns itself.
29    #[inline]
30    fn from_inner_repr(value: NoNumber) -> NumeraResult<Self> { Ok(value) }
31    /// Returns itself.
32    #[inline]
33    #[cfg(not(feature = "safe"))]
34    #[cfg_attr(feature = "nightly", doc(cfg(feature = "not(safe)")))]
35    unsafe fn from_inner_repr_unchecked(value: NoNumber) -> Self { value }
36    /// Returns itself.
37    #[inline]
38    fn try_from_inner_repr(_value: impl Into<Self::InnerRepr>) -> NumeraResult<Self> { Ok(()) }
39    /// Returns itself.
40    #[inline]
41    fn from_innermost_repr(value: NoNumber) -> NumeraResult<Self> { Ok(value) }
42    /// Returns itself.
43    #[inline]
44    #[cfg(not(feature = "safe"))]
45    #[cfg_attr(feature = "nightly", doc(cfg(feature = "not(safe)")))]
46    unsafe fn from_innermost_repr_unchecked(value: NoNumber) -> Self { value }
47    /// Returns itself.
48    #[inline]
49    fn into_inner_repr(self) -> Self::InnerRepr { self }
50    /// Returns itself.
51    #[inline]
52    fn into_innermost_repr(self) -> Self::InnermostRepr { self }
53}
54
55/* Bound */
56
57#[rustfmt::skip]
58impl Bound for NoNumber {
59    /// Lowerbounded by itself.
60    #[inline]
61    fn is_lower_bounded(&self) -> bool { true }
62    #[inline]
63    /// Upperbounded by itself.
64    fn is_upper_bounded(&self) -> bool { true }
65    /// Returns itself.
66    #[inline]
67    fn lower_bound(&self) -> Option<Self> { Some(()) }
68    /// Returns itself.
69    #[inline]
70    fn upper_bound(&self) -> Option<Self> { Some(()) }
71}
72// these imply Bounded:
73impl LowerBounded for NoNumber {
74    /// Returns itself.
75    #[inline]
76    fn new_min() -> Self {}
77}
78impl UpperBounded for NoNumber {
79    /// Returns itself.
80    #[inline]
81    fn new_max() -> Self {}
82}
83// these imply ConstBounded:
84/// Returns itself.
85impl ConstLowerBounded for NoNumber {
86    /// Itself.
87    const MIN: NoNumber = ();
88}
89/// Returns itself.
90impl ConstUpperBounded for NoNumber {
91    /// Itself.
92    const MAX: NoNumber = ();
93}
94// these imply NonBounded:
95impl NonLowerBounded for NoNumber {}
96impl NonUpperBounded for NoNumber {}
97
98/* Count */
99
100#[rustfmt::skip]
101impl Count for NoNumber {
102    #[inline]
103    fn is_countable(&self) -> bool { false }
104}
105#[rustfmt::skip]
106impl Countable for NoNumber {
107    /// Returns itself.
108    #[inline]
109    fn next(&self) -> NumeraResult<Self> { Ok(()) }
110    /// Returns itself.
111    #[inline]
112    fn previous(&self) -> NumeraResult<Self> { Ok(()) }
113}
114impl Uncountable for NoNumber {}
115
116/* Ident */
117
118#[rustfmt::skip]
119impl Ident for NoNumber {
120    /// Returns `false`.
121    #[inline]
122    fn can_zero(&self) -> bool { false }
123    /// Returns `false`.
124    #[inline]
125    fn can_one(&self) -> bool { false }
126    /// Returns `false`.
127    #[inline]
128    fn can_neg_one(&self) -> bool { false }
129    /// Returns `false`.
130    #[inline]
131    fn is_zero(&self) -> bool { false }
132    /// Returns `false`.
133    #[inline]
134    fn is_one(&self) -> bool { false }
135    /// Returns `false`.
136    #[inline]
137    fn is_neg_one(&self) -> bool { false }
138}
139impl NonZero for NoNumber {}
140/// Returns itself.
141impl ConstOne for NoNumber {
142    /// Itself.
143    const ONE: NoNumber = ();
144}
145/// Returns itself.
146impl ConstZero for NoNumber {
147    /// Itself.
148    const ZERO: NoNumber = ();
149}
150/// Returns itself.
151impl ConstNegOne for NoNumber {
152    /// Itself.
153    const NEG_ONE: NoNumber = ();
154}
155impl One for NoNumber {
156    /// Returns itself.
157    #[inline]
158    fn new_one() -> Self {}
159
160    /// No op.
161    #[inline]
162    fn set_one(&mut self) {}
163}
164impl Zero for NoNumber {
165    /// Returns itself.
166    #[inline]
167    fn new_zero() -> Self {}
168
169    /// No op.
170    #[inline]
171    fn set_zero(&mut self) {}
172}
173impl NegOne for NoNumber {
174    /// Returns itself.
175    #[inline]
176    fn new_neg_one() -> Self {}
177
178    /// No op.
179    #[inline]
180    fn set_neg_one(&mut self) {}
181}
182
183/* Sign */
184
185#[rustfmt::skip]
186impl Sign for NoNumber {
187    /// Returns `false`.
188    #[inline]
189    fn can_positive(&self) -> bool { false }
190    /// Returns `false`.
191    #[inline]
192    fn can_negative(&self) -> bool { false }
193    /// Returns `false`.
194    #[inline]
195    fn is_positive(&self) -> bool { false }
196    /// Returns `false`.
197    #[inline]
198    fn is_negative(&self) -> bool { false }
199}
200// these imply Signed:
201impl Positive for NoNumber {}
202impl Negative for NoNumber {}
203// these imply Unsigned, NonOne, NonNegOne:
204impl NonNegative for NoNumber {}
205#[rustfmt::skip]
206impl NonPositive for NoNumber {
207    /// Itself.
208    type InnerRepr = NoNumber;
209    /// Returns itself.
210    #[inline]
211    fn new_neg(value: Self::InnerRepr) -> NumeraResult<Self::InnerRepr> { Ok(value) }
212}