1- //
2- // Original implementation taken from rust-memchr
1+ // Original implementation taken from rust-memchr.
32// Copyright 2015 Andrew Gallant, bluss and Nicolas Koch
43
54use cmp;
@@ -8,13 +7,13 @@ use mem;
87const LO_U64 : u64 = 0x0101010101010101 ;
98const HI_U64 : u64 = 0x8080808080808080 ;
109
11- // use truncation
10+ // Use truncation.
1211const LO_USIZE : usize = LO_U64 as usize ;
1312const HI_USIZE : usize = HI_U64 as usize ;
1413
15- /// Return `true` if `x` contains any zero byte.
14+ /// Returns whether `x` contains any zero byte.
1615///
17- /// From *Matters Computational*, J. Arndt
16+ /// From *Matters Computational*, J. Arndt:
1817///
1918/// "The idea is to subtract one from each of the bytes and then look for
2019/// bytes where the borrow propagated all the way to the most significant
@@ -36,7 +35,7 @@ fn repeat_byte(b: u8) -> usize {
3635 ( b as usize ) * ( :: usize:: MAX / 255 )
3736}
3837
39- /// Return the first index matching the byte `x` in `text`.
38+ /// Returns the first index matching the byte `x` in `text`.
4039pub fn memchr ( x : u8 , text : & [ u8 ] ) -> Option < usize > {
4140 // Scan for a single byte value by reading two `usize` words at a time.
4241 //
@@ -77,18 +76,18 @@ pub fn memchr(x: u8, text: &[u8]) -> Option<usize> {
7776 }
7877 }
7978
80- // find the byte after the point the body loop stopped
79+ // Find the byte after the point the body loop stopped.
8180 text[ offset..] . iter ( ) . position ( |elt| * elt == x) . map ( |i| offset + i)
8281}
8382
84- /// Return the last index matching the byte `x` in `text`.
83+ /// Returns the last index matching the byte `x` in `text`.
8584pub fn memrchr ( x : u8 , text : & [ u8 ] ) -> Option < usize > {
8685 // Scan for a single byte value by reading two `usize` words at a time.
8786 //
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.
9291 let len = text. len ( ) ;
9392 let ptr = text. as_ptr ( ) ;
9493 type Chunk = usize ;
@@ -105,7 +104,7 @@ pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
105104 return Some ( offset + index) ;
106105 }
107106
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.
109108 // offset is always aligned, so just testing `>` is sufficient and avoids possible
110109 // overflow.
111110 let repeated_x = repeat_byte ( x) ;
@@ -116,7 +115,7 @@ pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
116115 let u = * ( ptr. offset ( offset as isize - 2 * chunk_bytes as isize ) as * const Chunk ) ;
117116 let v = * ( ptr. offset ( offset as isize - chunk_bytes as isize ) as * const Chunk ) ;
118117
119- // break if there is a matching byte
118+ // Break if there is a matching byte.
120119 let zu = contains_zero_byte ( u ^ repeated_x) ;
121120 let zv = contains_zero_byte ( v ^ repeated_x) ;
122121 if zu || zv {
@@ -126,6 +125,6 @@ pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
126125 offset -= 2 * chunk_bytes;
127126 }
128127
129- // find the byte before the point the body loop stopped
128+ // Find the byte before the point the body loop stopped.
130129 text[ ..offset] . iter ( ) . rposition ( |elt| * elt == x)
131130}
0 commit comments