funty/lib.rs
1/*! `fun`damental `ty`pes
2
3This crate provides trait unification of the Rust fundamental items, allowing
4users to declare the behavior they want from a number without committing to a
5single particular numeric type.
6
7The number types can be categorized along two axes: behavior and width. Traits
8for each axis and group on that axis are provided:
9
10## Numeric Categories
11
12The most general category is represented by the trait [`Numeric`]. It is
13implemented by all the numeric fundamentals, and includes only the traits that
14they all implement. This is an already-large amount: basic memory management,
15comparison, rendering, and numeric arithmetic.
16
17The numbers are then split into [`Floating`] and [`Integral`]. The former fills
18out the API of `f32` and `f64`, while the latter covers all of the `iN` and `uN`
19numbers.
20
21Lastly, [`Integral`] splits further, into [`Signed`] and [`Unsigned`]. These
22provide the last specializations unique to the differences between `iN` and
23`uN`.
24
25## Width Categories
26
27Every number implements the trait `IsN` for the `N` of its bit width. `isize`
28and `usize` implement the trait that matches their width on the target platform.
29
30In addition, the trait groups `AtLeastN` and `AtMostN` enable clamping the range
31of acceptable widths to lower or upper bounds. These traits are equivalent to
32`mem::size_of::<T>() >= N` and `mem::size_of::<T>() <= N`, respectively.
33
34[`Floating`]: trait.Floating.html
35[`Integral`]: trait.Integral.html
36[`Numeric`]: trait.Numeric.html
37[`Signed`]: trait.Signed.html
38[`Unsigned`]: trait.Unsigned.html
39!*/
40
41#![cfg_attr(not(feature = "std"), no_std)]
42#![deny(unconditional_recursion)]
43
44use core::{
45 convert::{
46 TryFrom,
47 TryInto,
48 },
49 fmt::{
50 Binary,
51 Debug,
52 Display,
53 LowerExp,
54 LowerHex,
55 Octal,
56 UpperExp,
57 UpperHex,
58 },
59 hash::Hash,
60 iter::{
61 Product,
62 Sum,
63 },
64 num::{
65 FpCategory,
66 ParseIntError,
67 },
68 ops::{
69 Add,
70 AddAssign,
71 BitAnd,
72 BitAndAssign,
73 BitOr,
74 BitOrAssign,
75 BitXor,
76 BitXorAssign,
77 Div,
78 DivAssign,
79 Mul,
80 MulAssign,
81 Neg,
82 Not,
83 Rem,
84 RemAssign,
85 Shl,
86 ShlAssign,
87 Shr,
88 ShrAssign,
89 Sub,
90 SubAssign,
91 },
92 str::FromStr,
93};
94
95/// Declare that a type is one of the language fundamental types.
96pub trait Fundamental:
97 'static
98 + Sized
99 + Send
100 + Sync
101 + Unpin
102 + Clone
103 + Copy
104 + Default
105 + FromStr
106 // cmp
107 + PartialEq<Self>
108 + PartialOrd<Self>
109 // fmt
110 + Debug
111 + Display
112 {
113 /// Tests `self != 0`.
114 fn as_bool(self) -> bool;
115
116 /// Represents `self` as a Unicode Scalar Value, if possible.
117 fn as_char(self) -> Option<char>;
118
119 /// Performs `self as i8`.
120 fn as_i8(self) -> i8;
121
122 /// Performs `self as i16`.
123 fn as_i16(self) -> i16;
124
125 /// Performs `self as i32`.
126 fn as_i32(self) -> i32;
127
128 /// Performs `self as i64`.
129 fn as_i64(self) -> i64;
130
131 /// Performs `self as i128`.
132 fn as_i128(self) -> i128;
133
134 /// Performs `self as isize`.
135 fn as_isize(self) -> isize;
136
137 /// Performs `self as u8`.
138 fn as_u8(self) -> u8;
139
140 /// Performs `self as u16`.
141 fn as_u16(self) -> u16;
142
143 /// Performs `self as u32`.
144 fn as_u32(self) -> u32;
145
146 /// Performs `self as u64`.
147 fn as_u64(self) -> u64;
148
149 /// Performs `self as u128`.
150 fn as_u128(self) -> u128;
151
152 /// Performs `self as usize`.
153 fn as_usize(self) -> usize;
154
155 /// Performs `self as f32`.
156 fn as_f32(self) -> f32;
157
158 /// Performs `self as f64`.
159 fn as_f64(self) -> f64;
160 }
161
162/// Declare that a type is an abstract number.
163///
164/// This unifies all of the signed-integer, unsigned-integer, and floating-point
165/// types.
166pub trait Numeric:
167 Fundamental
168 // iter
169 + Product<Self>
170 + for<'a> Product<&'a Self>
171 + Sum<Self>
172 + for<'a> Sum<&'a Self>
173 // numeric ops
174 + Add<Self, Output = Self>
175 + for<'a> Add<&'a Self, Output = Self>
176 + AddAssign<Self>
177 + for<'a> AddAssign<&'a Self>
178 + Sub<Self, Output = Self>
179 + for<'a> Sub<&'a Self, Output = Self>
180 + SubAssign<Self>
181 + for<'a> SubAssign<&'a Self>
182 + Mul<Self, Output = Self>
183 + for<'a> Mul<&'a Self, Output = Self>
184 + MulAssign<Self>
185 + for<'a> MulAssign<&'a Self>
186 + Div<Self, Output = Self>
187 + for<'a> Div<&'a Self, Output = Self>
188 + DivAssign<Self>
189 + for<'a> DivAssign<&'a Self>
190 + Rem<Self, Output = Self>
191 + for<'a> Rem<&'a Self, Output = Self>
192 + RemAssign<Self>
193 + for<'a> RemAssign<&'a Self>
194{
195 /// The `[u8; N]` byte array that stores values of `Self`.
196 type Bytes;
197
198 /// Return the memory representation of this number as a byte array in
199 /// big-endian (network) byte order.
200 fn to_be_bytes(self) -> Self::Bytes;
201
202 /// Return the memory representation of this number as a byte array in
203 /// little-endian byte order.
204 fn to_le_bytes(self) -> Self::Bytes;
205
206 /// Return the memory representation of this number as a byte array in
207 /// native byte order.
208 fn to_ne_bytes(self) -> Self::Bytes;
209
210 /// Create a numeric value from its representation as a byte array in big
211 /// endian.
212 fn from_be_bytes(bytes: Self::Bytes) -> Self;
213
214 /// Create a numeric value from its representation as a byte array in little
215 /// endian.
216 fn from_le_bytes(bytes: Self::Bytes) -> Self;
217
218 /// Create a numeric value from its memory representation as a byte array in
219 /// native endianness.
220 fn from_ne_bytes(bytes: Self::Bytes) -> Self;
221}
222
223/// Declare that a type is a fixed-point integer.
224///
225/// This unifies all of the signed and unsigned integral types.
226pub trait Integral:
227 Numeric
228 + Hash
229 + Eq
230 + Ord
231 + Binary
232 + LowerHex
233 + UpperHex
234 + Octal
235 + BitAnd<Self, Output = Self>
236 + for<'a> BitAnd<&'a Self, Output = Self>
237 + BitAndAssign<Self>
238 + for<'a> BitAndAssign<&'a Self>
239 + BitOr<Self, Output = Self>
240 + for<'a> BitOr<&'a Self, Output = Self>
241 + BitOrAssign<Self>
242 + for<'a> BitOrAssign<&'a Self>
243 + BitXor<Self, Output = Self>
244 + for<'a> BitXor<&'a Self, Output = Self>
245 + BitXorAssign<Self>
246 + for<'a> BitXorAssign<&'a Self>
247 + Not<Output = Self>
248 + TryFrom<i8>
249 + TryFrom<u8>
250 + TryFrom<i16>
251 + TryFrom<u16>
252 + TryFrom<i32>
253 + TryFrom<u32>
254 + TryFrom<i64>
255 + TryFrom<u64>
256 + TryFrom<i128>
257 + TryFrom<u128>
258 + TryFrom<isize>
259 + TryFrom<usize>
260 + TryInto<i8>
261 + TryInto<u8>
262 + TryInto<i16>
263 + TryInto<u16>
264 + TryInto<i32>
265 + TryInto<u32>
266 + TryInto<i64>
267 + TryInto<u64>
268 + TryInto<i128>
269 + TryInto<u128>
270 + TryInto<isize>
271 + TryInto<usize>
272 + Shl<Self, Output = Self>
273 + for<'a> Shl<&'a Self, Output = Self>
274 + ShlAssign<Self>
275 + for<'a> ShlAssign<&'a Self>
276 + Shr<Self, Output = Self>
277 + for<'a> Shr<&'a Self, Output = Self>
278 + ShrAssign<Self>
279 + for<'a> ShrAssign<&'a Self>
280 + Shl<i8, Output = Self>
281 + for<'a> Shl<&'a i8, Output = Self>
282 + ShlAssign<i8>
283 + for<'a> ShlAssign<&'a i8>
284 + Shr<i8, Output = Self>
285 + for<'a> Shr<&'a i8, Output = Self>
286 + ShrAssign<i8>
287 + for<'a> ShrAssign<&'a i8>
288 + Shl<u8, Output = Self>
289 + for<'a> Shl<&'a u8, Output = Self>
290 + ShlAssign<u8>
291 + for<'a> ShlAssign<&'a u8>
292 + Shr<u8, Output = Self>
293 + for<'a> Shr<&'a u8, Output = Self>
294 + ShrAssign<u8>
295 + for<'a> ShrAssign<&'a u8>
296 + Shl<i16, Output = Self>
297 + for<'a> Shl<&'a i16, Output = Self>
298 + ShlAssign<i16>
299 + for<'a> ShlAssign<&'a i16>
300 + Shr<i16, Output = Self>
301 + for<'a> Shr<&'a i16, Output = Self>
302 + ShrAssign<i16>
303 + for<'a> ShrAssign<&'a i16>
304 + Shl<u16, Output = Self>
305 + for<'a> Shl<&'a u16, Output = Self>
306 + ShlAssign<u16>
307 + for<'a> ShlAssign<&'a u16>
308 + Shr<u16, Output = Self>
309 + for<'a> Shr<&'a u16, Output = Self>
310 + ShrAssign<u16>
311 + for<'a> ShrAssign<&'a u16>
312 + Shl<i32, Output = Self>
313 + for<'a> Shl<&'a i32, Output = Self>
314 + ShlAssign<i32>
315 + for<'a> ShlAssign<&'a i32>
316 + Shr<i32, Output = Self>
317 + for<'a> Shr<&'a i32, Output = Self>
318 + ShrAssign<i32>
319 + for<'a> ShrAssign<&'a i32>
320 + Shl<u32, Output = Self>
321 + for<'a> Shl<&'a u32, Output = Self>
322 + ShlAssign<u32>
323 + for<'a> ShlAssign<&'a u32>
324 + Shr<u32, Output = Self>
325 + for<'a> Shr<&'a u32, Output = Self>
326 + ShrAssign<u32>
327 + for<'a> ShrAssign<&'a u32>
328 + Shl<i64, Output = Self>
329 + for<'a> Shl<&'a i64, Output = Self>
330 + ShlAssign<i64>
331 + for<'a> ShlAssign<&'a i64>
332 + Shr<i64, Output = Self>
333 + for<'a> Shr<&'a i64, Output = Self>
334 + ShrAssign<i64>
335 + for<'a> ShrAssign<&'a i64>
336 + Shl<u64, Output = Self>
337 + for<'a> Shl<&'a u64, Output = Self>
338 + ShlAssign<u64>
339 + for<'a> ShlAssign<&'a u64>
340 + Shr<u64, Output = Self>
341 + for<'a> Shr<&'a u64, Output = Self>
342 + ShrAssign<u64>
343 + for<'a> ShrAssign<&'a u64>
344 + Shl<i128, Output = Self>
345 + for<'a> Shl<&'a i128, Output = Self>
346 + ShlAssign<i128>
347 + for<'a> ShlAssign<&'a i128>
348 + Shr<i128, Output = Self>
349 + for<'a> Shr<&'a i128, Output = Self>
350 + ShrAssign<i128>
351 + for<'a> ShrAssign<&'a i128>
352 + Shl<u128, Output = Self>
353 + for<'a> Shl<&'a u128, Output = Self>
354 + ShlAssign<u128>
355 + for<'a> ShlAssign<&'a u128>
356 + Shr<u128, Output = Self>
357 + for<'a> Shr<&'a u128, Output = Self>
358 + ShrAssign<u128>
359 + for<'a> ShrAssign<&'a u128>
360 + Shl<isize, Output = Self>
361 + for<'a> Shl<&'a isize, Output = Self>
362 + ShlAssign<isize>
363 + for<'a> ShlAssign<&'a isize>
364 + Shr<isize, Output = Self>
365 + for<'a> Shr<&'a isize, Output = Self>
366 + ShrAssign<isize>
367 + for<'a> ShrAssign<&'a isize>
368 + Shl<usize, Output = Self>
369 + for<'a> Shl<&'a usize, Output = Self>
370 + ShlAssign<usize>
371 + for<'a> ShlAssign<&'a usize>
372 + Shr<usize, Output = Self>
373 + for<'a> Shr<&'a usize, Output = Self>
374 + ShrAssign<usize>
375 + for<'a> ShrAssign<&'a usize>
376{
377 /// The type’s zero value.
378 const ZERO: Self;
379
380 /// The type’s step value.
381 const ONE: Self;
382
383 /// The type’s minimum value. This is zero for unsigned integers.
384 const MIN: Self;
385
386 /// The type’s maximum value.
387 const MAX: Self;
388
389 /// The size of this type in bits.
390 const BITS: u32;
391
392 /// Returns the smallest value that can be represented by this integer type.
393 fn min_value() -> Self;
394
395 /// Returns the largest value that can be represented by this integer type.
396 fn max_value() -> Self;
397
398 /// Converts a string slice in a given base to an integer.
399 ///
400 /// The string is expected to be an optional `+` or `-` sign followed by
401 /// digits. Leading and trailing whitespace represent an error. Digits are a
402 /// subset of these characters, depending on `radix`:
403 ///
404 /// - `0-9`
405 /// - `a-z`
406 /// - `A-Z`
407 ///
408 /// # Panics
409 ///
410 /// This function panics if `radix` is not in the range from 2 to 36.
411 fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError>;
412
413 /// Returns the number of ones in the binary representation of `self`.
414 fn count_ones(self) -> u32;
415
416 /// Returns the number of zeros in the binary representation of `self`.
417 fn count_zeros(self) -> u32;
418
419 /// Returns the number of leading zeros in the binary representation of
420 /// `self`.
421 fn leading_zeros(self) -> u32;
422
423 /// Returns the number of trailing zeros in the binary representation of
424 /// `self`.
425 fn trailing_zeros(self) -> u32;
426
427 /// Returns the number of leading ones in the binary representation of
428 /// `self`.
429 fn leading_ones(self) -> u32;
430
431 /// Returns the number of trailing ones in the binary representation of
432 /// `self`.
433 fn trailing_ones(self) -> u32;
434
435 /// Shifts the bits to the left by a specified amount, `n`, wrapping the
436 /// truncated bits to the end of the resulting integer.
437 ///
438 /// Please note this isn’t the same operation as the `<<` shifting operator!
439 fn rotate_left(self, n: u32) -> Self;
440
441 /// Shifts the bits to the right by a specified amount, `n`, wrapping the
442 /// truncated bits to the beginning of the resulting integer.
443 ///
444 /// Please note this isn’t the same operation as the `>>` shifting operator!
445 fn rotate_right(self, n: u32) -> Self;
446
447 /// Reverses the byte order of the integer.
448 fn swap_bytes(self) -> Self;
449
450 /// Reverses the bit pattern of the integer.
451 fn reverse_bits(self) -> Self;
452
453 /// Converts an integer from big endian to the target’s endianness.
454 ///
455 /// On big endian this is a no-op. On little endian the bytes are swapped.
456 #[allow(clippy::wrong_self_convention)]
457 fn from_be(self) -> Self;
458
459 /// Converts an integer frm little endian to the target’s endianness.
460 ///
461 /// On little endian this is a no-op. On big endian the bytes are swapped.
462 #[allow(clippy::wrong_self_convention)]
463 fn from_le(self) -> Self;
464
465 /// Converts `self` to big endian from the target’s endianness.
466 ///
467 /// On big endian this is a no-op. On little endian the bytes are swapped.
468 fn to_be(self) -> Self;
469
470 /// Converts `self` to little endian from the target’s endianness.
471 ///
472 /// On little endian this is a no-op. On big endian the bytes are swapped.
473 fn to_le(self) -> Self;
474
475 /// Checked integer addition. Computes `self + rhs`, returning `None` if
476 /// overflow occurred.
477 fn checked_add(self, rhs: Self) -> Option<Self>;
478
479 /// Checked integer subtraction. Computes `self - rhs`, returning `None` if
480 /// overflow occurred.
481 fn checked_sub(self, rhs: Self) -> Option<Self>;
482
483 /// Checked integer multiplication. Computes `self * rhs`, returning `None`
484 /// if overflow occurred.
485 fn checked_mul(self, rhs: Self) -> Option<Self>;
486
487 /// Checked integer division. Computes `self / rhs`, returning `None` if
488 /// `rhs == 0` or the division results in overflow.
489 fn checked_div(self, rhs: Self) -> Option<Self>;
490
491 /// Checked Euclidean division. Computes `self.div_euclid(rhs)`, returning
492 /// `None` if `rhs == 0` or the division results in overflow.
493 fn checked_div_euclid(self, rhs: Self) -> Option<Self>;
494
495 /// Checked integer remainder. Computes `self % rhs`, returning `None` if
496 /// `rhs == 0` or the division results in overflow.
497 fn checked_rem(self, rhs: Self) -> Option<Self>;
498
499 /// Checked Euclidean remainder. Computes `self.rem_euclid(rhs)`, returning
500 /// `None` if `rhs == 0` or the division results in overflow.
501 fn checked_rem_euclid(self, rhs: Self) -> Option<Self>;
502
503 /// Checked negation. Computes `-self`, returning `None` if `self == MIN`.
504 ///
505 /// Note that negating any positive integer will overflow.
506 fn checked_neg(self) -> Option<Self>;
507
508 /// Checked shift left. Computes `self << rhs`, returning `None` if `rhs` is
509 /// larger than or equal to the number of bits in `self`.
510 fn checked_shl(self, rhs: u32) -> Option<Self>;
511
512 /// Checked shift right. Computes `self >> rhs`, returning `None` if `rhs`
513 /// is larger than or equal to the number of bits in `self`.
514 fn checked_shr(self, rhs: u32) -> Option<Self>;
515
516 /// Checked exponentiation. Computes `self.pow(exp)`, returning `None` if
517 /// overflow occurred.
518 fn checked_pow(self, rhs: u32) -> Option<Self>;
519
520 /// Saturating integer addition. Computes `self + rhs`, saturating at the
521 /// numeric bounds instead of overflowing.
522 fn saturating_add(self, rhs: Self) -> Self;
523
524 /// Saturating integer subtraction. Computes `self - rhs`, saturating at the
525 /// numeric bounds instead of overflowing.
526 fn saturating_sub(self, rhs: Self) -> Self;
527
528 /// Saturating integer multiplication. Computes `self * rhs`, saturating at
529 /// the numeric bounds instead of overflowing.
530 fn saturating_mul(self, rhs: Self) -> Self;
531
532 /// Saturating integer exponentiation. Computes `self.pow(exp)`, saturating
533 /// at the numeric bounds instead of overflowing.
534 fn saturating_pow(self, rhs: u32) -> Self;
535
536 /// Wrapping (modular) addition. Computes `self + rhs`, wrapping around at
537 /// the boundary of the type.
538 fn wrapping_add(self, rhs: Self) -> Self;
539
540 /// Wrapping (modular) subtraction. Computes `self - rhs`, wrapping around
541 /// at the boundary of the type.
542 fn wrapping_sub(self, rhs: Self) -> Self;
543
544 /// Wrapping (modular) multiplication. Computes `self * rhs`, wrapping
545 /// around at the boundary of the type.
546 fn wrapping_mul(self, rhs: Self) -> Self;
547
548 /// Wrapping (modular) division. Computes `self / rhs`, wrapping around at
549 /// the boundary of the type.
550 ///
551 /// # Signed Integers
552 ///
553 /// The only case where such wrapping can occur is when one divides
554 /// `MIN / -1` on a signed type (where `MIN` is the negative minimal value
555 /// for the type); this is equivalent to `-MIN`, a positive value that is
556 /// too large to represent in the type. In such a case, this function
557 /// returns `MIN` itself.
558 ///
559 /// # Unsigned Integers
560 ///
561 /// Wrapping (modular) division. Computes `self / rhs`. Wrapped division on
562 /// unsigned types is just normal division. There’s no way wrapping could
563 /// ever happen. This function exists, so that all operations are accounted
564 /// for in the wrapping operations.
565 ///
566 /// # Panics
567 ///
568 /// This function will panic if `rhs` is 0.
569 fn wrapping_div(self, rhs: Self) -> Self;
570
571 /// Wrapping Euclidean division. Computes `self.div_euclid(rhs)`, wrapping
572 /// around at the boundary of the type.
573 ///
574 /// # Signed Types
575 ///
576 /// Wrapping will only occur in `MIN / -1` on a signed type (where `MIN` is
577 /// the negative minimal value for the type). This is equivalent to `-MIN`,
578 /// a positive value that is too large to represent in the type. In this
579 /// case, this method returns `MIN` itself.
580 ///
581 /// # Unsigned Types
582 ///
583 /// Wrapped division on unsigned types is just normal division. There’s no
584 /// way wrapping could ever happen. This function exists, so that all
585 /// operations are accounted for in the wrapping operations. Since, for the
586 /// positive integers, all common definitions of division are equal, this is
587 /// exactly equal to `self.wrapping_div(rhs)`.
588 ///
589 /// # Panics
590 ///
591 /// This function will panic if `rhs` is 0.
592 fn wrapping_div_euclid(self, rhs: Self) -> Self;
593
594 /// Wrapping (modular) remainder. Computes `self % rhs`, wrapping around at
595 /// the boundary of the type.
596 ///
597 /// # Signed Integers
598 ///
599 /// Such wrap-around never actually occurs mathematically; implementation
600 /// artifacts make `x % y` invalid for `MIN / -1` on a signed type (where
601 /// `MIN` is the negative minimal value). In such a case, this function
602 /// returns `0`.
603 ///
604 /// # Unsigned Integers
605 ///
606 /// Wrapped remainder calculation on unsigned types is just the regular
607 /// remainder calculation. There’s no way wrapping could ever happen. This
608 /// function exists, so that all operations are accounted for in the
609 /// wrapping operations.
610 ///
611 /// # Panics
612 ///
613 /// This function will panic if `rhs` is 0.
614 fn wrapping_rem(self, rhs: Self) -> Self;
615
616 /// Wrapping Euclidean remainder. Computes `self.rem_euclid(rhs)`, wrapping
617 /// around at the boundary of the type.
618 ///
619 /// # Signed Integers
620 ///
621 /// Wrapping will only occur in `MIN % -1` on a signed type (where `MIN` is
622 /// the negative minimal value for the type). In this case, this method
623 /// returns 0.
624 ///
625 /// # Unsigned Integers
626 ///
627 /// Wrapped modulo calculation on unsigned types is just the regular
628 /// remainder calculation. There’s no way wrapping could ever happen. This
629 /// function exists, so that all operations are accounted for in the
630 /// wrapping operations. Since, for the positive integers, all common
631 /// definitions of division are equal, this is exactly equal to
632 /// `self.wrapping_rem(rhs)`.
633 ///
634 /// # Panics
635 ///
636 /// This function will panic if `rhs` is 0.
637 fn wrapping_rem_euclid(self, rhs: Self) -> Self;
638
639 /// Wrapping (modular) negation. Computes `-self`, wrapping around at the
640 /// boundary of the type.
641 ///
642 /// # Signed Integers
643 ///
644 /// The only case where such wrapping can occur is when one negates `MIN`
645 /// on a signed type (where `MIN` is the negative minimal value for the
646 /// type); this is a positive value that is too large to represent in the
647 /// type. In such a case, this function returns `MIN` itself.
648 ///
649 /// # Unsigned Integers
650 ///
651 /// Since unsigned types do not have negative equivalents all applications
652 /// of this function will wrap (except for `-0`). For values smaller than
653 /// the corresponding signed type’s maximum the result is the same as
654 /// casting the corresponding signed value. Any larger values are equivalent
655 /// to `MAX + 1 - (val - MAX - 1)` where `MAX` is the corresponding signed
656 /// type’s maximum.
657 fn wrapping_neg(self) -> Self;
658
659 /// Panic-free bitwise shift-left; yields `self << mask(rhs)`, where `mask`
660 /// removes any high-order bits of `rhs` that would cause the shift to
661 /// exceed the bit-width of the type.
662 ///
663 /// Note that this is not the same as a rotate-left; the RHS of a wrapping
664 /// shift-left is restricted to the range of the type, rather than the bits
665 /// shifted out of the LHS being returned to the other end. The primitive
666 /// integer types all implement a `rotate_left` function, which may be what
667 /// you want instead.
668 fn wrapping_shl(self, rhs: u32) -> Self;
669
670 /// Panic-free bitwise shift-right; yields `self >> mask(rhs)`, where `mask`
671 /// removes any high-order bits of `rhs` that would cause the shift to
672 /// exceed the bit-width of the type.
673 ///
674 /// Note that this is not the same as a rotate-right; the RHS of a wrapping
675 /// shift-right is restricted to the range of the type, rather than the bits
676 /// shifted out of the LHS being returned to the other end. The primitive
677 /// integer types all implement a `rotate_right` function, which may be what
678 /// you want instead.
679 fn wrapping_shr(self, rhs: u32) -> Self;
680
681 /// Wrapping (modular) exponentiation. Computes `self.pow(exp)`, wrapping
682 /// around at the boundary of the type.
683 fn wrapping_pow(self, rhs: u32) -> Self;
684
685 /// Calculates `self + rhs`
686 ///
687 /// Returns a tuple of the addition along with a boolean indicating whether
688 /// an arithmetic overflow would occur. If an overflow would have occurred
689 /// then the wrapped value is returned.
690 fn overflowing_add(self, rhs: Self) -> (Self, bool);
691
692 /// Calculates `self - rhs`
693 ///
694 /// Returns a tuple of the subtraction along with a boolean indicating
695 /// whether an arithmetic overflow would occur. If an overflow would have
696 /// occurred then the wrapped value is returned.
697 fn overflowing_sub(self, rhs: Self) -> (Self, bool);
698
699 /// Calculates the multiplication of `self` and `rhs`.
700 ///
701 /// Returns a tuple of the multiplication along with a boolean indicating
702 /// whether an arithmetic overflow would occur. If an overflow would have
703 /// occurred then the wrapped value is returned.
704 fn overflowing_mul(self, rhs: Self) -> (Self, bool);
705
706 /// Calculates the divisor when `self` is divided by `rhs`.
707 ///
708 /// Returns a tuple of the divisor along with a boolean indicating whether
709 /// an arithmetic overflow would occur. If an overflow would occur then self
710 /// is returned.
711 ///
712 /// # Panics
713 ///
714 /// This function will panic if `rhs` is 0.
715 fn overflowing_div(self, rhs: Self) -> (Self, bool);
716
717 /// Calculates the quotient of Euclidean division `self.div_euclid(rhs)`.
718 ///
719 /// Returns a tuple of the divisor along with a boolean indicating whether
720 /// an arithmetic overflow would occur. If an overflow would occur then self
721 /// is returned.
722 ///
723 /// # Panics
724 ///
725 /// This function will panic if `rhs` is 0.
726 fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool);
727
728 /// Calculates the remainder when `self` is divided by `rhs`.
729 ///
730 /// Returns a tuple of the remainder after dividing along with a boolean
731 /// indicating whether an arithmetic overflow would occur. If an overflow
732 /// would occur then 0 is returned.
733 ///
734 /// # Panics
735 ///
736 /// This function will panic if `rhs` is 0.
737 fn overflowing_rem(self, rhs: Self) -> (Self, bool);
738
739 /// Overflowing Euclidean remainder. Calculates `self.rem_euclid(rhs)`.
740 ///
741 /// Returns a tuple of the remainder after dividing along with a boolean
742 /// indicating whether an arithmetic overflow would occur. If an overflow
743 /// would occur then 0 is returned.
744 ///
745 /// # Panics
746 ///
747 /// This function will panic if rhs is 0.
748 fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool);
749
750 /// Negates self, overflowing if this is equal to the minimum value.
751 ///
752 /// Returns a tuple of the negated version of self along with a boolean
753 /// indicating whether an overflow happened. If `self` is the minimum value
754 /// (e.g., `i32::MIN` for values of type `i32`), then the minimum value will
755 /// be returned again and `true` will be returned for an overflow happening.
756 fn overflowing_neg(self) -> (Self, bool);
757
758 /// Shifts self left by `rhs` bits.
759 ///
760 /// Returns a tuple of the shifted version of self along with a boolean
761 /// indicating whether the shift value was larger than or equal to the
762 /// number of bits. If the shift value is too large, then value is masked
763 /// (N-1) where N is the number of bits, and this value is then used to
764 /// perform the shift.
765 fn overflowing_shl(self, rhs: u32) -> (Self, bool);
766
767 /// Shifts self right by `rhs` bits.
768 ///
769 /// Returns a tuple of the shifted version of self along with a boolean
770 /// indicating whether the shift value was larger than or equal to the
771 /// number of bits. If the shift value is too large, then value is masked
772 /// (N-1) where N is the number of bits, and this value is then used to
773 /// perform the shift.
774 fn overflowing_shr(self, rhs: u32) -> (Self, bool);
775
776 /// Raises self to the power of `exp`, using exponentiation by squaring.
777 ///
778 /// Returns a tuple of the exponentiation along with a bool indicating
779 /// whether an overflow happened.
780 fn overflowing_pow(self, rhs: u32) -> (Self, bool);
781
782 /// Raises self to the power of `exp`, using exponentiation by squaring.
783 fn pow(self, rhs: u32) -> Self;
784
785 /// Calculates the quotient of Euclidean division of self by rhs.
786 ///
787 /// This computes the integer `n` such that
788 /// `self = n * rhs + self.rem_euclid(rhs)`, with
789 /// `0 <= self.rem_euclid(rhs) < rhs`.
790 ///
791 /// In other words, the result is `self / rhs` rounded to the integer `n`
792 /// such that `self >= n * rhs`. If `self > 0`, this is equal to round
793 /// towards zero (the default in Rust); if `self < 0`, this is equal to
794 /// round towards +/- infinity.
795 ///
796 /// # Panics
797 ///
798 /// This function will panic if `rhs` is 0 or the division results in
799 /// overflow.
800 fn div_euclid(self, rhs: Self) -> Self;
801
802 /// Calculates the least nonnegative remainder of `self (mod rhs)`.
803 ///
804 /// This is done as if by the Euclidean division algorithm -- given
805 /// `r = self.rem_euclid(rhs)`, `self = rhs * self.div_euclid(rhs) + r`, and
806 /// `0 <= r < abs(rhs)`.
807 ///
808 /// # Panics
809 ///
810 /// This function will panic if `rhs` is 0 or the division results in
811 /// overflow.
812 fn rem_euclid(self, rhs: Self) -> Self;
813}
814
815/// Declare that a type is a signed integer.
816pub trait Signed: Integral + Neg {
817 /// Checked absolute value. Computes `self.abs()`, returning `None` if
818 /// `self == MIN`.
819 fn checked_abs(self) -> Option<Self>;
820
821 /// Wrapping (modular) absolute value. Computes `self.abs()`, wrapping
822 /// around at the boundary of the type.
823 ///
824 /// The only case where such wrapping can occur is when one takes the
825 /// absolute value of the negative minimal value for the type this is a
826 /// positive value that is too large to represent in the type. In such a
827 /// case, this function returns `MIN` itself.
828 fn wrapping_abs(self) -> Self;
829
830 /// Computes the absolute value of `self`.
831 ///
832 /// Returns a tuple of the absolute version of self along with a boolean
833 /// indicating whether an overflow happened. If self is the minimum value
834 /// (e.g., iN::MIN for values of type iN), then the minimum value will be
835 /// returned again and true will be returned for an overflow happening.
836 fn overflowing_abs(self) -> (Self, bool);
837
838 //// Computes the absolute value of self.
839 ///
840 /// # Overflow behavior
841 ///
842 /// The absolute value of `iN::min_value()` cannot be represented as an
843 /// `iN`, and attempting to calculate it will cause an overflow. This means
844 /// that code in debug mode will trigger a panic on this case and optimized
845 /// code will return `iN::min_value()` without a panic.
846 fn abs(self) -> Self;
847
848 /// Returns a number representing sign of `self`.
849 ///
850 /// - `0` if the number is zero
851 /// - `1` if the number is positive
852 /// - `-1` if the number is negative
853 fn signum(self) -> Self;
854
855 /// Returns `true` if `self` is positive and `false` if the number is zero
856 /// or negative.
857 fn is_positive(self) -> bool;
858
859 /// Returns `true` if `self` is negative and `false` if the number is zero
860 /// or positive.
861 fn is_negative(self) -> bool;
862}
863
864/// Declare that a type is an unsigned integer.
865pub trait Unsigned: Integral {
866 /// Returns `true` if and only if `self == 2^k` for some `k`.
867 fn is_power_of_two(self) -> bool;
868
869 /// Returns the smallest power of two greater than or equal to `self`.
870 ///
871 /// When return value overflows (i.e., `self > (1 << (N-1))` for type `uN`),
872 /// it panics in debug mode and return value is wrapped to 0 in release mode
873 /// (the only situation in which method can return 0).
874 fn next_power_of_two(self) -> Self;
875
876 /// Returns the smallest power of two greater than or equal to `n`. If the
877 /// next power of two is greater than the type’s maximum value, `None` is
878 /// returned, otherwise the power of two is wrapped in `Some`.
879 fn checked_next_power_of_two(self) -> Option<Self>;
880}
881
882/// Declare that a type is a floating-point number.
883pub trait Floating:
884 Numeric
885 + LowerExp
886 + UpperExp
887 + Neg
888 + From<f32>
889 + From<i8>
890 + From<i16>
891 + From<u8>
892 + From<u16>
893{
894 /// The unsigned integer type of the same width as `Self`.
895 type Raw: Unsigned;
896
897 /// The radix or base of the internal representation of `f32`.
898 const RADIX: u32;
899
900 /// Number of significant digits in base 2.
901 const MANTISSA_DIGITS: u32;
902
903 /// Approximate number of significant digits in base 10.
904 const DIGITS: u32;
905
906 /// [Machine epsilon] value for `f32`.
907 ///
908 /// This is the difference between `1.0` and the next larger representable
909 /// number.
910 ///
911 /// [Machine epsilon]: https://en.wikipedia.org/wiki/Machine_epsilon
912 const EPSILON: Self;
913
914 /// Smallest finite `f32` value.
915 const MIN: Self;
916
917 /// Smallest positive normal `f32` value.
918 const MIN_POSITIVE: Self;
919
920 /// Largest finite `f32` value.
921 const MAX: Self;
922
923 /// One greater than the minimum possible normal power of 2 exponent.
924 const MIN_EXP: i32;
925
926 /// Maximum possible power of 2 exponent.
927 const MAX_EXP: i32;
928
929 /// Minimum possible normal power of 10 exponent.
930 const MIN_10_EXP: i32;
931
932 /// Maximum possible power of 10 exponent.
933 const MAX_10_EXP: i32;
934
935 /// Not a Number (NaN).
936 const NAN: Self;
937
938 /// Infinity (∞).
939 const INFINITY: Self;
940
941 /// Negative infinity (−∞).
942 const NEG_INFINITY: Self;
943
944 /// Archimedes' constant (π)
945 const PI: Self;
946
947 /// π/2
948 const FRAC_PI_2: Self;
949
950 /// π/3
951 const FRAC_PI_3: Self;
952
953 /// π/4
954 const FRAC_PI_4: Self;
955
956 /// π/6
957 const FRAC_PI_6: Self;
958
959 /// π/8
960 const FRAC_PI_8: Self;
961
962 /// 1/π
963 const FRAC_1_PI: Self;
964
965 /// 2/π
966 const FRAC_2_PI: Self;
967
968 /// 2/sqrt(π)
969 const FRAC_2_SQRT_PI: Self;
970
971 /// sqrt(2)
972 const SQRT_2: Self;
973
974 /// 1/sqrt(2)
975 const FRAC_1_SQRT_2: Self;
976
977 /// Euler’s number (e)
978 const E: Self;
979
980 /// log<sub>2</sub>(e)
981 const LOG2_E: Self;
982
983 /// log<sub>10</sub>(e)
984 const LOG10_E: Self;
985
986 /// ln(2)
987 const LN_2: Self;
988
989 /// ln(10)
990 const LN_10: Self;
991
992 // These functions are only available in `std`, because they rely on the
993 // system math library `libm` which is not provided by `core`.
994
995 /// Returns the largest integer less than or equal to a number.
996 #[cfg(feature = "std")]
997 fn floor(self) -> Self;
998
999 /// Returns the smallest integer greater than or equal to a number.
1000 #[cfg(feature = "std")]
1001 fn ceil(self) -> Self;
1002
1003 /// Returns the nearest integer to a number. Round half-way cases away from
1004 /// `0.0`.
1005 #[cfg(feature = "std")]
1006 fn round(self) -> Self;
1007
1008 /// Returns the integer part of a number.
1009 #[cfg(feature = "std")]
1010 fn trunc(self) -> Self;
1011
1012 /// Returns the fractional part of a number.
1013 #[cfg(feature = "std")]
1014 fn fract(self) -> Self;
1015
1016 /// Computes the absolute value of `self`. Returns `NAN` if the
1017 /// number is `NAN`.
1018 #[cfg(feature = "std")]
1019 fn abs(self) -> Self;
1020
1021 /// Returns a number that represents the sign of `self`.
1022 ///
1023 /// - `1.0` if the number is positive, `+0.0` or `INFINITY`
1024 /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
1025 /// - `NAN` if the number is `NAN`
1026 #[cfg(feature = "std")]
1027 fn signum(self) -> Self;
1028
1029 /// Returns a number composed of the magnitude of `self` and the sign of
1030 /// `sign`.
1031 ///
1032 /// Equal to `self` if the sign of `self` and `sign` are the same, otherwise
1033 /// equal to `-self`. If `self` is a `NAN`, then a `NAN` with the sign of
1034 /// `sign` is returned.
1035 #[cfg(feature = "std")]
1036 fn copysign(self, sign: Self) -> Self;
1037
1038 /// Fused multiply-add. Computes `(self * a) + b` with only one rounding
1039 /// error, yielding a more accurate result than an un-fused multiply-add.
1040 ///
1041 /// Using `mul_add` can be more performant than an un-fused multiply-add if
1042 /// the target architecture has a dedicated `fma` CPU instruction.
1043 #[cfg(feature = "std")]
1044 fn mul_add(self, a: Self, b: Self) -> Self;
1045
1046 /// Calculates Euclidean division, the matching method for `rem_euclid`.
1047 ///
1048 /// This computes the integer `n` such that
1049 /// `self = n * rhs + self.rem_euclid(rhs)`.
1050 /// In other words, the result is `self / rhs` rounded to the integer `n`
1051 /// such that `self >= n * rhs`.
1052 #[cfg(feature = "std")]
1053 fn div_euclid(self, rhs: Self) -> Self;
1054
1055 /// Calculates the least nonnegative remainder of `self (mod rhs)`.
1056 ///
1057 /// In particular, the return value `r` satisfies `0.0 <= r < rhs.abs()` in
1058 /// most cases. However, due to a floating point round-off error it can
1059 /// result in `r == rhs.abs()`, violating the mathematical definition, if
1060 /// `self` is much smaller than `rhs.abs()` in magnitude and `self < 0.0`.
1061 /// This result is not an element of the function's codomain, but it is the
1062 /// closest floating point number in the real numbers and thus fulfills the
1063 /// property `self == self.div_euclid(rhs) * rhs + self.rem_euclid(rhs)`
1064 /// approximatively.
1065 #[cfg(feature = "std")]
1066 fn rem_euclid(self, rhs: Self) -> Self;
1067
1068 /// Raises a number to an integer power.
1069 ///
1070 /// Using this function is generally faster than using `powf`
1071 #[cfg(feature = "std")]
1072 fn powi(self, n: i32) -> Self;
1073
1074 /// Raises a number to a floating point power.
1075 #[cfg(feature = "std")]
1076 fn powf(self, n: Self) -> Self;
1077
1078 /// Returns the square root of a number.
1079 ///
1080 /// Returns NaN if `self` is a negative number.
1081 #[cfg(feature = "std")]
1082 fn sqrt(self) -> Self;
1083
1084 /// Returns `e^(self)`, (the exponential function).
1085 #[cfg(feature = "std")]
1086 fn exp(self) -> Self;
1087
1088 /// Returns `2^(self)`.
1089 #[cfg(feature = "std")]
1090 fn exp2(self) -> Self;
1091
1092 /// Returns the natural logarithm of the number.
1093 #[cfg(feature = "std")]
1094 fn ln(self) -> Self;
1095
1096 /// Returns the logarithm of the number with respect to an arbitrary base.
1097 ///
1098 /// The result may not be correctly rounded owing to implementation details;
1099 /// `self.log2()` can produce more accurate results for base 2, and
1100 /// `self.log10()` can produce more accurate results for base 10.
1101 #[cfg(feature = "std")]
1102 fn log(self, base: Self) -> Self;
1103
1104 /// Returns the base 2 logarithm of the number.
1105 #[cfg(feature = "std")]
1106 fn log2(self) -> Self;
1107
1108 /// Returns the base 10 logarithm of the number.
1109 #[cfg(feature = "std")]
1110 fn log10(self) -> Self;
1111
1112 /// Returns the cubic root of a number.
1113 #[cfg(feature = "std")]
1114 fn cbrt(self) -> Self;
1115
1116 /// Computes the sine of a number (in radians).
1117 #[cfg(feature = "std")]
1118 fn hypot(self, other: Self) -> Self;
1119
1120 /// Computes the sine of a number (in radians).
1121 #[cfg(feature = "std")]
1122 fn sin(self) -> Self;
1123
1124 /// Computes the cosine of a number (in radians).
1125 #[cfg(feature = "std")]
1126 fn cos(self) -> Self;
1127
1128 /// Computes the tangent of a number (in radians).
1129 #[cfg(feature = "std")]
1130 fn tan(self) -> Self;
1131
1132 /// Computes the arcsine of a number. Return value is in radians in the
1133 /// range [-pi/2, pi/2] or NaN if the number is outside the range [-1, 1].
1134 #[cfg(feature = "std")]
1135 fn asin(self) -> Self;
1136
1137 /// Computes the arccosine of a number. Return value is in radians in the
1138 /// range [0, pi] or NaN if the number is outside the range [-1, 1].
1139 #[cfg(feature = "std")]
1140 fn acos(self) -> Self;
1141
1142 /// Computes the arctangent of a number. Return value is in radians in the
1143 /// range [-pi/2, pi/2];
1144 #[cfg(feature = "std")]
1145 fn atan(self) -> Self;
1146
1147 /// Computes the four quadrant arctangent of `self` (`y`) and `other` (`x`)
1148 /// in radians.
1149 ///
1150 /// - `x = 0`, `y = 0`: `0`
1151 /// - `x >= 0`: `arctan(y/x)` -> `[-pi/2, pi/2]`
1152 /// - `y >= 0`: `arctan(y/x) + pi` -> `(pi/2, pi]`
1153 /// - `y < 0`: `arctan(y/x) - pi` -> `(-pi, -pi/2)`
1154 #[cfg(feature = "std")]
1155 fn atan2(self, other: Self) -> Self;
1156
1157 /// Simultaneously computes the sine and cosine of the number, `x`. Returns
1158 /// `(sin(x), cos(x))`.
1159 #[cfg(feature = "std")]
1160 fn sin_cos(self) -> (Self, Self);
1161
1162 /// Returns `e^(self) - 1` in a way that is accurate even if the number is
1163 /// close to zero.
1164 #[cfg(feature = "std")]
1165 fn exp_m1(self) -> Self;
1166
1167 /// Returns `ln(1+n)` (natural logarithm) more accurately than if the
1168 /// operations were performed separately.
1169 #[cfg(feature = "std")]
1170 fn ln_1p(self) -> Self;
1171
1172 /// Hyperbolic sine function.
1173 #[cfg(feature = "std")]
1174 fn sinh(self) -> Self;
1175
1176 /// Hyperbolic cosine function.
1177 #[cfg(feature = "std")]
1178 fn cosh(self) -> Self;
1179
1180 /// Hyperbolic tangent function.
1181 #[cfg(feature = "std")]
1182 fn tanh(self) -> Self;
1183
1184 /// Inverse hyperbolic sine function.
1185 #[cfg(feature = "std")]
1186 fn asinh(self) -> Self;
1187
1188 /// Inverse hyperbolic cosine function.
1189 #[cfg(feature = "std")]
1190 fn acosh(self) -> Self;
1191
1192 /// Inverse hyperbolic tangent function.
1193 #[cfg(feature = "std")]
1194 fn atanh(self) -> Self;
1195
1196 /// Returns `true` if this value is `NaN`.
1197 fn is_nan(self) -> bool;
1198
1199 /// Returns `true` if this value is positive infinity or negative infinity,
1200 /// and `false` otherwise.
1201 fn is_infinite(self) -> bool;
1202
1203 /// Returns `true` if this number is neither infinite nor `NaN`.
1204 fn is_finite(self) -> bool;
1205
1206 /// Returns `true` if the number is neither zero, infinite, [subnormal], or
1207 /// `NaN`.
1208 ///
1209 /// [subnormal]: https://en.wixipedia.org/wiki/Denormal_number
1210 fn is_normal(self) -> bool;
1211
1212 /// Returns the floating point category of the number. If only one property
1213 /// is going to be tested, it is generally faster to use the specific
1214 /// predicate instead.
1215 fn classify(self) -> FpCategory;
1216
1217 /// Returns `true` if `self` has a positive sign, including `+0.0`, `NaN`s
1218 /// with positive sign bit and positive infinity.
1219 fn is_sign_positive(self) -> bool;
1220
1221 /// Returns `true` if `self` has a negative sign, including `-0.0`, `NaN`s
1222 /// with negative sign bit and negative infinity.
1223 fn is_sign_negative(self) -> bool;
1224
1225 /// Takes the reciprocal (inverse) of a number, `1/x`.
1226 fn recip(self) -> Self;
1227
1228 /// Converts radians to degrees.
1229 fn to_degrees(self) -> Self;
1230
1231 /// Converts degrees to radians.
1232 fn to_radians(self) -> Self;
1233
1234 /// Returns the maximum of the two numbers.
1235 fn max(self, other: Self) -> Self;
1236
1237 /// Returns the minimum of the two numbers.
1238 fn min(self, other: Self) -> Self;
1239
1240 /// Raw transmutation to `u32`.
1241 ///
1242 /// This is currently identical to `transmute::<f32, u32>(self)` on all
1243 /// platforms.
1244 ///
1245 /// See `from_bits` for some discussion of the portability of this operation
1246 /// (there are almost no issues).
1247 ///
1248 /// Note that this function is distinct from `as` casting, which attempts to
1249 /// preserve the *numeric* value, and not the bitwise value.
1250 fn to_bits(self) -> Self::Raw;
1251
1252 /// Raw transmutation from `u32`.
1253 ///
1254 /// This is currently identical to `transmute::<u32, f32>(v)` on all
1255 /// platforms. It turns out this is incredibly portable, for two reasons:
1256 ///
1257 /// - Floats and Ints have the same endianness on all supported platforms.
1258 /// - IEEE-754 very precisely specifies the bit layout of floats.
1259 ///
1260 /// However there is one caveat: prior to the 2008 version of IEEE-754, how
1261 /// to interpret the NaN signaling bit wasn't actually specified. Most
1262 /// platforms (notably x86 and ARM) picked the interpretation that was
1263 /// ultimately standardized in 2008, but some didn't (notably MIPS). As a
1264 /// result, all signaling NaNs on MIPS are quiet NaNs on x86, and
1265 /// vice-versa.
1266 ///
1267 /// Rather than trying to preserve signaling-ness cross-platform, this
1268 /// implementation favors preserving the exact bits. This means that
1269 /// any payloads encoded in NaNs will be preserved even if the result of
1270 /// this method is sent over the network from an x86 machine to a MIPS one.
1271 ///
1272 /// If the results of this method are only manipulated by the same
1273 /// architecture that produced them, then there is no portability concern.
1274 ///
1275 /// If the input isn't NaN, then there is no portability concern.
1276 ///
1277 /// If you don't care about signalingness (very likely), then there is no
1278 /// portability concern.
1279 ///
1280 /// Note that this function is distinct from `as` casting, which attempts to
1281 /// preserve the *numeric* value, and not the bitwise value.
1282 fn from_bits(bits: Self::Raw) -> Self;
1283}
1284
1285/// Declare that a type is exactly eight bits wide.
1286pub trait Is8: Numeric {}
1287
1288/// Declare that a type is exactly sixteen bits wide.
1289pub trait Is16: Numeric {}
1290
1291/// Declare that a type is exactly thirty-two bits wide.
1292pub trait Is32: Numeric {}
1293
1294/// Declare that a type is exactly sixty-four bits wide.
1295pub trait Is64: Numeric {}
1296
1297/// Declare that a type is exactly one hundred twenty-eight bits wide.
1298pub trait Is128: Numeric {}
1299
1300/// Declare that a type is eight or more bits wide.
1301pub trait AtLeast8: Numeric {}
1302
1303/// Declare that a type is sixteen or more bits wide.
1304pub trait AtLeast16: Numeric {}
1305
1306/// Declare that a type is thirty-two or more bits wide.
1307pub trait AtLeast32: Numeric {}
1308
1309/// Declare that a type is sixty-four or more bits wide.
1310pub trait AtLeast64: Numeric {}
1311
1312/// Declare that a type is one hundred twenty-eight or more bits wide.
1313pub trait AtLeast128: Numeric {}
1314
1315/// Declare that a type is eight or fewer bits wide.
1316pub trait AtMost8: Numeric {}
1317
1318/// Declare that a type is sixteen or fewer bits wide.
1319pub trait AtMost16: Numeric {}
1320
1321/// Declare that a type is thirty-two or fewer bits wide.
1322pub trait AtMost32: Numeric {}
1323
1324/// Declare that a type is sixty-four or fewer bits wide.
1325pub trait AtMost64: Numeric {}
1326
1327/// Declare that a type is one hundred twenty-eight or fewer bits wide.
1328pub trait AtMost128: Numeric {}
1329
1330/// Creates new wrapper functions that forward to inherent items of the same
1331/// name and signature.
1332macro_rules! func {
1333 (
1334 $(@$std:literal)?
1335 $name:ident (self$(, $arg:ident: $t:ty)*) $(-> $ret:ty)?;
1336 $($tt:tt)*
1337 ) => {
1338 $(#[cfg(feature = $std)])?
1339 fn $name(self$(, $arg: $t)*) $(-> $ret)?
1340 {
1341 <Self>::$name(self$(, $arg)*)
1342 }
1343
1344 func!($($tt)*);
1345 };
1346 (
1347 $(@$std:literal)?
1348 $name:ident(&self$(, $arg:ident: $t:ty)*) $(-> $ret:ty)?;
1349 $($tt:tt)*
1350 ) => {
1351 $(#[cfg(feature = $std)])?
1352 fn $name(&self$(, $arg: $t)*) $(-> $ret)?
1353 {
1354 <Self>::$name(&self$(, $arg )*)
1355 }
1356
1357 func!($($tt)*);
1358 };
1359 (
1360 $(@$std:literal)?
1361 $name:ident(&mut self$(, $arg:ident: $t:ty)*) $(-> $ret:ty)?;
1362 $($tt:tt)*
1363 ) => {
1364 $(#[cfg(feature = $std)])?
1365 fn $name(&mut self$(, $arg: $t)*) $(-> $ret)?
1366 {
1367 <Self>::$name(&mut self$(, $arg)*)
1368 }
1369
1370 func!($($tt)*);
1371 };
1372 (
1373 $(@$std:literal)?
1374 $name:ident($($arg:ident: $t:ty),* $(,)?) $(-> $ret:ty)?;
1375 $($tt:tt)*
1376 ) => {
1377 $(#[cfg(feature = $std)])?
1378 fn $name($($arg: $t),*) $(-> $ret)?
1379 {
1380 <Self>::$name($($arg),*)
1381 }
1382
1383 func!($($tt)*);
1384 };
1385 () => {};
1386}
1387
1388macro_rules! impl_for {
1389 ( Fundamental => $($t:ty => $is_zero:expr),+ $(,)? ) => { $(
1390 impl Fundamental for $t {
1391 #[inline(always)]
1392 #[allow(clippy::redundant_closure_call)]
1393 fn as_bool(self) -> bool { ($is_zero)(self) }
1394
1395 #[inline(always)]
1396 fn as_char(self) -> Option<char> {
1397 core::char::from_u32(self as u32)
1398 }
1399
1400 #[inline(always)]
1401 fn as_i8(self) -> i8 { self as i8 }
1402
1403 #[inline(always)]
1404 fn as_i16(self) -> i16 { self as i16 }
1405
1406 #[inline(always)]
1407 fn as_i32(self) -> i32 { self as i32 }
1408
1409 #[inline(always)]
1410 fn as_i64(self) -> i64 { self as i64 }
1411
1412 #[inline(always)]
1413 fn as_i128(self) -> i128 { self as i128 }
1414
1415 #[inline(always)]
1416 fn as_isize(self) -> isize { self as isize }
1417
1418 #[inline(always)]
1419 fn as_u8(self) -> u8 { self as u8 }
1420
1421 #[inline(always)]
1422 fn as_u16(self) -> u16 { self as u16 }
1423
1424 #[inline(always)]
1425 fn as_u32(self) -> u32 { self as u32 }
1426
1427 #[inline(always)]
1428 fn as_u64(self) -> u64 { self as u64 }
1429
1430 #[inline(always)]
1431 fn as_u128(self) ->u128 { self as u128 }
1432
1433 #[inline(always)]
1434 fn as_usize(self) -> usize { self as usize }
1435
1436 #[inline(always)]
1437 fn as_f32(self) -> f32 { self as u32 as f32 }
1438
1439 #[inline(always)]
1440 fn as_f64(self) -> f64 { self as u64 as f64 }
1441 }
1442 )+ };
1443 ( Numeric => $($t:ty),+ $(,)? ) => { $(
1444 impl Numeric for $t {
1445 type Bytes = [u8; core::mem::size_of::<Self>()];
1446
1447 func! {
1448 to_be_bytes(self) -> Self::Bytes;
1449 to_le_bytes(self) -> Self::Bytes;
1450 to_ne_bytes(self) -> Self::Bytes;
1451 from_be_bytes(bytes: Self::Bytes) -> Self;
1452 from_le_bytes(bytes: Self::Bytes) -> Self;
1453 from_ne_bytes(bytes: Self::Bytes) -> Self;
1454 }
1455 }
1456 )+ };
1457 ( Integral => $($t:ty),+ $(,)? ) => { $(
1458 impl Integral for $t {
1459 const ZERO: Self = 0;
1460 const ONE: Self = 1;
1461 const MIN: Self = <Self>::min_value();
1462 const MAX: Self = <Self>::max_value();
1463
1464 const BITS: u32 = <Self>::BITS;
1465
1466 func! {
1467 min_value() -> Self;
1468 max_value() -> Self;
1469 from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError>;
1470 count_ones(self) -> u32;
1471 count_zeros(self) -> u32;
1472 leading_zeros(self) -> u32;
1473 trailing_zeros(self) -> u32;
1474 leading_ones(self) -> u32;
1475 trailing_ones(self) -> u32;
1476 rotate_left(self, n: u32) -> Self;
1477 rotate_right(self, n: u32) -> Self;
1478 swap_bytes(self) -> Self;
1479 reverse_bits(self) -> Self;
1480 from_be(self) -> Self;
1481 from_le(self) -> Self;
1482 to_be(self) -> Self;
1483 to_le(self) -> Self;
1484 checked_add(self, rhs: Self) -> Option<Self>;
1485 checked_sub(self, rhs: Self) -> Option<Self>;
1486 checked_mul(self, rhs: Self) -> Option<Self>;
1487 checked_div(self, rhs: Self) -> Option<Self>;
1488 checked_div_euclid(self, rhs: Self) -> Option<Self>;
1489 checked_rem(self, rhs: Self) -> Option<Self>;
1490 checked_rem_euclid(self, rhs: Self) -> Option<Self>;
1491 checked_neg(self) -> Option<Self>;
1492 checked_shl(self, rhs: u32) -> Option<Self>;
1493 checked_shr(self, rhs: u32) -> Option<Self>;
1494 checked_pow(self, rhs: u32) -> Option<Self>;
1495 saturating_add(self, rhs: Self) -> Self;
1496 saturating_sub(self, rhs: Self) -> Self;
1497 saturating_mul(self, rhs: Self) -> Self;
1498 saturating_pow(self, rhs: u32) -> Self;
1499 wrapping_add(self, rhs: Self) -> Self;
1500 wrapping_sub(self, rhs: Self) -> Self;
1501 wrapping_mul(self, rhs: Self) -> Self;
1502 wrapping_div(self, rhs: Self) -> Self;
1503 wrapping_div_euclid(self, rhs: Self) -> Self;
1504 wrapping_rem(self, rhs: Self) -> Self;
1505 wrapping_rem_euclid(self, rhs: Self) -> Self;
1506 wrapping_neg(self) -> Self;
1507 wrapping_shl(self, rhs: u32) -> Self;
1508 wrapping_shr(self, rhs: u32) -> Self;
1509 wrapping_pow(self, rhs: u32) -> Self;
1510 overflowing_add(self, rhs: Self) -> (Self, bool);
1511 overflowing_sub(self, rhs: Self) -> (Self, bool);
1512 overflowing_mul(self, rhs: Self) -> (Self, bool);
1513 overflowing_div(self, rhs: Self) -> (Self, bool);
1514 overflowing_div_euclid(self, rhs: Self) -> (Self, bool);
1515 overflowing_rem(self, rhs: Self) -> (Self, bool);
1516 overflowing_rem_euclid(self, rhs: Self) -> (Self, bool);
1517 overflowing_neg(self) -> (Self, bool);
1518 overflowing_shl(self, rhs: u32) -> (Self, bool);
1519 overflowing_shr(self, rhs: u32) -> (Self, bool);
1520 overflowing_pow(self, rhs: u32) -> (Self, bool);
1521 pow(self, rhs: u32) -> Self;
1522 div_euclid(self, rhs: Self) -> Self;
1523 rem_euclid(self, rhs: Self) -> Self;
1524 }
1525 }
1526 )+ };
1527 ( Signed => $($t:ty),+ $(,)? ) => { $(
1528 impl Signed for $t {
1529 func! {
1530 checked_abs(self) -> Option<Self>;
1531 wrapping_abs(self) -> Self;
1532 overflowing_abs(self) -> (Self, bool);
1533 abs(self) -> Self;
1534 signum(self) -> Self;
1535 is_positive(self) -> bool;
1536 is_negative(self) -> bool;
1537 }
1538 }
1539 )+ };
1540 ( Unsigned => $($t:ty),+ $(,)? ) => { $(
1541 impl Unsigned for $t {
1542 func! {
1543 is_power_of_two(self) -> bool;
1544 next_power_of_two(self) -> Self;
1545 checked_next_power_of_two(self) -> Option<Self>;
1546 }
1547 }
1548 )+ };
1549 ( Floating => $($t:ident | $u:ty),+ $(,)? ) => { $(
1550 impl Floating for $t {
1551 type Raw = $u;
1552
1553 const RADIX: u32 = core::$t::RADIX;
1554 const MANTISSA_DIGITS: u32 = core::$t::MANTISSA_DIGITS;
1555 const DIGITS: u32 = core::$t::DIGITS;
1556 const EPSILON: Self = core::$t::EPSILON;
1557 const MIN: Self = core::$t::MIN;
1558 const MIN_POSITIVE: Self = core::$t::MIN_POSITIVE;
1559 const MAX: Self = core::$t::MAX;
1560 const MIN_EXP: i32 = core::$t::MIN_EXP;
1561 const MAX_EXP: i32 = core::$t::MAX_EXP;
1562 const MIN_10_EXP: i32 = core::$t::MIN_10_EXP;
1563 const MAX_10_EXP: i32 = core::$t::MAX_10_EXP;
1564 const NAN: Self = core::$t::NAN;
1565 const INFINITY: Self = core::$t::INFINITY;
1566 const NEG_INFINITY: Self = core::$t::NEG_INFINITY;
1567
1568 const PI: Self = core::$t::consts::PI;
1569 const FRAC_PI_2: Self = core::$t::consts::FRAC_PI_2;
1570 const FRAC_PI_3: Self = core::$t::consts::FRAC_PI_3;
1571 const FRAC_PI_4: Self = core::$t::consts::FRAC_PI_4;
1572 const FRAC_PI_6: Self = core::$t::consts::FRAC_PI_6;
1573 const FRAC_PI_8: Self = core::$t::consts::FRAC_PI_8;
1574 const FRAC_1_PI: Self = core::$t::consts::FRAC_1_PI;
1575 const FRAC_2_PI: Self = core::$t::consts::FRAC_2_PI;
1576 const FRAC_2_SQRT_PI: Self = core::$t::consts::FRAC_2_SQRT_PI;
1577 const SQRT_2: Self = core::$t::consts::SQRT_2;
1578 const FRAC_1_SQRT_2: Self = core::$t::consts::FRAC_1_SQRT_2;
1579 const E: Self = core::$t::consts::E;
1580 const LOG2_E: Self = core::$t::consts::LOG2_E;
1581 const LOG10_E: Self = core::$t::consts::LOG10_E;
1582 const LN_2: Self = core::$t::consts::LN_2;
1583 const LN_10: Self = core::$t::consts::LN_10;
1584
1585 func! {
1586 @"std" floor(self) -> Self;
1587 @"std" ceil(self) -> Self;
1588 @"std" round(self) -> Self;
1589 @"std" trunc(self) -> Self;
1590 @"std" fract(self) -> Self;
1591 @"std" abs(self) -> Self;
1592 @"std" signum(self) -> Self;
1593 @"std" copysign(self, sign: Self) -> Self;
1594 @"std" mul_add(self, a: Self, b: Self) -> Self;
1595 @"std" div_euclid(self, rhs: Self) -> Self;
1596 @"std" rem_euclid(self, rhs: Self) -> Self;
1597 @"std" powi(self, n: i32) -> Self;
1598 @"std" powf(self, n: Self) -> Self;
1599 @"std" sqrt(self) -> Self;
1600 @"std" exp(self) -> Self;
1601 @"std" exp2(self) -> Self;
1602 @"std" ln(self) -> Self;
1603 @"std" log(self, base: Self) -> Self;
1604 @"std" log2(self) -> Self;
1605 @"std" log10(self) -> Self;
1606 @"std" cbrt(self) -> Self;
1607 @"std" hypot(self, other: Self) -> Self;
1608 @"std" sin(self) -> Self;
1609 @"std" cos(self) -> Self;
1610 @"std" tan(self) -> Self;
1611 @"std" asin(self) -> Self;
1612 @"std" acos(self) -> Self;
1613 @"std" atan(self) -> Self;
1614 @"std" atan2(self, other: Self) -> Self;
1615 @"std" sin_cos(self) -> (Self, Self);
1616 @"std" exp_m1(self) -> Self;
1617 @"std" ln_1p(self) -> Self;
1618 @"std" sinh(self) -> Self;
1619 @"std" cosh(self) -> Self;
1620 @"std" tanh(self) -> Self;
1621 @"std" asinh(self) -> Self;
1622 @"std" acosh(self) -> Self;
1623 @"std" atanh(self) -> Self;
1624 is_nan(self) -> bool;
1625 is_infinite(self) -> bool;
1626 is_finite(self) -> bool;
1627 is_normal(self) -> bool;
1628 classify(self) -> FpCategory;
1629 is_sign_positive(self) -> bool;
1630 is_sign_negative(self) -> bool;
1631 recip(self) -> Self;
1632 to_degrees(self) -> Self;
1633 to_radians(self) -> Self;
1634 max(self, other: Self) -> Self;
1635 min(self, other: Self) -> Self;
1636 to_bits(self) -> Self::Raw;
1637 from_bits(bits: Self::Raw) -> Self;
1638 }
1639 }
1640 )+ };
1641 ( $which:ty => $($t:ty),+ $(,)? ) => { $(
1642 impl $which for $t {}
1643 )+ };
1644}
1645
1646impl_for!(Fundamental =>
1647 bool => |this: bool| !this,
1648 char => |this| this != '\0',
1649 i8 => |this| this != 0,
1650 i16 => |this| this != 0,
1651 i32 => |this| this != 0,
1652 i64 => |this| this != 0,
1653 i128 => |this| this != 0,
1654 isize => |this| this != 0,
1655 u8 => |this| this != 0,
1656 u16 => |this| this != 0,
1657 u32 => |this| this != 0,
1658 u64 => |this| this != 0,
1659 u128 => |this| this != 0,
1660 usize => |this| this != 0,
1661 f32 => |this: f32| (-Self::EPSILON ..= Self::EPSILON).contains(&this),
1662 f64 => |this: f64| (-Self::EPSILON ..= Self::EPSILON).contains(&this),
1663);
1664impl_for!(Numeric => i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, f32, f64);
1665impl_for!(Integral => i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize);
1666impl_for!(Signed => i8, i16, i32, i64, i128, isize);
1667impl_for!(Unsigned => u8, u16, u32, u64, u128, usize);
1668impl_for!(Floating => f32 | u32, f64 | u64);
1669
1670impl_for!(Is8 => i8, u8);
1671impl_for!(Is16 => i16, u16);
1672impl_for!(Is32 => i32, u32, f32);
1673impl_for!(Is64 => i64, u64, f64);
1674impl_for!(Is128 => i128, u128);
1675
1676#[cfg(target_pointer_width = "16")]
1677impl_for!(Is16 => isize, usize);
1678
1679#[cfg(target_pointer_width = "32")]
1680impl_for!(Is32 => isize, usize);
1681
1682#[cfg(target_pointer_width = "64")]
1683impl_for!(Is64 => isize, usize);
1684
1685impl_for!(AtLeast8 => i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, f32, f64);
1686impl_for!(AtLeast16 => i16, i32, i64, i128, u16, u32, u64, u128, f32, f64);
1687impl_for!(AtLeast32 => i32, i64, i128, u32, u64, u128, f32, f64);
1688impl_for!(AtLeast64 => i64, i128, u64, u128, f64);
1689impl_for!(AtLeast128 => i128, u128);
1690
1691#[cfg(any(
1692 target_pointer_width = "16",
1693 target_pointer_width = "32",
1694 target_pointer_width = "64"
1695))]
1696impl_for!(AtLeast16 => isize, usize);
1697
1698#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
1699impl_for!(AtLeast32 => isize, usize);
1700
1701#[cfg(target_pointer_width = "64")]
1702impl_for!(AtLeast64 => isize, usize);
1703
1704impl_for!(AtMost8 => i8, u8);
1705impl_for!(AtMost16 => i8, i16, u8, u16);
1706impl_for!(AtMost32 => i8, i16, i32, u8, u16, u32, f32);
1707impl_for!(AtMost64 => i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64);
1708impl_for!(AtMost128 => i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, f32, f64);
1709
1710#[cfg(target_pointer_width = "16")]
1711impl_for!(AtMost16 => isize, usize);
1712
1713#[cfg(any(target_pointer_width = "16", target_pointer_width = "32"))]
1714impl_for!(AtMost32 => isize, usize);
1715
1716#[cfg(test)]
1717mod tests {
1718 use super::*;
1719 use static_assertions::*;
1720
1721 assert_impl_all!(bool: Fundamental);
1722 assert_impl_all!(char: Fundamental);
1723
1724 assert_impl_all!(i8: Integral, Signed, Is8);
1725 assert_impl_all!(i16: Integral, Signed, Is16);
1726 assert_impl_all!(i32: Integral, Signed, Is32);
1727 assert_impl_all!(i64: Integral, Signed, Is64);
1728 assert_impl_all!(i128: Integral, Signed, Is128);
1729 assert_impl_all!(isize: Integral, Signed);
1730
1731 assert_impl_all!(u8: Integral, Unsigned, Is8);
1732 assert_impl_all!(u16: Integral, Unsigned, Is16);
1733 assert_impl_all!(u32: Integral, Unsigned, Is32);
1734 assert_impl_all!(u64: Integral, Unsigned, Is64);
1735 assert_impl_all!(u128: Integral, Unsigned, Is128);
1736 assert_impl_all!(usize: Integral, Unsigned);
1737
1738 assert_impl_all!(f32: Floating, Is32);
1739 assert_impl_all!(f64: Floating, Is64);
1740}