Coverage Report

Created: 2026-02-14 07:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/regex-automata-0.4.14/src/util/memchr.rs
Line
Count
Source
1
/*!
2
This module defines simple wrapper routines for the memchr functions from the
3
`memchr` crate. Basically, when the `memchr` crate is available, we use it,
4
otherwise we use a naive implementation which is still pretty fast.
5
*/
6
7
pub(crate) use self::inner::*;
8
9
#[cfg(feature = "perf-literal-substring")]
10
pub(super) mod inner {
11
    #[cfg_attr(feature = "perf-inline", inline(always))]
12
    pub(crate) fn memchr(n1: u8, haystack: &[u8]) -> Option<usize> {
13
        memchr::memchr(n1, haystack)
14
    }
15
16
    #[cfg_attr(feature = "perf-inline", inline(always))]
17
    pub(crate) fn memchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
18
        memchr::memchr2(n1, n2, haystack)
19
    }
20
21
    #[cfg_attr(feature = "perf-inline", inline(always))]
22
    pub(crate) fn memchr3(
23
        n1: u8,
24
        n2: u8,
25
        n3: u8,
26
        haystack: &[u8],
27
    ) -> Option<usize> {
28
        memchr::memchr3(n1, n2, n3, haystack)
29
    }
30
31
    #[cfg_attr(feature = "perf-inline", inline(always))]
32
    pub(crate) fn memrchr(n1: u8, haystack: &[u8]) -> Option<usize> {
33
        memchr::memrchr(n1, haystack)
34
    }
35
36
    #[cfg_attr(feature = "perf-inline", inline(always))]
37
    pub(crate) fn memrchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
38
        memchr::memrchr2(n1, n2, haystack)
39
    }
40
41
    #[cfg_attr(feature = "perf-inline", inline(always))]
42
    pub(crate) fn memrchr3(
43
        n1: u8,
44
        n2: u8,
45
        n3: u8,
46
        haystack: &[u8],
47
    ) -> Option<usize> {
48
        memchr::memrchr3(n1, n2, n3, haystack)
49
    }
50
}
51
52
#[cfg(not(feature = "perf-literal-substring"))]
53
pub(super) mod inner {
54
    #[cfg_attr(feature = "perf-inline", inline(always))]
55
0
    pub(crate) fn memchr(n1: u8, haystack: &[u8]) -> Option<usize> {
56
0
        haystack.iter().position(|&b| b == n1)
57
0
    }
58
59
    #[cfg_attr(feature = "perf-inline", inline(always))]
60
0
    pub(crate) fn memchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
61
0
        haystack.iter().position(|&b| b == n1 || b == n2)
62
0
    }
63
64
    #[cfg_attr(feature = "perf-inline", inline(always))]
65
0
    pub(crate) fn memchr3(
66
0
        n1: u8,
67
0
        n2: u8,
68
0
        n3: u8,
69
0
        haystack: &[u8],
70
0
    ) -> Option<usize> {
71
0
        haystack.iter().position(|&b| b == n1 || b == n2 || b == n3)
72
0
    }
73
74
    #[cfg_attr(feature = "perf-inline", inline(always))]
75
0
    pub(crate) fn memrchr(n1: u8, haystack: &[u8]) -> Option<usize> {
76
0
        haystack.iter().rposition(|&b| b == n1)
77
0
    }
78
79
    #[cfg_attr(feature = "perf-inline", inline(always))]
80
0
    pub(crate) fn memrchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
81
0
        haystack.iter().rposition(|&b| b == n1 || b == n2)
82
0
    }
83
84
    #[cfg_attr(feature = "perf-inline", inline(always))]
85
0
    pub(crate) fn memrchr3(
86
0
        n1: u8,
87
0
        n2: u8,
88
0
        n3: u8,
89
0
        haystack: &[u8],
90
0
    ) -> Option<usize> {
91
0
        haystack.iter().rposition(|&b| b == n1 || b == n2 || b == n3)
92
0
    }
93
}