libstd: add bytes_reader and bytes_writer

This parallels nicely with string_reader and string_writer, but
working with raw byte strings. I'm not quite sure if the return
type for bytes_writer.get_bytes should be [u8] or [mutable u8]
though, so I'm arbitrarily picking mutable for now.
This commit is contained in:
Erick Tryzelaar
2011-12-28 00:30:04 -08:00
parent 1f0757c684
commit b6cecdd4de
+24 -5
View File
@@ -242,6 +242,10 @@ fn new_byte_buf_reader(buf: [u8]) -> buf_reader {
ret byte_buf_reader(@{buf: buf, mutable pos: 0u});
}
fn bytes_reader(bytes: [u8]) -> reader {
ret new_reader(new_byte_buf_reader(bytes));
}
fn string_reader(s: str) -> reader {
ret new_reader(new_byte_buf_reader(str::bytes(s)));
}
@@ -426,6 +430,12 @@ fn buffered_file_buf_writer(path: str) -> result::t<buf_writer, str> {
fn print(s: str) { stdout().write_str(s); }
fn println(s: str) { stdout().write_str(s + "\n"); }
type bytes_writer =
obj {
fn get_writer() -> writer;
fn get_bytes() -> [mutable u8];
};
type str_writer =
obj {
fn get_writer() -> writer;
@@ -466,17 +476,26 @@ fn seek(offset: int, whence: seek_style) {
fn fsync(_level: fsync::level) -> int { ret 0; }
}
fn string_writer() -> str_writer {
fn bytes_writer() -> bytes_writer {
// FIXME: yikes, this is bad. Needs fixing of mutable syntax.
let b: [mutable u8] = [mutable 0u8];
vec::pop(b);
let buf: mutable_byte_buf = @{mutable buf: b, mutable pos: 0u};
obj str_writer_wrap(wr: writer, buf: mutable_byte_buf) {
let buf = @{mutable buf: b, mutable pos: 0u};
obj byte_buf_writer_wrap(wr: writer, buf: mutable_byte_buf) {
fn get_writer() -> writer { ret wr; }
fn get_str() -> str { ret str::unsafe_from_bytes(buf.buf); }
fn get_bytes() -> [mutable u8] { ret buf.buf; }
}
ret str_writer_wrap(new_writer(byte_buf_writer(buf)), buf);
ret byte_buf_writer_wrap(new_writer(byte_buf_writer(buf)), buf);
}
fn string_writer() -> str_writer {
let writer = bytes_writer();
obj str_writer_wrap(wr: bytes_writer) {
fn get_writer() -> writer { wr.get_writer() }
fn get_str() -> str { str::unsafe_from_bytes(wr.get_bytes()) }
}
str_writer_wrap(writer)
}