|
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,20 @@ 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 | + |
| 618 | +impl<const N: usize> MultiCharEq for &[char; N] { |
| 619 | + #[inline] |
| 620 | + fn matches(&mut self, c: char) -> bool { |
| 621 | + self.iter().any(|&m| m == c) |
| 622 | + } |
| 623 | +} |
| 624 | + |
604 | 625 | impl MultiCharEq for &[char] {
|
605 | 626 | #[inline]
|
606 | 627 | fn matches(&mut self, c: char) -> bool {
|
@@ -752,6 +773,58 @@ macro_rules! searcher_methods {
|
752 | 773 | };
|
753 | 774 | }
|
754 | 775 |
|
| 776 | +/// Associated type for `<[char; N] as Pattern<'a>>::Searcher`. |
| 777 | +#[derive(Clone, Debug)] |
| 778 | +pub struct CharArraySearcher<'a, const N: usize>( |
| 779 | + <MultiCharEqPattern<[char; N]> as Pattern<'a>>::Searcher, |
| 780 | +); |
| 781 | + |
| 782 | +/// Associated type for `<&[char; N] as Pattern<'a>>::Searcher`. |
| 783 | +#[derive(Clone, Debug)] |
| 784 | +pub struct CharArrayRefSearcher<'a, 'b, const N: usize>( |
| 785 | + <MultiCharEqPattern<&'b [char; N]> as Pattern<'a>>::Searcher, |
| 786 | +); |
| 787 | + |
| 788 | +/// Searches for chars that are equal to any of the [`char`]s in the array. |
| 789 | +/// |
| 790 | +/// # Examples |
| 791 | +/// |
| 792 | +/// ``` |
| 793 | +/// assert_eq!("Hello world".find(['l', 'l']), Some(2)); |
| 794 | +/// assert_eq!("Hello world".find(['l', 'l']), Some(2)); |
| 795 | +/// ``` |
| 796 | +impl<'a, const N: usize> Pattern<'a> for [char; N] { |
| 797 | + pattern_methods!(CharArraySearcher<'a, N>, MultiCharEqPattern, CharArraySearcher); |
| 798 | +} |
| 799 | + |
| 800 | +unsafe impl<'a, const N: usize> Searcher<'a> for CharArraySearcher<'a, N> { |
| 801 | + searcher_methods!(forward); |
| 802 | +} |
| 803 | + |
| 804 | +unsafe impl<'a, const N: usize> ReverseSearcher<'a> for CharArraySearcher<'a, N> { |
| 805 | + searcher_methods!(reverse); |
| 806 | +} |
| 807 | + |
| 808 | +/// Searches for chars that are equal to any of the [`char`]s in the array. |
| 809 | +/// |
| 810 | +/// # Examples |
| 811 | +/// |
| 812 | +/// ``` |
| 813 | +/// assert_eq!("Hello world".find(&['l', 'l']), Some(2)); |
| 814 | +/// assert_eq!("Hello world".find(&['l', 'l']), Some(2)); |
| 815 | +/// ``` |
| 816 | +impl<'a, 'b, const N: usize> Pattern<'a> for &'b [char; N] { |
| 817 | + pattern_methods!(CharArrayRefSearcher<'a, 'b, N>, MultiCharEqPattern, CharArrayRefSearcher); |
| 818 | +} |
| 819 | + |
| 820 | +unsafe impl<'a, 'b, const N: usize> Searcher<'a> for CharArrayRefSearcher<'a, 'b, N> { |
| 821 | + searcher_methods!(forward); |
| 822 | +} |
| 823 | + |
| 824 | +unsafe impl<'a, 'b, const N: usize> ReverseSearcher<'a> for CharArrayRefSearcher<'a, 'b, N> { |
| 825 | + searcher_methods!(reverse); |
| 826 | +} |
| 827 | + |
755 | 828 | /////////////////////////////////////////////////////////////////////////////
|
756 | 829 | // Impl for &[char]
|
757 | 830 | /////////////////////////////////////////////////////////////////////////////
|
|
0 commit comments