1 //! All of the **marker traits** used in typenum. 2 //! 3 //! Note that the definition here for marker traits is slightly different than 4 //! the conventional one -- we include traits with functions that convert a type 5 //! to the corresponding value, as well as associated constants that do the 6 //! same. 7 //! 8 //! For example, the `Integer` trait includes the function (among others) `fn 9 //! to_i32() -> i32` and the associated constant `I32` so that one can do this: 10 //! 11 //! ``` 12 //! use typenum::{N42, Integer}; 13 //! 14 //! assert_eq!(-42, N42::to_i32()); 15 //! assert_eq!(-42, N42::I32); 16 //! ``` 17 //! 18 19 /// A **marker trait** to designate that a type is not zero. All number types in this 20 /// crate implement `NonZero` except `B0`, `U0`, and `Z0`. 21 pub trait NonZero {} 22 23 /// A **Marker trait** for the types `Greater`, `Equal`, and `Less`. 24 /// 25 /// This trait should not be implemented for anything outside this crate. 26 pub trait Ord { 27 #[allow(missing_docs)] to_ordering() -> ::core::cmp::Ordering28 fn to_ordering() -> ::core::cmp::Ordering; 29 } 30 31 /// The **marker trait** for compile time bits. 32 /// 33 /// This trait should not be implemented for anything outside this crate. 34 pub trait Bit: Copy + Default { 35 #[allow(missing_docs)] 36 const U8: u8; 37 #[allow(missing_docs)] 38 const BOOL: bool; 39 40 #[allow(missing_docs)] to_u8() -> u841 fn to_u8() -> u8; 42 #[allow(missing_docs)] to_bool() -> bool43 fn to_bool() -> bool; 44 } 45 46 /// The **marker trait** for compile time unsigned integers. 47 /// 48 /// This trait should not be implemented for anything outside this crate. 49 /// 50 /// # Example 51 /// ```rust 52 /// use typenum::{U3, Unsigned}; 53 /// 54 /// assert_eq!(U3::to_u32(), 3); 55 /// assert_eq!(U3::I32, 3); 56 /// ``` 57 pub trait Unsigned: Copy + Default { 58 #[allow(missing_docs)] 59 const U8: u8; 60 #[allow(missing_docs)] 61 const U16: u16; 62 #[allow(missing_docs)] 63 const U32: u32; 64 #[allow(missing_docs)] 65 const U64: u64; 66 #[cfg(feature = "i128")] 67 #[allow(missing_docs)] 68 const U128: u128; 69 #[allow(missing_docs)] 70 const USIZE: usize; 71 72 #[allow(missing_docs)] 73 const I8: i8; 74 #[allow(missing_docs)] 75 const I16: i16; 76 #[allow(missing_docs)] 77 const I32: i32; 78 #[allow(missing_docs)] 79 const I64: i64; 80 #[cfg(feature = "i128")] 81 #[allow(missing_docs)] 82 const I128: i128; 83 #[allow(missing_docs)] 84 const ISIZE: isize; 85 86 #[allow(missing_docs)] to_u8() -> u887 fn to_u8() -> u8; 88 #[allow(missing_docs)] to_u16() -> u1689 fn to_u16() -> u16; 90 #[allow(missing_docs)] to_u32() -> u3291 fn to_u32() -> u32; 92 #[allow(missing_docs)] to_u64() -> u6493 fn to_u64() -> u64; 94 #[cfg(feature = "i128")] 95 #[allow(missing_docs)] to_u128() -> u12896 fn to_u128() -> u128; 97 #[allow(missing_docs)] to_usize() -> usize98 fn to_usize() -> usize; 99 100 #[allow(missing_docs)] to_i8() -> i8101 fn to_i8() -> i8; 102 #[allow(missing_docs)] to_i16() -> i16103 fn to_i16() -> i16; 104 #[allow(missing_docs)] to_i32() -> i32105 fn to_i32() -> i32; 106 #[allow(missing_docs)] to_i64() -> i64107 fn to_i64() -> i64; 108 #[cfg(feature = "i128")] 109 #[allow(missing_docs)] to_i128() -> i128110 fn to_i128() -> i128; 111 #[allow(missing_docs)] to_isize() -> isize112 fn to_isize() -> isize; 113 } 114 115 /// The **marker trait** for compile time signed integers. 116 /// 117 /// This trait should not be implemented for anything outside this crate. 118 /// 119 /// # Example 120 /// ```rust 121 /// use typenum::{P3, Integer}; 122 /// 123 /// assert_eq!(P3::to_i32(), 3); 124 /// assert_eq!(P3::I32, 3); 125 /// ``` 126 pub trait Integer { 127 #[allow(missing_docs)] 128 const I8: i8; 129 #[allow(missing_docs)] 130 const I16: i16; 131 #[allow(missing_docs)] 132 const I32: i32; 133 #[allow(missing_docs)] 134 const I64: i64; 135 #[cfg(feature = "i128")] 136 #[allow(missing_docs)] 137 const I128: i128; 138 #[allow(missing_docs)] 139 const ISIZE: isize; 140 141 #[allow(missing_docs)] to_i8() -> i8142 fn to_i8() -> i8; 143 #[allow(missing_docs)] to_i16() -> i16144 fn to_i16() -> i16; 145 #[allow(missing_docs)] to_i32() -> i32146 fn to_i32() -> i32; 147 #[allow(missing_docs)] to_i64() -> i64148 fn to_i64() -> i64; 149 #[cfg(feature = "i128")] 150 #[allow(missing_docs)] to_i128() -> i128151 fn to_i128() -> i128; 152 #[allow(missing_docs)] to_isize() -> isize153 fn to_isize() -> isize; 154 } 155 156 /// The **marker trait** for type-level arrays of type-level numbers. 157 /// 158 /// This trait should not be implemented for anything outside this crate. 159 /// 160 /// Someday, it may contain an associated constant to produce a runtime array, 161 /// like the other marker traits here. However, that is blocked by [this 162 /// issue](https://github.com/rust-lang/rust/issues/44168). 163 pub trait TypeArray {} 164 165 /// The **marker trait** for type-level numbers which are a power of two. 166 /// 167 /// This trait should not be implemented for anything outside this crate. 168 /// 169 /// # Examples 170 /// 171 /// Here's a working example: 172 /// 173 /// ```rust 174 /// use typenum::{P4, P8, PowerOfTwo}; 175 /// 176 /// fn only_p2<P: PowerOfTwo>() { } 177 /// 178 /// only_p2::<P4>(); 179 /// only_p2::<P8>(); 180 /// ``` 181 /// 182 /// Numbers which are not a power of two will fail to compile in this example: 183 /// 184 /// ```rust,compile_fail 185 /// use typenum::{P9, P511, P1023, PowerOfTwo}; 186 /// 187 /// fn only_p2<P: PowerOfTwo>() { } 188 /// 189 /// only_p2::<P9>(); 190 /// only_p2::<P511>(); 191 /// only_p2::<P1023>(); 192 /// ``` 193 194 pub trait PowerOfTwo {} 195