|
| 1 | +//! Compile-time assert functions. |
| 2 | +
|
| 3 | +/// Helper macro for implementing asserts. |
| 4 | +macro_rules! assert_sorted_by_key { |
| 5 | + ($s:expr, $f:expr) => {{ |
| 6 | + let mut i = 0; |
| 7 | + while i + 1 < $s.len() { |
| 8 | + assert!(*$f(&$s[i]) < *$f(&$s[i + 1])); |
| 9 | + i += 1; |
| 10 | + } |
| 11 | + $s |
| 12 | + }}; |
| 13 | +} |
| 14 | + |
| 15 | +/// Returns the first element of a tuple. |
| 16 | +const fn elem_0<T>(x: &(u8, T)) -> &u8 { |
| 17 | + &x.0 |
| 18 | +} |
| 19 | + |
| 20 | +/// Asserts that a slice is sorted and has no duplicates. |
| 21 | +pub(crate) const fn assert_sorted(s: &[u8]) -> &[u8] { |
| 22 | + assert_sorted_by_key!(s, core::convert::identity) |
| 23 | +} |
| 24 | + |
| 25 | +/// Asserts that a slice is sorted by its first element and has no duplicates. |
| 26 | +pub(crate) const fn assert_sorted_elem_0<T>(s: &[(u8, T)]) -> &[(u8, T)] { |
| 27 | + assert_sorted_by_key!(s, elem_0) |
| 28 | +} |
| 29 | + |
| 30 | +/// Asserts that converting the first input to uppercase yields the second input. |
| 31 | +#[allow(dead_code)] |
| 32 | +pub(crate) const fn assert_to_ascii_uppercase(table: &[&str], upper_table: &[&str]) { |
| 33 | + assert!(table.len() == upper_table.len()); |
| 34 | + |
| 35 | + let mut index = 0; |
| 36 | + while index < table.len() { |
| 37 | + let (s, upper_s) = (table[index].as_bytes(), upper_table[index].as_bytes()); |
| 38 | + assert!(s.len() == upper_s.len()); |
| 39 | + |
| 40 | + let mut i = 0; |
| 41 | + while i < s.len() { |
| 42 | + assert!(s[i].is_ascii()); |
| 43 | + assert!(upper_s[i].is_ascii()); |
| 44 | + assert!(upper_s[i] == s[i].to_ascii_uppercase()); |
| 45 | + i += 1; |
| 46 | + } |
| 47 | + |
| 48 | + index += 1; |
| 49 | + } |
| 50 | +} |
0 commit comments