build(rust): vendor googletest crate
This commit was merged in pull request #76.
This commit is contained in:
67
third_party/crates/regex-1.13.1/src/pattern.rs
vendored
Normal file
67
third_party/crates/regex-1.13.1/src/pattern.rs
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
use core::str::pattern::{Pattern, SearchStep, Searcher, Utf8Pattern};
|
||||
|
||||
use crate::{Matches, Regex};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct RegexSearcher<'r, 't> {
|
||||
haystack: &'t str,
|
||||
it: Matches<'r, 't>,
|
||||
last_step_end: usize,
|
||||
next_match: Option<(usize, usize)>,
|
||||
}
|
||||
|
||||
impl<'r> Pattern for &'r Regex {
|
||||
type Searcher<'t> = RegexSearcher<'r, 't>;
|
||||
|
||||
fn into_searcher<'t>(self, haystack: &'t str) -> RegexSearcher<'r, 't> {
|
||||
RegexSearcher {
|
||||
haystack,
|
||||
it: self.find_iter(haystack),
|
||||
last_step_end: 0,
|
||||
next_match: None,
|
||||
}
|
||||
}
|
||||
|
||||
fn as_utf8_pattern<'p>(&'p self) -> Option<Utf8Pattern<'p>> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl<'r, 't> Searcher<'t> for RegexSearcher<'r, 't> {
|
||||
#[inline]
|
||||
fn haystack(&self) -> &'t str {
|
||||
self.haystack
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn next(&mut self) -> SearchStep {
|
||||
if let Some((s, e)) = self.next_match {
|
||||
self.next_match = None;
|
||||
self.last_step_end = e;
|
||||
return SearchStep::Match(s, e);
|
||||
}
|
||||
match self.it.next() {
|
||||
None => {
|
||||
if self.last_step_end < self.haystack().len() {
|
||||
let last = self.last_step_end;
|
||||
self.last_step_end = self.haystack().len();
|
||||
SearchStep::Reject(last, self.haystack().len())
|
||||
} else {
|
||||
SearchStep::Done
|
||||
}
|
||||
}
|
||||
Some(m) => {
|
||||
let (s, e) = (m.start(), m.end());
|
||||
if s == self.last_step_end {
|
||||
self.last_step_end = e;
|
||||
SearchStep::Match(s, e)
|
||||
} else {
|
||||
self.next_match = Some((s, e));
|
||||
let last = self.last_step_end;
|
||||
self.last_step_end = s;
|
||||
SearchStep::Reject(last, s)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user