|
22 | 22 | //! assert_eq!(s.find("you"), Some(4));
|
23 | 23 | //! // char pattern
|
24 | 24 | //! assert_eq!(s.find('n'), Some(2));
|
| 25 | +//! // array of chars pattern |
| 26 | +//! assert_eq!(s.find(&['a', 'e', 'i', 'o', 'u']), Some(1)); |
25 | 27 | //! // slice of chars pattern
|
26 | 28 | //! assert_eq!(s.find(&['a', 'e', 'i', 'o', 'u'][..]), Some(1));
|
27 | 29 | //! // closure pattern
|
@@ -79,6 +81,11 @@ use crate::slice::memchr;
|
79 | 81 | /// assert_eq!("abaaa".find('b'), Some(1));
|
80 | 82 | /// assert_eq!("abaaa".find('c'), None);
|
81 | 83 | ///
|
| 84 | +/// // &[char; N] |
| 85 | +/// assert_eq!("ab".find(&['b', 'a']), Some(0)); |
| 86 | +/// assert_eq!("abaaa".find(&['a', 'z']), Some(0)); |
| 87 | +/// assert_eq!("abaaa".find(&['c', 'd']), None); |
| 88 | +/// |
82 | 89 | /// // &[char]
|
83 | 90 | /// assert_eq!("ab".find(&['b', 'a'][..]), Some(0));
|
84 | 91 | /// assert_eq!("abaaa".find(&['a', 'z'][..]), Some(0));
|
@@ -601,6 +608,13 @@ where
|
601 | 608 | }
|
602 | 609 | }
|
603 | 610 |
|
| 611 | +impl<const N: usize> MultiCharEq for &[char; N] { |
| 612 | + #[inline] |
| 613 | + fn matches(&mut self, c: char) -> bool { |
| 614 | + self.iter().any(|&m| m == c) |
| 615 | + } |
| 616 | +} |
| 617 | + |
604 | 618 | impl MultiCharEq for &[char] {
|
605 | 619 | #[inline]
|
606 | 620 | fn matches(&mut self, c: char) -> bool {
|
@@ -752,6 +766,32 @@ macro_rules! searcher_methods {
|
752 | 766 | };
|
753 | 767 | }
|
754 | 768 |
|
| 769 | +/// Associated type for `<[char; N] as Pattern<'a>>::Searcher`. |
| 770 | +#[derive(Clone, Debug)] |
| 771 | +pub struct CharArraySearcher<'a, 'b, const N: usize>( |
| 772 | + <MultiCharEqPattern<&'b [char; N]> as Pattern<'a>>::Searcher, |
| 773 | +); |
| 774 | + |
| 775 | +/// Searches for chars that are equal to any of the [`char`]s in the array. |
| 776 | +/// |
| 777 | +/// # Examples |
| 778 | +/// |
| 779 | +/// ``` |
| 780 | +/// assert_eq!("Hello world".find(&['l', 'l']), Some(2)); |
| 781 | +/// assert_eq!("Hello world".find(&['l', 'l']), Some(2)); |
| 782 | +/// ``` |
| 783 | +impl<'a, 'b, const N: usize> Pattern<'a> for &'b [char; N] { |
| 784 | + pattern_methods!(CharArraySearcher<'a, 'b, N>, MultiCharEqPattern, CharArraySearcher); |
| 785 | +} |
| 786 | + |
| 787 | +unsafe impl<'a, 'b, const N: usize> Searcher<'a> for CharArraySearcher<'a, 'b, N> { |
| 788 | + searcher_methods!(forward); |
| 789 | +} |
| 790 | + |
| 791 | +unsafe impl<'a, 'b, const N: usize> ReverseSearcher<'a> for CharArraySearcher<'a, 'b, N> { |
| 792 | + searcher_methods!(reverse); |
| 793 | +} |
| 794 | + |
755 | 795 | /////////////////////////////////////////////////////////////////////////////
|
756 | 796 | // Impl for &[char]
|
757 | 797 | /////////////////////////////////////////////////////////////////////////////
|
|
0 commit comments