Skip to content

Commit 8ad12c3

Browse files
committed
Auto merge of #30381 - fhahn:memchr-in-std, r=alexcrichton
This PR adds `memchr`and `memrchr` based on @BurntSushi 's rust-memchr crate to libstd (as discussed in #30151). I've update some places in libstd to use memchr/memrchr, but I am not sure if there are other places where it could be used as well. ref #30076
2 parents 9e27895 + a206e55 commit 8ad12c3

File tree

7 files changed

+397
-5
lines changed

7 files changed

+397
-5
lines changed

src/libstd/ffi/c_str.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use io;
1919
use iter::Iterator;
2020
use libc;
2121
use mem;
22+
use memchr;
2223
use ops::Deref;
2324
use option::Option::{self, Some, None};
2425
use os::raw::c_char;
@@ -188,7 +189,7 @@ impl CString {
188189
}
189190

190191
fn _new(bytes: Vec<u8>) -> Result<CString, NulError> {
191-
match bytes.iter().position(|x| *x == 0) {
192+
match memchr::memchr(0, &bytes) {
192193
Some(i) => Err(NulError(i, bytes)),
193194
None => Ok(unsafe { CString::from_vec_unchecked(bytes) }),
194195
}

src/libstd/io/buffered.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use cmp;
1818
use error;
1919
use fmt;
2020
use io::{self, DEFAULT_BUF_SIZE, Error, ErrorKind, SeekFrom};
21+
use memchr;
2122

2223
/// The `BufReader` struct adds buffering to any reader.
2324
///
@@ -746,7 +747,7 @@ impl<W: Write> LineWriter<W> {
746747
#[stable(feature = "rust1", since = "1.0.0")]
747748
impl<W: Write> Write for LineWriter<W> {
748749
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
749-
match buf.iter().rposition(|b| *b == b'\n') {
750+
match memchr::memrchr(b'\n', buf) {
750751
Some(i) => {
751752
let n = try!(self.inner.write(&buf[..i + 1]));
752753
if n != i + 1 { return Ok(n) }

src/libstd/io/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ use result;
254254
use string::String;
255255
use str;
256256
use vec::Vec;
257+
use memchr;
257258

258259
#[stable(feature = "rust1", since = "1.0.0")]
259260
pub use self::buffered::{BufReader, BufWriter, LineWriter};
@@ -1194,7 +1195,7 @@ fn read_until<R: BufRead + ?Sized>(r: &mut R, delim: u8, buf: &mut Vec<u8>)
11941195
Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
11951196
Err(e) => return Err(e)
11961197
};
1197-
match available.iter().position(|x| *x == delim) {
1198+
match memchr::memchr(delim, available) {
11981199
Some(i) => {
11991200
buf.extend_from_slice(&available[..i + 1]);
12001201
(true, i + 1)

src/libstd/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@
248248
#![feature(link_args)]
249249
#![feature(linkage)]
250250
#![feature(macro_reexport)]
251+
#![feature(num_bits_bytes)]
251252
#![feature(on_unimplemented)]
252253
#![feature(oom)]
253254
#![feature(optin_builtin_traits)]
@@ -429,6 +430,7 @@ pub mod path;
429430
pub mod process;
430431
pub mod sync;
431432
pub mod time;
433+
mod memchr;
432434

433435
#[macro_use]
434436
#[path = "sys/common/mod.rs"] mod sys_common;

0 commit comments

Comments
 (0)