Skip to content

Commit b6cecdd

Browse files
committed
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.
1 parent 1f0757c commit b6cecdd

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

src/libstd/io.rs

+24-5
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,10 @@ fn new_byte_buf_reader(buf: [u8]) -> buf_reader {
242242
ret byte_buf_reader(@{buf: buf, mutable pos: 0u});
243243
}
244244

245+
fn bytes_reader(bytes: [u8]) -> reader {
246+
ret new_reader(new_byte_buf_reader(bytes));
247+
}
248+
245249
fn string_reader(s: str) -> reader {
246250
ret new_reader(new_byte_buf_reader(str::bytes(s)));
247251
}
@@ -426,6 +430,12 @@ fn stderr() -> writer { ret new_writer(fd_buf_writer(2i32, option::none)); }
426430
fn print(s: str) { stdout().write_str(s); }
427431
fn println(s: str) { stdout().write_str(s + "\n"); }
428432

433+
type bytes_writer =
434+
obj {
435+
fn get_writer() -> writer;
436+
fn get_bytes() -> [mutable u8];
437+
};
438+
429439
type str_writer =
430440
obj {
431441
fn get_writer() -> writer;
@@ -466,17 +476,26 @@ obj byte_buf_writer(buf: mutable_byte_buf) {
466476
fn fsync(_level: fsync::level) -> int { ret 0; }
467477
}
468478

469-
fn string_writer() -> str_writer {
479+
fn bytes_writer() -> bytes_writer {
470480
// FIXME: yikes, this is bad. Needs fixing of mutable syntax.
471481

472482
let b: [mutable u8] = [mutable 0u8];
473483
vec::pop(b);
474-
let buf: mutable_byte_buf = @{mutable buf: b, mutable pos: 0u};
475-
obj str_writer_wrap(wr: writer, buf: mutable_byte_buf) {
484+
let buf = @{mutable buf: b, mutable pos: 0u};
485+
obj byte_buf_writer_wrap(wr: writer, buf: mutable_byte_buf) {
476486
fn get_writer() -> writer { ret wr; }
477-
fn get_str() -> str { ret str::unsafe_from_bytes(buf.buf); }
487+
fn get_bytes() -> [mutable u8] { ret buf.buf; }
488+
}
489+
ret byte_buf_writer_wrap(new_writer(byte_buf_writer(buf)), buf);
490+
}
491+
492+
fn string_writer() -> str_writer {
493+
let writer = bytes_writer();
494+
obj str_writer_wrap(wr: bytes_writer) {
495+
fn get_writer() -> writer { wr.get_writer() }
496+
fn get_str() -> str { str::unsafe_from_bytes(wr.get_bytes()) }
478497
}
479-
ret str_writer_wrap(new_writer(byte_buf_writer(buf)), buf);
498+
str_writer_wrap(writer)
480499
}
481500

482501

0 commit comments

Comments
 (0)