Sha256: 5f37755a7c16902d861377645f57a20314961f86298d4b35ae6e1058ca4e9801

Contents?: true

Size: 1.78 KB

Versions: 22

Compression:

Stored size: 1.78 KB

Contents

use core::str::pattern::{Pattern, SearchStep, Searcher};

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, 't> Pattern<'t> for &'r Regex {
    type Searcher = RegexSearcher<'r, 't>;

    fn into_searcher(self, haystack: &'t str) -> RegexSearcher<'r, 't> {
        RegexSearcher {
            haystack,
            it: self.find_iter(haystack),
            last_step_end: 0,
            next_match: 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)
                }
            }
        }
    }
}

Version data entries

22 entries across 22 versions & 1 rubygems

Version Path
wasmtime-23.0.2 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-22.0.0 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-21.0.1 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-20.0.2 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-20.0.0 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-18.0.3 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-17.0.1 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-17.0.0 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-16.0.0 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-15.0.1 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-15.0.0 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-14.0.4 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-14.0.3 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-14.0.1 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-14.0.0 ./ext/cargo-vendor/regex-1.10.2/src/pattern.rs
wasmtime-13.0.0 ./ext/cargo-vendor/regex-1.9.3/src/pattern.rs
wasmtime-12.0.1 ./ext/cargo-vendor/regex-1.9.3/src/pattern.rs
wasmtime-12.0.0 ./ext/cargo-vendor/regex-1.9.3/src/pattern.rs
wasmtime-11.0.0 ./ext/cargo-vendor/regex-1.9.3/src/pattern.rs
wasmtime-10.0.1 ./ext/cargo-vendor/regex-1.9.3/src/pattern.rs