Skip to content

Commit 0d24780

Browse files
committed
std: add Reader impl for &[u8]
1 parent 6687b2a commit 0d24780

File tree

6 files changed

+76
-20
lines changed

6 files changed

+76
-20
lines changed

src/libcore/result.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -446,13 +446,12 @@ impl<T, E> Result<T, E> {
446446
/// ```
447447
/// use std::io::{BufReader, IoResult};
448448
///
449-
/// let buffer = "1\n2\n3\n4\n";
450-
/// let mut reader = BufReader::new(buffer.as_bytes());
449+
/// let mut buffer = "1\n2\n3\n4\n";
451450
///
452451
/// let mut sum = 0;
453452
///
454-
/// while !reader.eof() {
455-
/// let line: IoResult<String> = reader.read_line();
453+
/// while !buffer.is_empty() {
454+
/// let line: IoResult<String> = buffer.read_line();
456455
/// // Convert the string line to a number using `map` and `from_str`
457456
/// let val: IoResult<int> = line.map(|line| {
458457
/// from_str::<int>(line.as_slice().trim_right()).unwrap_or(0)

src/libgraphviz/lib.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ mod tests {
547547
use self::NodeLabels::*;
548548
use super::{Id, LabelText, LabelStr, EscStr, Labeller};
549549
use super::{Nodes, Edges, GraphWalk, render};
550-
use std::io::{BufReader, IoResult};
550+
use std::io::IoResult;
551551
use std::str;
552552

553553
/// each node is an index in a vector in the graph.
@@ -698,8 +698,7 @@ mod tests {
698698
fn test_input(g: LabelledGraph) -> IoResult<String> {
699699
let mut writer = Vec::new();
700700
render(&g, &mut writer).unwrap();
701-
let mut r = BufReader::new(writer[]);
702-
r.read_to_string()
701+
(&mut writer.as_slice()).read_to_string()
703702
}
704703

705704
// All of the tests use raw-strings as the format for the expected outputs,
@@ -811,8 +810,7 @@ r#"digraph hasse_diagram {
811810
edge(1, 3, ";"), edge(2, 3, ";" )));
812811

813812
render(&g, &mut writer).unwrap();
814-
let mut r = BufReader::new(writer[]);
815-
let r = r.read_to_string();
813+
let r = (&mut writer.as_slice()).read_to_string();
816814

817815
assert_eq!(r.unwrap().as_slice(),
818816
r#"digraph syntax_tree {

src/libstd/io/buffered.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ mod test {
406406
use prelude::*;
407407
use super::*;
408408
use super::super::{IoResult, EndOfFile};
409-
use super::super::mem::{MemReader, BufReader};
409+
use super::super::mem::MemReader;
410410
use self::test::Bencher;
411411
use str::StrPrelude;
412412

@@ -626,14 +626,14 @@ mod test {
626626
#[test]
627627
fn read_char_buffered() {
628628
let buf = [195u8, 159u8];
629-
let mut reader = BufferedReader::with_capacity(1, BufReader::new(&buf));
629+
let mut reader = BufferedReader::with_capacity(1, buf[]);
630630
assert_eq!(reader.read_char(), Ok('ß'));
631631
}
632632

633633
#[test]
634634
fn test_chars() {
635635
let buf = [195u8, 159u8, b'a'];
636-
let mut reader = BufferedReader::with_capacity(1, BufReader::new(&buf));
636+
let mut reader = BufferedReader::with_capacity(1, buf[]);
637637
let mut it = reader.chars();
638638
assert_eq!(it.next(), Some(Ok('ß')));
639639
assert_eq!(it.next(), Some(Ok('a')));

src/libstd/io/mem.rs

+61
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,41 @@ impl Buffer for MemReader {
206206
fn consume(&mut self, amt: uint) { self.pos += amt; }
207207
}
208208

209+
impl<'a> Reader for &'a [u8] {
210+
#[inline]
211+
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
212+
if self.is_empty() { return Err(io::standard_error(io::EndOfFile)); }
213+
214+
let write_len = min(buf.len(), self.len());
215+
{
216+
let input = self[..write_len];
217+
let output = buf[mut ..write_len];
218+
slice::bytes::copy_memory(output, input);
219+
}
220+
221+
*self = self.slice_from(write_len);
222+
223+
Ok(write_len)
224+
}
225+
}
226+
227+
impl<'a> Buffer for &'a [u8] {
228+
#[inline]
229+
fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
230+
if self.is_empty() {
231+
Err(io::standard_error(io::EndOfFile))
232+
} else {
233+
Ok(*self)
234+
}
235+
}
236+
237+
#[inline]
238+
fn consume(&mut self, amt: uint) {
239+
*self = self[amt..];
240+
}
241+
}
242+
243+
209244
/// Writes to a fixed-size byte slice
210245
///
211246
/// If a write will not fit in the buffer, it returns an error and does not
@@ -469,6 +504,32 @@ mod test {
469504
assert!(reader.read(&mut buf).is_err());
470505
}
471506

507+
#[test]
508+
fn test_slice_reader() {
509+
let in_buf = vec![0, 1, 2, 3, 4, 5, 6, 7];
510+
let mut reader = &mut in_buf.as_slice();
511+
let mut buf = [];
512+
assert_eq!(reader.read(&mut buf), Ok(0));
513+
let mut buf = [0];
514+
assert_eq!(reader.read(&mut buf), Ok(1));
515+
assert_eq!(reader.len(), 7);
516+
let b: &[_] = &[0];
517+
assert_eq!(buf.as_slice(), b);
518+
let mut buf = [0, ..4];
519+
assert_eq!(reader.read(&mut buf), Ok(4));
520+
assert_eq!(reader.len(), 3);
521+
let b: &[_] = &[1, 2, 3, 4];
522+
assert_eq!(buf.as_slice(), b);
523+
assert_eq!(reader.read(&mut buf), Ok(3));
524+
let b: &[_] = &[5, 6, 7];
525+
assert_eq!(buf[0..3], b);
526+
assert!(reader.read(&mut buf).is_err());
527+
let mut reader = &mut in_buf.as_slice();
528+
assert_eq!(reader.read_until(3).unwrap(), vec!(0, 1, 2, 3));
529+
assert_eq!(reader.read_until(3).unwrap(), vec!(4, 5, 6, 7));
530+
assert!(reader.read(&mut buf).is_err());
531+
}
532+
472533
#[test]
473534
fn test_buf_reader() {
474535
let in_buf = vec![0, 1, 2, 3, 4, 5, 6, 7];

src/libstd/io/util.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ impl<T: Iterator<u8>> Reader for IterReader<T> {
273273

274274
#[cfg(test)]
275275
mod test {
276-
use io::{MemReader, BufReader, ByRefReader};
276+
use io::{MemReader, ByRefReader};
277277
use io;
278278
use boxed::Box;
279279
use super::*;
@@ -395,8 +395,7 @@ mod test {
395395

396396
#[test]
397397
fn limit_reader_buffer() {
398-
let data = "0123456789\n0123456789\n";
399-
let mut r = BufReader::new(data.as_bytes());
398+
let r = &mut b"0123456789\n0123456789\n";
400399
{
401400
let mut r = LimitReader::new(r.by_ref(), 3);
402401
assert_eq!(r.read_line(), Ok("012".to_string()));

src/libtime/lib.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ use self::Fmt::*;
3232

3333
use std::fmt::Show;
3434
use std::fmt;
35-
use std::io::BufReader;
3635
use std::num::SignedInt;
3736
use std::string::String;
3837
use std::time::Duration;
@@ -1187,7 +1186,7 @@ pub fn strptime(s: &str, format: &str) -> Result<Tm, ParseError> {
11871186
}
11881187
}
11891188

1190-
let mut rdr = BufReader::new(format.as_bytes());
1189+
let mut rdr: &[u8] = format.as_bytes();
11911190
let mut tm = Tm {
11921191
tm_sec: 0_i32,
11931192
tm_min: 0_i32,
@@ -1211,13 +1210,13 @@ pub fn strptime(s: &str, format: &str) -> Result<Tm, ParseError> {
12111210
let next = range.next;
12121211

12131212
let mut buf = [0];
1214-
let c = match rdr.read(&mut buf) {
1213+
let c = match (&mut rdr).read(&mut buf) {
12151214
Ok(..) => buf[0] as char,
12161215
Err(..) => break
12171216
};
12181217
match c {
12191218
'%' => {
1220-
let ch = match rdr.read(&mut buf) {
1219+
let ch = match (&mut rdr).read(&mut buf) {
12211220
Ok(..) => buf[0] as char,
12221221
Err(..) => break
12231222
};
@@ -1233,7 +1232,7 @@ pub fn strptime(s: &str, format: &str) -> Result<Tm, ParseError> {
12331232
}
12341233
}
12351234

1236-
if pos == len && rdr.tell().unwrap() == format.len() as u64 {
1235+
if pos == len && (&mut rdr).is_empty() {
12371236
Ok(Tm {
12381237
tm_sec: tm.tm_sec,
12391238
tm_min: tm.tm_min,

0 commit comments

Comments
 (0)