auto merge of #11375 : alexcrichton/rust/issue-11372, r=pcwalton

Closes #11372
This commit is contained in:
bors 2014-01-08 13:36:44 -08:00
commit 9dece60391
2 changed files with 16 additions and 4 deletions

View file

@ -322,7 +322,7 @@ mod test {
use io;
use prelude::*;
use super::*;
use super::super::mem::{MemReader, MemWriter};
use super::super::mem::{MemReader, MemWriter, BufReader};
use Harness = extra::test::BenchHarness;
/// A type, free to create, primarily intended for benchmarking creation of wrappers that, just
@ -526,6 +526,12 @@ mod test {
assert_eq!(reader.read(buf), None);
}
#[test]
fn read_char_buffered() {
let buf = [195u8, 159u8];
let mut reader = BufferedReader::with_capacity(1, BufReader::new(buf));
assert_eq!(reader.read_char(), Some('ß'));
}
#[bench]
fn bench_buffered_reader(bh: &mut Harness) {

View file

@ -1212,9 +1212,15 @@ pub trait Buffer: Reader {
};
if width == 0 { return None } // not uf8
let mut buf = [0, ..4];
match self.read(buf.mut_slice_to(width)) {
Some(n) if n == width => {}
Some(..) | None => return None // read error
{
let mut start = 0;
loop {
match self.read(buf.mut_slice(start, width)) {
Some(n) if n == width - start => break,
Some(n) if n < width - start => { start += n; }
Some(..) | None => return None // read error
}
}
}
match str::from_utf8_opt(buf.slice_to(width)) {
Some(s) => Some(s.char_at(0)),