1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 原始实现来自 rust-memchr。
// 版权所有 2015 Andrew Gallant,bluss 和 Nicolas Koch

use crate::sys::memchr as sys;

#[cfg(test)]
mod tests;

/// `memchr` 的安全接口。
///
/// 返回与 `haystack` 中首次出现的 `needle` 对应的索引,如果找不到 `None`,则返回 `None`。
///
/// memchr 可以以比 `haystack.iter().position(|&b| b == needle)` 快大约一个数量级的速度还原为超级优化的机器代码。
///
/// (请参见基准测试。)
///
/// # Examples
///
/// 这显示了如何在字节字符串中找到字节的第一个位置。
///
/// ```ignore (cannot-doctest-private-modules)
/// use memchr::memchr;
///
/// let haystack = b"the quick brown fox";
/// assert_eq!(memchr(b'k', haystack), Some(8));
/// ```
///
#[inline]
pub fn memchr(needle: u8, haystack: &[u8]) -> Option<usize> {
    sys::memchr(needle, haystack)
}

/// `memrchr` 的安全接口。
///
/// 返回与 `haystack` 中最后一次出现的 `needle` 对应的索引,如果未找到,则返回 `None`。
///
///
/// # Examples
///
/// 这显示了如何在字节字符串中找到字节的最后位置。
///
/// ```ignore (cannot-doctest-private-modules)
/// use memchr::memrchr;
///
/// let haystack = b"the quick brown fox";
/// assert_eq!(memrchr(b'o', haystack), Some(17));
/// ```
#[inline]
pub fn memrchr(needle: u8, haystack: &[u8]) -> Option<usize> {
    sys::memrchr(needle, haystack)
}