• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! Utilities to generate bitmasks.
2 
3 #![doc(hidden)]
4 
5 /// Generate a bitwise mask for the lower `n` bits.
6 ///
7 /// # Examples
8 ///
9 /// ```rust
10 /// # use minimal_lexical::mask::lower_n_mask;
11 /// # pub fn main() {
12 /// assert_eq!(lower_n_mask(2), 0b11);
13 /// # }
14 /// ```
15 #[inline]
lower_n_mask(n: u64) -> u6416 pub fn lower_n_mask(n: u64) -> u64 {
17     debug_assert!(n <= 64, "lower_n_mask() overflow in shl.");
18 
19     match n == 64 {
20         // u64::MAX for older Rustc versions.
21         true => 0xffff_ffff_ffff_ffff,
22         false => (1 << n) - 1,
23     }
24 }
25 
26 /// Calculate the halfway point for the lower `n` bits.
27 ///
28 /// # Examples
29 ///
30 /// ```rust
31 /// # use minimal_lexical::mask::lower_n_halfway;
32 /// # pub fn main() {
33 /// assert_eq!(lower_n_halfway(2), 0b10);
34 /// # }
35 /// ```
36 #[inline]
lower_n_halfway(n: u64) -> u6437 pub fn lower_n_halfway(n: u64) -> u64 {
38     debug_assert!(n <= 64, "lower_n_halfway() overflow in shl.");
39 
40     match n == 0 {
41         true => 0,
42         false => nth_bit(n - 1),
43     }
44 }
45 
46 /// Calculate a scalar factor of 2 above the halfway point.
47 ///
48 /// # Examples
49 ///
50 /// ```rust
51 /// # use minimal_lexical::mask::nth_bit;
52 /// # pub fn main() {
53 /// assert_eq!(nth_bit(2), 0b100);
54 /// # }
55 /// ```
56 #[inline]
nth_bit(n: u64) -> u6457 pub fn nth_bit(n: u64) -> u64 {
58     debug_assert!(n < 64, "nth_bit() overflow in shl.");
59     1 << n
60 }
61