1
- //
2
- // Original implementation taken from rust-memchr
1
+ // Original implementation taken from rust-memchr.
3
2
// Copyright 2015 Andrew Gallant, bluss and Nicolas Koch
4
3
5
4
use cmp;
@@ -8,13 +7,13 @@ use mem;
8
7
const LO_U64 : u64 = 0x0101010101010101 ;
9
8
const HI_U64 : u64 = 0x8080808080808080 ;
10
9
11
- // use truncation
10
+ // Use truncation.
12
11
const LO_USIZE : usize = LO_U64 as usize ;
13
12
const HI_USIZE : usize = HI_U64 as usize ;
14
13
15
- /// Return `true` if `x` contains any zero byte.
14
+ /// Returns whether `x` contains any zero byte.
16
15
///
17
- /// From *Matters Computational*, J. Arndt
16
+ /// From *Matters Computational*, J. Arndt:
18
17
///
19
18
/// "The idea is to subtract one from each of the bytes and then look for
20
19
/// bytes where the borrow propagated all the way to the most significant
@@ -36,7 +35,7 @@ fn repeat_byte(b: u8) -> usize {
36
35
( b as usize ) * ( :: usize:: MAX / 255 )
37
36
}
38
37
39
- /// Return the first index matching the byte `x` in `text`.
38
+ /// Returns the first index matching the byte `x` in `text`.
40
39
pub fn memchr ( x : u8 , text : & [ u8 ] ) -> Option < usize > {
41
40
// Scan for a single byte value by reading two `usize` words at a time.
42
41
//
@@ -77,18 +76,18 @@ pub fn memchr(x: u8, text: &[u8]) -> Option<usize> {
77
76
}
78
77
}
79
78
80
- // find the byte after the point the body loop stopped
79
+ // Find the byte after the point the body loop stopped.
81
80
text[ offset..] . iter ( ) . position ( |elt| * elt == x) . map ( |i| offset + i)
82
81
}
83
82
84
- /// Return the last index matching the byte `x` in `text`.
83
+ /// Returns the last index matching the byte `x` in `text`.
85
84
pub fn memrchr ( x : u8 , text : & [ u8 ] ) -> Option < usize > {
86
85
// Scan for a single byte value by reading two `usize` words at a time.
87
86
//
88
- // Split `text` in three parts
89
- // - unaligned tail, after the last word aligned address in text
90
- // - body, scan by 2 words at a time
91
- // - the first remaining bytes, < 2 word size
87
+ // Split `text` in three parts:
88
+ // - unaligned tail, after the last word aligned address in text,
89
+ // - body, scanned by 2 words at a time,
90
+ // - the first remaining bytes, < 2 word size.
92
91
let len = text. len ( ) ;
93
92
let ptr = text. as_ptr ( ) ;
94
93
type Chunk = usize ;
@@ -105,7 +104,7 @@ pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
105
104
return Some ( offset + index) ;
106
105
}
107
106
108
- // search the body of the text, make sure we don't cross min_aligned_offset.
107
+ // Search the body of the text, make sure we don't cross min_aligned_offset.
109
108
// offset is always aligned, so just testing `>` is sufficient and avoids possible
110
109
// overflow.
111
110
let repeated_x = repeat_byte ( x) ;
@@ -116,7 +115,7 @@ pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
116
115
let u = * ( ptr. offset ( offset as isize - 2 * chunk_bytes as isize ) as * const Chunk ) ;
117
116
let v = * ( ptr. offset ( offset as isize - chunk_bytes as isize ) as * const Chunk ) ;
118
117
119
- // break if there is a matching byte
118
+ // Break if there is a matching byte.
120
119
let zu = contains_zero_byte ( u ^ repeated_x) ;
121
120
let zv = contains_zero_byte ( v ^ repeated_x) ;
122
121
if zu || zv {
@@ -126,6 +125,6 @@ pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
126
125
offset -= 2 * chunk_bytes;
127
126
}
128
127
129
- // find the byte before the point the body loop stopped
128
+ // Find the byte before the point the body loop stopped.
130
129
text[ ..offset] . iter ( ) . rposition ( |elt| * elt == x)
131
130
}
0 commit comments