std: add a io::with_str_reader fn to remove a str copy
This commit is contained in:
parent
5812bebf87
commit
1404a864a4
2 changed files with 25 additions and 8 deletions
|
@ -227,11 +227,11 @@ fn file_reader(path: str) -> result::t<reader, str> {
|
|||
// Byte buffer readers
|
||||
|
||||
// TODO: const u8, but this fails with rustboot.
|
||||
type byte_buf = {buf: [u8], mutable pos: uint};
|
||||
type byte_buf = {buf: [u8], mutable pos: uint, len: uint};
|
||||
|
||||
impl of reader for byte_buf {
|
||||
fn read_bytes(len: uint) -> [u8] {
|
||||
let rest = vec::len(self.buf) - self.pos;
|
||||
let rest = self.len - self.pos;
|
||||
let to_read = len;
|
||||
if rest < to_read { to_read = rest; }
|
||||
let range = vec::slice(self.buf, self.pos, self.pos + to_read);
|
||||
|
@ -239,29 +239,46 @@ impl of reader for byte_buf {
|
|||
ret range;
|
||||
}
|
||||
fn read_byte() -> int {
|
||||
if self.pos == vec::len(self.buf) { ret -1; }
|
||||
if self.pos == self.len { ret -1; }
|
||||
let b = self.buf[self.pos];
|
||||
self.pos += 1u;
|
||||
ret b as int;
|
||||
}
|
||||
fn unread_byte(_byte: int) { #error("TODO: unread_byte"); fail; }
|
||||
fn eof() -> bool { self.pos == vec::len(self.buf) }
|
||||
fn eof() -> bool { self.pos == self.len }
|
||||
fn seek(offset: int, whence: seek_style) {
|
||||
let pos = self.pos;
|
||||
let len = vec::len(self.buf);
|
||||
self.pos = seek_in_buf(offset, pos, len, whence);
|
||||
self.pos = seek_in_buf(offset, pos, self.len, whence);
|
||||
}
|
||||
fn tell() -> uint { self.pos }
|
||||
}
|
||||
|
||||
fn bytes_reader(bytes: [u8]) -> reader {
|
||||
{buf: bytes, mutable pos: 0u} as reader
|
||||
bytes_reader_between(bytes, 0u, vec::len(bytes))
|
||||
}
|
||||
|
||||
fn bytes_reader_between(bytes: [u8], start: uint, end: uint) -> reader {
|
||||
{buf: bytes, mutable pos: start, len: end} as reader
|
||||
}
|
||||
|
||||
fn with_bytes_reader<t>(bytes: [u8], f: fn(reader) -> t) -> t {
|
||||
f(bytes_reader(bytes))
|
||||
}
|
||||
|
||||
fn with_bytes_reader_between<t>(bytes: [u8], start: uint, end: uint,
|
||||
f: fn(reader) -> t) -> t {
|
||||
f(bytes_reader_between(bytes, start, end))
|
||||
}
|
||||
|
||||
fn string_reader(s: str) -> reader {
|
||||
bytes_reader(str::bytes(s))
|
||||
}
|
||||
|
||||
fn with_str_reader<T>(s: str, f: fn(reader) -> T) -> T {
|
||||
str::as_bytes(s) { |bytes|
|
||||
with_bytes_reader_between(bytes, 0u, str::len(s), f)
|
||||
}
|
||||
}
|
||||
|
||||
// Writing
|
||||
enum fileflag { append, create, truncate, no_flag, }
|
||||
|
|
|
@ -490,7 +490,7 @@ Function: from_str
|
|||
Deserializes a json value from a string.
|
||||
*/
|
||||
fn from_str(s: str) -> result::t<json, error> {
|
||||
from_reader(io::string_reader(s))
|
||||
io::with_str_reader(s, from_reader)
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue