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 Thue-Morse constant, whose bits are the Thue-Morse sequence.
68pub trait ThueMorseConstant {
69    const 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// Implementation for `NonZero*` types:
79// - `One` and `Two` for both signed and unsigned variants
80// - `NegativeOne` for the signed variant
81macro_rules! impl_non_zero {
82    ($($t:ident),+) => {
83        $(
84            impl One for $t {
85                const ONE: Self = match Self::new(1) {
86                    Some(v) => v,
87                    None => unreachable!() // 1 is a valid nonzero value
88                };
89            }
90
91            impl Two for $t {
92                const TWO: Self = match Self::new(2) {
93                    Some(v) => v,
94                    None => unreachable!() // 2 is a valid nonzero value
95                };
96            }
97        )+
98    };
99    ($($u:ident && $i:ident),+) => {
100        $(
101            impl_non_zero!($u, $i);
102
103            impl NegativeOne for $i {
104                const NEGATIVE_ONE: Self = match Self::new(-1) {
105                    Some(v) => v,
106                    None => unreachable!() // -1 is a valid non zero value
107                };
108            }
109        )+
110    }
111}
112
113impl_non_zero!(
114    NonZeroUsize && NonZeroIsize,
115    NonZeroU128 && NonZeroI128,
116    NonZeroU64 && NonZeroI64,
117    NonZeroU32 && NonZeroI32,
118    NonZeroU16 && NonZeroI16,
119    NonZeroU8 && NonZeroI8
120);