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
|
// Byte buffer readers
|
||||||
|
|
||||||
// TODO: const u8, but this fails with rustboot.
|
// 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 {
|
impl of reader for byte_buf {
|
||||||
fn read_bytes(len: uint) -> [u8] {
|
fn read_bytes(len: uint) -> [u8] {
|
||||||
let rest = vec::len(self.buf) - self.pos;
|
let rest = self.len - self.pos;
|
||||||
let to_read = len;
|
let to_read = len;
|
||||||
if rest < to_read { to_read = rest; }
|
if rest < to_read { to_read = rest; }
|
||||||
let range = vec::slice(self.buf, self.pos, self.pos + to_read);
|
let range = vec::slice(self.buf, self.pos, self.pos + to_read);
|
||||||
|
@ -239,29 +239,46 @@ impl of reader for byte_buf {
|
||||||
ret range;
|
ret range;
|
||||||
}
|
}
|
||||||
fn read_byte() -> int {
|
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];
|
let b = self.buf[self.pos];
|
||||||
self.pos += 1u;
|
self.pos += 1u;
|
||||||
ret b as int;
|
ret b as int;
|
||||||
}
|
}
|
||||||
fn unread_byte(_byte: int) { #error("TODO: unread_byte"); fail; }
|
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) {
|
fn seek(offset: int, whence: seek_style) {
|
||||||
let pos = self.pos;
|
let pos = self.pos;
|
||||||
let len = vec::len(self.buf);
|
self.pos = seek_in_buf(offset, pos, self.len, whence);
|
||||||
self.pos = seek_in_buf(offset, pos, len, whence);
|
|
||||||
}
|
}
|
||||||
fn tell() -> uint { self.pos }
|
fn tell() -> uint { self.pos }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bytes_reader(bytes: [u8]) -> reader {
|
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 {
|
fn string_reader(s: str) -> reader {
|
||||||
bytes_reader(str::bytes(s))
|
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
|
// Writing
|
||||||
enum fileflag { append, create, truncate, no_flag, }
|
enum fileflag { append, create, truncate, no_flag, }
|
||||||
|
|
|
@ -490,7 +490,7 @@ Function: from_str
|
||||||
Deserializes a json value from a string.
|
Deserializes a json value from a string.
|
||||||
*/
|
*/
|
||||||
fn from_str(s: str) -> result::t<json, error> {
|
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