1 use std
::str::pattern
::{Pattern, SearchStep, Searcher}
;
3 use crate::re_unicode
::{Matches, Regex}
;
6 pub struct RegexSearcher
<'r
, 't
> {
10 next_match
: Option
<(usize, usize)>,
13 impl<'r
, 't
> Pattern
<'t
> for &'r Regex
{
14 type Searcher
= RegexSearcher
<'r
, 't
>;
16 fn into_searcher(self, haystack
: &'t
str) -> RegexSearcher
<'r
, 't
> {
19 it
: self.find_iter(haystack
),
26 unsafe impl<'r
, 't
> Searcher
<'t
> for RegexSearcher
<'r
, 't
> {
28 fn haystack(&self) -> &'t
str {
33 fn next(&mut self) -> SearchStep
{
34 if let Some((s
, e
)) = self.next_match
{
35 self.next_match
= None
;
36 self.last_step_end
= e
;
37 return SearchStep
::Match(s
, e
);
39 match self.it
.next() {
41 if self.last_step_end
< self.haystack().len() {
42 let last
= self.last_step_end
;
43 self.last_step_end
= self.haystack().len();
44 SearchStep
::Reject(last
, self.haystack().len())
50 let (s
, e
) = (m
.start(), m
.end());
51 if s
== self.last_step_end
{
52 self.last_step_end
= e
;
53 SearchStep
::Match(s
, e
)
55 self.next_match
= Some((s
, e
));
56 let last
= self.last_step_end
;
57 self.last_step_end
= s
;
58 SearchStep
::Reject(last
, s
)