Auto merge of #86336 - camsteffen:char-array-pattern, r=joshtriplett
impl Pattern for char array Closes #39511 Closes #86329
This commit is contained in:
commit
c7e4740ec1
@ -22,6 +22,8 @@
|
||||
//! assert_eq!(s.find("you"), Some(4));
|
||||
//! // char pattern
|
||||
//! assert_eq!(s.find('n'), Some(2));
|
||||
//! // array of chars pattern
|
||||
//! assert_eq!(s.find(&['a', 'e', 'i', 'o', 'u']), Some(1));
|
||||
//! // slice of chars pattern
|
||||
//! assert_eq!(s.find(&['a', 'e', 'i', 'o', 'u'][..]), Some(1));
|
||||
//! // closure pattern
|
||||
@ -79,6 +81,11 @@
|
||||
/// assert_eq!("abaaa".find('b'), Some(1));
|
||||
/// assert_eq!("abaaa".find('c'), None);
|
||||
///
|
||||
/// // &[char; N]
|
||||
/// assert_eq!("ab".find(&['b', 'a']), Some(0));
|
||||
/// assert_eq!("abaaa".find(&['a', 'z']), Some(0));
|
||||
/// assert_eq!("abaaa".find(&['c', 'd']), None);
|
||||
///
|
||||
/// // &[char]
|
||||
/// assert_eq!("ab".find(&['b', 'a'][..]), Some(0));
|
||||
/// assert_eq!("abaaa".find(&['a', 'z'][..]), Some(0));
|
||||
@ -601,6 +608,20 @@ fn matches(&mut self, c: char) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
impl<const N: usize> MultiCharEq for [char; N] {
|
||||
#[inline]
|
||||
fn matches(&mut self, c: char) -> bool {
|
||||
self.iter().any(|&m| m == c)
|
||||
}
|
||||
}
|
||||
|
||||
impl<const N: usize> MultiCharEq for &[char; N] {
|
||||
#[inline]
|
||||
fn matches(&mut self, c: char) -> bool {
|
||||
self.iter().any(|&m| m == c)
|
||||
}
|
||||
}
|
||||
|
||||
impl MultiCharEq for &[char] {
|
||||
#[inline]
|
||||
fn matches(&mut self, c: char) -> bool {
|
||||
@ -752,6 +773,58 @@ fn next_reject_back(&mut self) -> Option<(usize, usize)> {
|
||||
};
|
||||
}
|
||||
|
||||
/// Associated type for `<[char; N] as Pattern<'a>>::Searcher`.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct CharArraySearcher<'a, const N: usize>(
|
||||
<MultiCharEqPattern<[char; N]> as Pattern<'a>>::Searcher,
|
||||
);
|
||||
|
||||
/// Associated type for `<&[char; N] as Pattern<'a>>::Searcher`.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct CharArrayRefSearcher<'a, 'b, const N: usize>(
|
||||
<MultiCharEqPattern<&'b [char; N]> as Pattern<'a>>::Searcher,
|
||||
);
|
||||
|
||||
/// Searches for chars that are equal to any of the [`char`]s in the array.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// assert_eq!("Hello world".find(['l', 'l']), Some(2));
|
||||
/// assert_eq!("Hello world".find(['l', 'l']), Some(2));
|
||||
/// ```
|
||||
impl<'a, const N: usize> Pattern<'a> for [char; N] {
|
||||
pattern_methods!(CharArraySearcher<'a, N>, MultiCharEqPattern, CharArraySearcher);
|
||||
}
|
||||
|
||||
unsafe impl<'a, const N: usize> Searcher<'a> for CharArraySearcher<'a, N> {
|
||||
searcher_methods!(forward);
|
||||
}
|
||||
|
||||
unsafe impl<'a, const N: usize> ReverseSearcher<'a> for CharArraySearcher<'a, N> {
|
||||
searcher_methods!(reverse);
|
||||
}
|
||||
|
||||
/// Searches for chars that are equal to any of the [`char`]s in the array.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// assert_eq!("Hello world".find(&['l', 'l']), Some(2));
|
||||
/// assert_eq!("Hello world".find(&['l', 'l']), Some(2));
|
||||
/// ```
|
||||
impl<'a, 'b, const N: usize> Pattern<'a> for &'b [char; N] {
|
||||
pattern_methods!(CharArrayRefSearcher<'a, 'b, N>, MultiCharEqPattern, CharArrayRefSearcher);
|
||||
}
|
||||
|
||||
unsafe impl<'a, 'b, const N: usize> Searcher<'a> for CharArrayRefSearcher<'a, 'b, N> {
|
||||
searcher_methods!(forward);
|
||||
}
|
||||
|
||||
unsafe impl<'a, 'b, const N: usize> ReverseSearcher<'a> for CharArrayRefSearcher<'a, 'b, N> {
|
||||
searcher_methods!(reverse);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Impl for &[char]
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
Loading…
Reference in New Issue
Block a user