malachite_base/num/basic/
traits.rs

1// Copyright © 2025 Mikhail Hogrefe
2//
3// Implementations of traits for NonZero* types by b4D8.
4//
5// This file is part of Malachite.
6//
7// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
8// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
9// 3 of the License, or (at your option) any later version. See <https://www.gnu.org/licenses/>.
10
11use core::num::*;
12
13/// Provides the constant 0.
14#[allow(clippy::declare_interior_mutable_const)]
15pub trait Zero {
16    const ZERO: Self;
17}
18
19/// Provides the constant 1.
20#[allow(clippy::declare_interior_mutable_const)]
21pub trait One {
22    const ONE: Self;
23}
24
25/// Provides the constant 2.
26#[allow(clippy::declare_interior_mutable_const)]
27pub trait Two {
28    const TWO: Self;
29}
30
31/// Provides the constant -1.
32#[allow(clippy::declare_interior_mutable_const)]
33pub trait NegativeOne {
34    const NEGATIVE_ONE: Self;
35}
36
37/// Provides the constant 1/2.
38#[allow(clippy::declare_interior_mutable_const)]
39pub trait OneHalf {
40    const ONE_HALF: Self;
41}
42
43/// Provides the constant -0.
44#[allow(clippy::declare_interior_mutable_const)]
45pub trait NegativeZero {
46    const NEGATIVE_ZERO: Self;
47}
48
49/// Provides the constant (positive) Infinity.
50#[allow(clippy::declare_interior_mutable_const)]
51pub trait Infinity {
52    const INFINITY: Self;
53}
54
55/// Provides the constant -Infinity.
56#[allow(clippy::declare_interior_mutable_const)]
57pub trait NegativeInfinity {
58    const NEGATIVE_INFINITY: Self;
59}
60
61/// Provides the constant NaN.
62#[allow(clippy::declare_interior_mutable_const)]
63pub trait NaN {
64    const NAN: Self;
65}
66
67/// Provides the Prouhet-Thue-Morse constant, whose bits are the Thue-Morse sequence.
68pub trait ProuhetThueMorseConstant {
69    const PROUHET_THUE_MORSE_CONSTANT: Self;
70}
71
72/// Provides the prime constant, whose $n$th bit (starting from $n=1$) is true if and only if $n$ is
73/// prime.
74pub trait PrimeConstant {
75    const PRIME_CONSTANT: Self;
76}
77
78/// Provides $\ln 2$.
79pub trait Ln2 {
80    const LN_2: Self;
81}
82
83/// Provides $\log_2 e$.
84pub trait Log2E {
85    const LOG_2_E: Self;
86}
87
88/// Provides $\sqrt{2}$.
89pub trait Sqrt2 {
90    const SQRT_2: Self;
91}
92
93/// Provides $\sqrt{3}$.
94pub trait Sqrt3 {
95    const SQRT_3: Self;
96}
97
98/// Provides $\sqrt{2}/2=\sqrt{1/2}=1/\sqrt{2}$.
99pub trait Sqrt2Over2 {
100    const SQRT_2_OVER_2: Self;
101}
102
103/// Provides $\sqrt{3}/3=\sqrt{1/3}=1/\sqrt{3}$.
104pub trait Sqrt3Over3 {
105    const SQRT_3_OVER_3: Self;
106}
107
108/// Provides $\varphi$, the golden ratio.
109pub trait Phi {
110    const PHI: Self;
111}
112
113// Implementation for `NonZero*` types:
114// - `One` and `Two` for both signed and unsigned variants
115// - `NegativeOne` for the signed variant
116macro_rules! impl_non_zero {
117    ($($t:ident),+) => {
118        $(
119            impl One for $t {
120                const ONE: Self = match Self::new(1) {
121                    Some(v) => v,
122                    None => unreachable!() // 1 is a valid nonzero value
123                };
124            }
125
126            impl Two for $t {
127                const TWO: Self = match Self::new(2) {
128                    Some(v) => v,
129                    None => unreachable!() // 2 is a valid nonzero value
130                };
131            }
132        )+
133    };
134    ($($u:ident && $i:ident),+) => {
135        $(
136            impl_non_zero!($u, $i);
137
138            impl NegativeOne for $i {
139                const NEGATIVE_ONE: Self = match Self::new(-1) {
140                    Some(v) => v,
141                    None => unreachable!() // -1 is a valid non zero value
142                };
143            }
144        )+
145    }
146}
147
148impl_non_zero!(
149    NonZeroUsize && NonZeroIsize,
150    NonZeroU128 && NonZeroI128,
151    NonZeroU64 && NonZeroI64,
152    NonZeroU32 && NonZeroI32,
153    NonZeroU16 && NonZeroI16,
154    NonZeroU8 && NonZeroI8
155);