1use memchr::{memrchr, memrchr2, memrchr3, Memchr, Memchr2, Memchr3};
2
3use crate::memchr::{c, fallback, naive};
4
5pub fn memchr1_count(b1: u8, haystack: &[u8]) -> usize {
6    Memchr::new(b1, haystack).count()
7}
8
9pub fn memchr1_libc_count(b1: u8, haystack: &[u8]) -> usize {
10    let mut count = 0;
11    let mut start = 0;
12    while let Some(i) = c::memchr(b1, &haystack[start..]) {
13        count += 1;
14        start += i + 1;
15    }
16    count
17}
18
19pub fn fallback1_count(b1: u8, haystack: &[u8]) -> usize {
20    let mut count = 0;
21    let mut start = 0;
22    while let Some(i) = fallback::memchr(b1, &haystack[start..]) {
23        count += 1;
24        start += i + 1;
25    }
26    count
27}
28
29pub fn naive1_count(b1: u8, haystack: &[u8]) -> usize {
30    let mut count = 0;
31    let mut start = 0;
32    while let Some(i) = naive::memchr(b1, &haystack[start..]) {
33        count += 1;
34        start += i + 1;
35    }
36    count
37}
38
39pub fn memchr2_count(b1: u8, b2: u8, haystack: &[u8]) -> usize {
40    Memchr2::new(b1, b2, haystack).count()
41}
42
43pub fn fallback2_count(b1: u8, b2: u8, haystack: &[u8]) -> usize {
44    let mut count = 0;
45    let mut start = 0;
46    while let Some(i) = fallback::memchr2(b1, b2, &haystack[start..]) {
47        count += 1;
48        start += i + 1;
49    }
50    count
51}
52
53pub fn naive2_count(b1: u8, b2: u8, haystack: &[u8]) -> usize {
54    let mut count = 0;
55    let mut start = 0;
56    while let Some(i) = naive::memchr2(b1, b2, &haystack[start..]) {
57        count += 1;
58        start += i + 1;
59    }
60    count
61}
62
63pub fn memchr3_count(b1: u8, b2: u8, b3: u8, haystack: &[u8]) -> usize {
64    Memchr3::new(b1, b2, b3, haystack).count()
65}
66
67pub fn fallback3_count(b1: u8, b2: u8, b3: u8, haystack: &[u8]) -> usize {
68    let mut count = 0;
69    let mut start = 0;
70    while let Some(i) = fallback::memchr3(b1, b2, b3, &haystack[start..]) {
71        count += 1;
72        start += i + 1;
73    }
74    count
75}
76
77pub fn naive3_count(b1: u8, b2: u8, b3: u8, haystack: &[u8]) -> usize {
78    let mut count = 0;
79    let mut start = 0;
80    while let Some(i) = naive::memchr3(b1, b2, b3, &haystack[start..]) {
81        count += 1;
82        start += i + 1;
83    }
84    count
85}
86
87pub fn memrchr1_count(b1: u8, haystack: &[u8]) -> usize {
88    let mut count = 0;
89    let mut end = haystack.len();
90    while let Some(i) = memrchr(b1, &haystack[..end]) {
91        count += 1;
92        end = i;
93    }
94    count
95}
96
97#[cfg(all(target_os = "linux"))]
98pub fn memrchr1_libc_count(b1: u8, haystack: &[u8]) -> usize {
99    let mut count = 0;
100    let mut end = haystack.len();
101    while let Some(i) = c::memrchr(b1, &haystack[..end]) {
102        count += 1;
103        end = i;
104    }
105    count
106}
107
108pub fn memrchr2_count(b1: u8, b2: u8, haystack: &[u8]) -> usize {
109    let mut count = 0;
110    let mut end = haystack.len();
111    while let Some(i) = memrchr2(b1, b2, &haystack[..end]) {
112        count += 1;
113        end = i;
114    }
115    count
116}
117
118pub fn memrchr3_count(b1: u8, b2: u8, b3: u8, haystack: &[u8]) -> usize {
119    let mut count = 0;
120    let mut end = haystack.len();
121    while let Some(i) = memrchr3(b1, b2, b3, &haystack[..end]) {
122        count += 1;
123        end = i;
124    }
125    count
126}
127