Skip to content

Commit

Permalink
Add new unstable feature const_eq_ignore_ascii_case
Browse files Browse the repository at this point in the history
Mark `[u8]`, `str` `eq_ignore_ascii_case` functions const
  • Loading branch information
okaneco committed Nov 6, 2024
1 parent ab6f663 commit 4ed08bd
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 3 deletions.
1 change: 1 addition & 0 deletions core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
#![feature(const_align_of_val_raw)]
#![feature(const_alloc_layout)]
#![feature(const_black_box)]
#![feature(const_eq_ignore_ascii_case)]
#![feature(const_eval_select)]
#![feature(const_float_methods)]
#![feature(const_heap)]
Expand Down
24 changes: 22 additions & 2 deletions core/src/slice/ascii.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,30 @@ impl [u8] {
/// Same as `to_ascii_lowercase(a) == to_ascii_lowercase(b)`,
/// but without allocating and copying temporaries.
#[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
#[rustc_const_unstable(feature = "const_eq_ignore_ascii_case", issue = "131719")]
#[must_use]
#[inline]
pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool {
self.len() == other.len() && iter::zip(self, other).all(|(a, b)| a.eq_ignore_ascii_case(b))
pub const fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool {
if self.len() != other.len() {
return false;
}

// FIXME(const-hack): This implementation can be reverted when
// `core::iter::zip` is allowed in const. The original implementation:
// self.len() == other.len() && iter::zip(self, other).all(|(a, b)| a.eq_ignore_ascii_case(b))
let mut a = self;
let mut b = other;

while let ([first_a, rest_a @ ..], [first_b, rest_b @ ..]) = (a, b) {
if first_a.eq_ignore_ascii_case(&first_b) {
a = rest_a;
b = rest_b;
} else {
return false;
}
}

true
}

/// Converts this slice to its ASCII upper case equivalent in-place.
Expand Down
3 changes: 2 additions & 1 deletion core/src/str/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2474,9 +2474,10 @@ impl str {
/// assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
/// ```
#[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
#[rustc_const_unstable(feature = "const_eq_ignore_ascii_case", issue = "131719")]
#[must_use]
#[inline]
pub fn eq_ignore_ascii_case(&self, other: &str) -> bool {
pub const fn eq_ignore_ascii_case(&self, other: &str) -> bool {
self.as_bytes().eq_ignore_ascii_case(other.as_bytes())
}

Expand Down

0 comments on commit 4ed08bd

Please sign in to comment.