Remove the io::Decorator trait

This is just an unnecessary trait that no one's ever going to parameterize over
and it's more useful to just define the methods directly on the types
themselves. The implementors of this type almost always don't want
inner_mut_ref() but they're forced to define it as well.
This commit is contained in:
Alex Crichton 2014-01-07 20:05:33 -08:00
parent 7613b15fdb
commit 6df57ec2e2
25 changed files with 145 additions and 247 deletions

View File

@ -935,7 +935,6 @@ mod tests {
use serialize::Encodable; use serialize::Encodable;
use serialize; use serialize;
use std::io::Decorator;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::option::{None, Option, Some}; use std::option::{None, Option, Some};
@ -948,7 +947,7 @@ mod tests {
let mut ebml_w = writer::Encoder(&mut wr); let mut ebml_w = writer::Encoder(&mut wr);
v.encode(&mut ebml_w); v.encode(&mut ebml_w);
} }
let ebml_doc = reader::Doc(*wr.inner_ref()); let ebml_doc = reader::Doc(wr.get_ref());
let mut deser = reader::Decoder(ebml_doc); let mut deser = reader::Decoder(ebml_doc);
let v1 = serialize::Decodable::decode(&mut deser); let v1 = serialize::Decodable::decode(&mut deser);
debug!("v1 == {:?}", v1); debug!("v1 == {:?}", v1);

View File

@ -21,7 +21,6 @@ use std::cast::transmute;
use std::f64; use std::f64;
use std::hashmap::HashMap; use std::hashmap::HashMap;
use std::io; use std::io;
use std::io::Decorator;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::num; use std::num;
use std::str; use std::str;
@ -464,7 +463,7 @@ impl Json{
pub fn to_pretty_str(&self) -> ~str { pub fn to_pretty_str(&self) -> ~str {
let mut s = MemWriter::new(); let mut s = MemWriter::new();
self.to_pretty_writer(&mut s as &mut io::Writer); self.to_pretty_writer(&mut s as &mut io::Writer);
str::from_utf8_owned(s.inner()) str::from_utf8_owned(s.unwrap())
} }
} }
@ -1321,7 +1320,7 @@ impl to_str::ToStr for Json {
fn to_str(&self) -> ~str { fn to_str(&self) -> ~str {
let mut s = MemWriter::new(); let mut s = MemWriter::new();
self.to_writer(&mut s as &mut io::Writer); self.to_writer(&mut s as &mut io::Writer);
str::from_utf8_owned(s.inner()) str::from_utf8_owned(s.unwrap())
} }
} }
@ -1508,12 +1507,11 @@ mod tests {
fn with_str_writer(f: |&mut io::Writer|) -> ~str { fn with_str_writer(f: |&mut io::Writer|) -> ~str {
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::io::Decorator;
use std::str; use std::str;
let mut m = MemWriter::new(); let mut m = MemWriter::new();
f(&mut m as &mut io::Writer); f(&mut m as &mut io::Writer);
str::from_utf8_owned(m.inner()) str::from_utf8_owned(m.unwrap())
} }
#[test] #[test]

View File

@ -991,10 +991,9 @@ mod tests {
fn test_boxplot_nonpositive() { fn test_boxplot_nonpositive() {
fn t(s: &Summary, expected: ~str) { fn t(s: &Summary, expected: ~str) {
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::io::Decorator;
let mut m = MemWriter::new(); let mut m = MemWriter::new();
write_boxplot(&mut m as &mut io::Writer, s, 30); write_boxplot(&mut m as &mut io::Writer, s, 30);
let out = str::from_utf8_owned(m.inner()); let out = str::from_utf8_owned(m.unwrap());
assert_eq!(out, expected); assert_eq!(out, expected);
} }

View File

@ -13,8 +13,6 @@
#[allow(missing_doc)]; #[allow(missing_doc)];
use std::io::{Decorator, Writer};
use std::os; use std::os;
use terminfo::*; use terminfo::*;
use terminfo::searcher::open; use terminfo::searcher::open;
@ -234,20 +232,12 @@ impl<T: Writer> Terminal<T> {
color-8 color-8
} else { color } } else { color }
} }
}
impl<T: Writer> Decorator<T> for Terminal<T> { pub fn unwrap(self) -> T { self.out }
fn inner(self) -> T {
self.out
}
fn inner_ref<'a>(&'a self) -> &'a T { pub fn get_ref<'a>(&'a self) -> &'a T { &self.out }
&self.out
}
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut T { pub fn get_mut<'a>(&'a mut self) -> &'a mut T { &mut self.out }
&mut self.out
}
} }
impl<T: Writer> Writer for Terminal<T> { impl<T: Writer> Writer for Terminal<T> {

View File

@ -673,7 +673,6 @@ pub fn run_tests_console(opts: &TestOpts,
#[test] #[test]
fn should_sort_failures_before_printing_them() { fn should_sort_failures_before_printing_them() {
use std::io::Decorator;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::str; use std::str;
@ -705,7 +704,7 @@ fn should_sort_failures_before_printing_them() {
st.write_failures(); st.write_failures();
let s = match st.out { let s = match st.out {
Raw(ref m) => str::from_utf8(*m.inner_ref()), Raw(ref m) => str::from_utf8(m.get_ref()),
Pretty(_) => unreachable!() Pretty(_) => unreachable!()
}; };

View File

@ -522,7 +522,6 @@ mod test {
use std::str; use std::str;
use std::rand; use std::rand;
use std::num::Zero; use std::num::Zero;
use std::io::Decorator;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
#[test] #[test]
@ -798,7 +797,7 @@ mod test {
let u = Uuid::new_v4(); let u = Uuid::new_v4();
let mut wr = MemWriter::new(); let mut wr = MemWriter::new();
u.encode(&mut ebml::writer::Encoder(&mut wr)); u.encode(&mut ebml::writer::Encoder(&mut wr));
let doc = ebml::reader::Doc(wr.inner_ref().as_slice()); let doc = ebml::reader::Doc(wr.get_ref());
let u2 = Decodable::decode(&mut ebml::reader::Decoder(doc)); let u2 = Decodable::decode(&mut ebml::reader::Decoder(doc));
assert_eq!(u, u2); assert_eq!(u, u2);
} }

View File

@ -17,7 +17,7 @@ use arc::{Arc,RWArc};
use treemap::TreeMap; use treemap::TreeMap;
use std::str; use std::str;
use std::io; use std::io;
use std::io::{File, Decorator}; use std::io::File;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
/** /**
@ -261,7 +261,7 @@ fn json_encode<'a, T:Encodable<json::Encoder<'a>>>(t: &T) -> ~str {
let mut writer = MemWriter::new(); let mut writer = MemWriter::new();
let mut encoder = json::Encoder::new(&mut writer as &mut io::Writer); let mut encoder = json::Encoder::new(&mut writer as &mut io::Writer);
t.encode(&mut encoder); t.encode(&mut encoder);
str::from_utf8_owned(writer.inner()) str::from_utf8_owned(writer.unwrap())
} }
// FIXME(#5121) // FIXME(#5121)

View File

@ -25,7 +25,6 @@ use std::cast;
use std::cell::{Cell, RefCell}; use std::cell::{Cell, RefCell};
use std::hashmap::{HashMap, HashSet}; use std::hashmap::{HashMap, HashSet};
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::io::{Writer, Seek, Decorator};
use std::str; use std::str;
use std::vec; use std::vec;
@ -1807,7 +1806,7 @@ pub static metadata_encoding_version : &'static [u8] =
pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] { pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
let mut wr = MemWriter::new(); let mut wr = MemWriter::new();
encode_metadata_inner(&mut wr, parms, crate); encode_metadata_inner(&mut wr, parms, crate);
wr.inner() wr.unwrap()
} }
fn encode_metadata_inner(wr: &mut MemWriter, parms: EncodeParams, crate: &Crate) { fn encode_metadata_inner(wr: &mut MemWriter, parms: EncodeParams, crate: &Crate) {
@ -1900,7 +1899,7 @@ fn encode_metadata_inner(wr: &mut MemWriter, parms: EncodeParams, crate: &Crate)
ecx.stats.total_bytes.set(ebml_w.writer.tell()); ecx.stats.total_bytes.set(ebml_w.writer.tell());
if (tcx.sess.meta_stats()) { if (tcx.sess.meta_stats()) {
for e in ebml_w.writer.inner_ref().iter() { for e in ebml_w.writer.get_ref().iter() {
if *e == 0 { if *e == 0 {
ecx.stats.zero_bytes.set(ecx.stats.zero_bytes.get() + 1); ecx.stats.zero_bytes.set(ecx.stats.zero_bytes.get() + 1);
} }
@ -1930,5 +1929,5 @@ pub fn encoded_ty(tcx: ty::ctxt, t: ty::t) -> ~str {
abbrevs: tyencode::ac_no_abbrevs}; abbrevs: tyencode::ac_no_abbrevs};
let mut wr = MemWriter::new(); let mut wr = MemWriter::new();
tyencode::enc_ty(&mut wr, cx, t); tyencode::enc_ty(&mut wr, cx, t);
str::from_utf8_owned(wr.inner_ref().to_owned()) str::from_utf8_owned(wr.get_ref().to_owned())
} }

View File

@ -13,7 +13,6 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::hashmap::HashMap; use std::hashmap::HashMap;
use std::io; use std::io;
use std::io::{Decorator, Writer, Seek};
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::str; use std::str;
use std::fmt; use std::fmt;
@ -73,7 +72,7 @@ pub fn enc_ty(w: &mut MemWriter, cx: @ctxt, t: ty::t) {
None => { None => {
let wr = &mut MemWriter::new(); let wr = &mut MemWriter::new();
enc_sty(wr, cx, &ty::get(t).sty); enc_sty(wr, cx, &ty::get(t).sty);
let s = str::from_utf8(*wr.inner_ref()).to_managed(); let s = str::from_utf8(wr.get_ref()).to_managed();
let mut short_names_cache = cx.tcx let mut short_names_cache = cx.tcx
.short_names_cache .short_names_cache
.borrow_mut(); .borrow_mut();

View File

@ -1465,7 +1465,6 @@ fn mk_ctxt() -> @fake_ext_ctxt {
#[cfg(test)] #[cfg(test)]
fn roundtrip(in_item: Option<@ast::item>) { fn roundtrip(in_item: Option<@ast::item>) {
use std::io::Decorator;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
let in_item = in_item.unwrap(); let in_item = in_item.unwrap();
@ -1474,7 +1473,7 @@ fn roundtrip(in_item: Option<@ast::item>) {
let mut ebml_w = writer::Encoder(&mut wr); let mut ebml_w = writer::Encoder(&mut wr);
encode_item_ast(&mut ebml_w, in_item); encode_item_ast(&mut ebml_w, in_item);
} }
let ebml_doc = reader::Doc(wr.inner_ref().as_slice()); let ebml_doc = reader::Doc(wr.get_ref());
let out_item = decode_item_ast(ebml_doc); let out_item = decode_item_ast(ebml_doc);
assert_eq!(in_item, out_item); assert_eq!(in_item, out_item);

View File

@ -23,7 +23,6 @@ use std::local_data;
use std::io; use std::io;
use std::io::File; use std::io::File;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::io::Decorator;
use std::str; use std::str;
use extra::getopts; use extra::getopts;
use extra::getopts::groups; use extra::getopts::groups;
@ -322,7 +321,7 @@ fn json_output(crate: clean::Crate, res: ~[plugins::PluginJson], dst: Path) {
let mut encoder = json::Encoder::new(&mut w as &mut io::Writer); let mut encoder = json::Encoder::new(&mut w as &mut io::Writer);
crate.encode(&mut encoder); crate.encode(&mut encoder);
} }
str::from_utf8_owned(w.inner()) str::from_utf8_owned(w.unwrap())
}; };
let crate_json = match json::from_str(crate_json_str) { let crate_json = match json::from_str(crate_json_str) {
Ok(j) => j, Ok(j) => j,

View File

@ -470,7 +470,6 @@ use prelude::*;
use cast; use cast;
use char::Char; use char::Char;
use io::Decorator;
use io::mem::MemWriter; use io::mem::MemWriter;
use io; use io;
use str; use str;
@ -692,7 +691,7 @@ pub fn format(args: &Arguments) -> ~str {
pub unsafe fn format_unsafe(fmt: &[rt::Piece], args: &[Argument]) -> ~str { pub unsafe fn format_unsafe(fmt: &[rt::Piece], args: &[Argument]) -> ~str {
let mut output = MemWriter::new(); let mut output = MemWriter::new();
write_unsafe(&mut output as &mut io::Writer, fmt, args); write_unsafe(&mut output as &mut io::Writer, fmt, args);
return str::from_utf8_owned(output.inner()); return str::from_utf8_owned(output.unwrap());
} }
impl<'a> Formatter<'a> { impl<'a> Formatter<'a> {

View File

@ -55,7 +55,7 @@ use prelude::*;
use num; use num;
use vec; use vec;
use super::{Stream, Decorator}; use super::Stream;
// libuv recommends 64k buffers to maximize throughput // libuv recommends 64k buffers to maximize throughput
// https://groups.google.com/forum/#!topic/libuv/oQO1HJAIDdA // https://groups.google.com/forum/#!topic/libuv/oQO1HJAIDdA
@ -92,6 +92,17 @@ impl<R: Reader> BufferedReader<R> {
pub fn new(inner: R) -> BufferedReader<R> { pub fn new(inner: R) -> BufferedReader<R> {
BufferedReader::with_capacity(DEFAULT_CAPACITY, inner) BufferedReader::with_capacity(DEFAULT_CAPACITY, inner)
} }
/// Gets a reference to the underlying reader.
///
/// This type does not expose the ability to get a mutable reference to the
/// underlying reader because that could possibly corrupt the buffer.
pub fn get_ref<'a>(&'a self) -> &'a R { &self.inner }
/// Unwraps this buffer, returning the underlying reader.
///
/// Note that any leftover data in the internal buffer is lost.
pub fn unwrap(self) -> R { self.inner }
} }
impl<R: Reader> Buffer for BufferedReader<R> { impl<R: Reader> Buffer for BufferedReader<R> {
@ -134,12 +145,6 @@ impl<R: Reader> Reader for BufferedReader<R> {
} }
} }
impl<R: Reader> Decorator<R> for BufferedReader<R> {
fn inner(self) -> R { self.inner }
fn inner_ref<'a>(&'a self) -> &'a R { &self.inner }
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut R { &mut self.inner }
}
/// Wraps a Writer and buffers output to it /// Wraps a Writer and buffers output to it
/// ///
/// Note that `BufferedWriter` will NOT flush its buffer when dropped. /// Note that `BufferedWriter` will NOT flush its buffer when dropped.
@ -173,6 +178,20 @@ impl<W: Writer> BufferedWriter<W> {
self.pos = 0; self.pos = 0;
} }
} }
/// Gets a reference to the underlying writer.
///
/// This type does not expose the ability to get a mutable reference to the
/// underlying reader because that could possibly corrupt the buffer.
pub fn get_ref<'a>(&'a self) -> &'a W { &self.inner }
/// Unwraps this buffer, returning the underlying writer.
///
/// The buffer is flushed before returning the writer.
pub fn unwrap(mut self) -> W {
self.flush_buf();
self.inner
}
} }
impl<W: Writer> Writer for BufferedWriter<W> { impl<W: Writer> Writer for BufferedWriter<W> {
@ -196,12 +215,6 @@ impl<W: Writer> Writer for BufferedWriter<W> {
} }
} }
impl<W: Writer> Decorator<W> for BufferedWriter<W> {
fn inner(mut self) -> W { self.flush_buf(); self.inner }
fn inner_ref<'a>(&'a self) -> &'a W { &self.inner }
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut W { &mut self.inner }
}
/// Wraps a Writer and buffers output to it, flushing whenever a newline (`0x0a`, /// Wraps a Writer and buffers output to it, flushing whenever a newline (`0x0a`,
/// `'\n'`) is detected. /// `'\n'`) is detected.
/// ///
@ -218,6 +231,17 @@ impl<W: Writer> LineBufferedWriter<W> {
inner: BufferedWriter::with_capacity(1024, inner) inner: BufferedWriter::with_capacity(1024, inner)
} }
} }
/// Gets a reference to the underlying writer.
///
/// This type does not expose the ability to get a mutable reference to the
/// underlying reader because that could possibly corrupt the buffer.
pub fn get_ref<'a>(&'a self) -> &'a W { self.inner.get_ref() }
/// Unwraps this buffer, returning the underlying writer.
///
/// The internal buffer is flushed before returning the writer.
pub fn unwrap(mut self) -> W { self.inner.unwrap() }
} }
impl<W: Writer> Writer for LineBufferedWriter<W> { impl<W: Writer> Writer for LineBufferedWriter<W> {
@ -235,12 +259,6 @@ impl<W: Writer> Writer for LineBufferedWriter<W> {
fn flush(&mut self) { self.inner.flush() } fn flush(&mut self) { self.inner.flush() }
} }
impl<W: Writer> Decorator<W> for LineBufferedWriter<W> {
fn inner(self) -> W { self.inner.inner() }
fn inner_ref<'a>(&'a self) -> &'a W { self.inner.inner_ref() }
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut W { self.inner.inner_mut_ref() }
}
struct InternalBufferedWriter<W>(BufferedWriter<W>); struct InternalBufferedWriter<W>(BufferedWriter<W>);
impl<W> InternalBufferedWriter<W> { impl<W> InternalBufferedWriter<W> {
@ -250,21 +268,6 @@ impl<W> InternalBufferedWriter<W> {
} }
} }
impl<W: Writer> Decorator<W> for InternalBufferedWriter<W> {
fn inner(self) -> W {
let InternalBufferedWriter(s) = self;
s.inner()
}
fn inner_ref<'a>(&'a self) -> &'a W {
let InternalBufferedWriter(ref s) = *self;
s.inner_ref()
}
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut W {
let InternalBufferedWriter(ref mut s) = *self;
s.inner_mut_ref()
}
}
impl<W: Reader> Reader for InternalBufferedWriter<W> { impl<W: Reader> Reader for InternalBufferedWriter<W> {
fn read(&mut self, buf: &mut [u8]) -> Option<uint> { self.get_mut_ref().inner.read(buf) } fn read(&mut self, buf: &mut [u8]) -> Option<uint> { self.get_mut_ref().inner.read(buf) }
fn eof(&mut self) -> bool { self.get_mut_ref().inner.eof() } fn eof(&mut self) -> bool { self.get_mut_ref().inner.eof() }
@ -278,6 +281,8 @@ pub struct BufferedStream<S> {
} }
impl<S: Stream> BufferedStream<S> { impl<S: Stream> BufferedStream<S> {
/// Creates a new buffered stream with explicitly listed capacities for the
/// reader/writer buffer.
pub fn with_capacities(reader_cap: uint, writer_cap: uint, inner: S) pub fn with_capacities(reader_cap: uint, writer_cap: uint, inner: S)
-> BufferedStream<S> { -> BufferedStream<S> {
let writer = BufferedWriter::with_capacity(writer_cap, inner); let writer = BufferedWriter::with_capacity(writer_cap, inner);
@ -287,10 +292,30 @@ impl<S: Stream> BufferedStream<S> {
BufferedStream { inner: reader } BufferedStream { inner: reader }
} }
/// Creates a new buffered stream with the default reader/writer buffer
/// capacities.
pub fn new(inner: S) -> BufferedStream<S> { pub fn new(inner: S) -> BufferedStream<S> {
BufferedStream::with_capacities(DEFAULT_CAPACITY, DEFAULT_CAPACITY, BufferedStream::with_capacities(DEFAULT_CAPACITY, DEFAULT_CAPACITY,
inner) inner)
} }
/// Gets a reference to the underlying stream.
///
/// This type does not expose the ability to get a mutable reference to the
/// underlying reader because that could possibly corrupt the buffer.
pub fn get_ref<'a>(&'a self) -> &'a S {
let InternalBufferedWriter(ref w) = self.inner.inner;
w.get_ref()
}
/// Unwraps this buffer, returning the underlying stream.
///
/// The internal buffer is flushed before returning the stream. Any leftover
/// data in the read buffer is lost.
pub fn unwrap(self) -> S {
let InternalBufferedWriter(w) = self.inner.inner;
w.unwrap()
}
} }
impl<S: Stream> Buffer for BufferedStream<S> { impl<S: Stream> Buffer for BufferedStream<S> {
@ -308,17 +333,8 @@ impl<S: Stream> Writer for BufferedStream<S> {
fn flush(&mut self) { self.inner.inner.get_mut_ref().flush() } fn flush(&mut self) { self.inner.inner.get_mut_ref().flush() }
} }
impl<S: Stream> Decorator<S> for BufferedStream<S> {
fn inner(self) -> S { self.inner.inner.inner() }
fn inner_ref<'a>(&'a self) -> &'a S { self.inner.inner.inner_ref() }
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut S {
self.inner.inner.get_mut_ref().inner_mut_ref()
}
}
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use io::Decorator;
use io; use io;
use prelude::*; use prelude::*;
use super::*; use super::*;
@ -397,45 +413,45 @@ mod test {
let mut writer = BufferedWriter::with_capacity(2, inner); let mut writer = BufferedWriter::with_capacity(2, inner);
writer.write([0, 1]); writer.write([0, 1]);
assert_eq!([], writer.inner_ref().inner_ref().as_slice()); assert_eq!([], writer.get_ref().get_ref());
writer.write([2]); writer.write([2]);
assert_eq!([0, 1], writer.inner_ref().inner_ref().as_slice()); assert_eq!([0, 1], writer.get_ref().get_ref());
writer.write([3]); writer.write([3]);
assert_eq!([0, 1], writer.inner_ref().inner_ref().as_slice()); assert_eq!([0, 1], writer.get_ref().get_ref());
writer.flush(); writer.flush();
assert_eq!([0, 1, 2, 3], writer.inner_ref().inner_ref().as_slice()); assert_eq!([0, 1, 2, 3], writer.get_ref().get_ref());
writer.write([4]); writer.write([4]);
writer.write([5]); writer.write([5]);
assert_eq!([0, 1, 2, 3], writer.inner_ref().inner_ref().as_slice()); assert_eq!([0, 1, 2, 3], writer.get_ref().get_ref());
writer.write([6]); writer.write([6]);
assert_eq!([0, 1, 2, 3, 4, 5], assert_eq!([0, 1, 2, 3, 4, 5],
writer.inner_ref().inner_ref().as_slice()); writer.get_ref().get_ref());
writer.write([7, 8]); writer.write([7, 8]);
assert_eq!([0, 1, 2, 3, 4, 5, 6], assert_eq!([0, 1, 2, 3, 4, 5, 6],
writer.inner_ref().inner_ref().as_slice()); writer.get_ref().get_ref());
writer.write([9, 10, 11]); writer.write([9, 10, 11]);
assert_eq!([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], assert_eq!([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
writer.inner_ref().inner_ref().as_slice()); writer.get_ref().get_ref());
writer.flush(); writer.flush();
assert_eq!([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], assert_eq!([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
writer.inner_ref().inner_ref().as_slice()); writer.get_ref().get_ref());
} }
#[test] #[test]
fn test_buffered_writer_inner_flushes() { fn test_buffered_writer_inner_flushes() {
let mut w = BufferedWriter::with_capacity(3, MemWriter::new()); let mut w = BufferedWriter::with_capacity(3, MemWriter::new());
w.write([0, 1]); w.write([0, 1]);
assert_eq!([], w.inner_ref().inner_ref().as_slice()); assert_eq!([], w.get_ref().get_ref());
let w = w.inner(); let w = w.unwrap();
assert_eq!([0, 1], w.inner_ref().as_slice()); assert_eq!([0, 1], w.get_ref());
} }
// This is just here to make sure that we don't infinite loop in the // This is just here to make sure that we don't infinite loop in the
@ -476,20 +492,20 @@ mod test {
fn test_line_buffer() { fn test_line_buffer() {
let mut writer = LineBufferedWriter::new(MemWriter::new()); let mut writer = LineBufferedWriter::new(MemWriter::new());
writer.write([0]); writer.write([0]);
assert_eq!(*writer.inner_ref().inner_ref(), ~[]); assert_eq!(writer.get_ref().get_ref(), []);
writer.write([1]); writer.write([1]);
assert_eq!(*writer.inner_ref().inner_ref(), ~[]); assert_eq!(writer.get_ref().get_ref(), []);
writer.flush(); writer.flush();
assert_eq!(*writer.inner_ref().inner_ref(), ~[0, 1]); assert_eq!(writer.get_ref().get_ref(), [0, 1]);
writer.write([0, '\n' as u8, 1, '\n' as u8, 2]); writer.write([0, '\n' as u8, 1, '\n' as u8, 2]);
assert_eq!(*writer.inner_ref().inner_ref(), assert_eq!(writer.get_ref().get_ref(),
~[0, 1, 0, '\n' as u8, 1, '\n' as u8]); [0, 1, 0, '\n' as u8, 1, '\n' as u8]);
writer.flush(); writer.flush();
assert_eq!(*writer.inner_ref().inner_ref(), assert_eq!(writer.get_ref().get_ref(),
~[0, 1, 0, '\n' as u8, 1, '\n' as u8, 2]); [0, 1, 0, '\n' as u8, 1, '\n' as u8, 2]);
writer.write([3, '\n' as u8]); writer.write([3, '\n' as u8]);
assert_eq!(*writer.inner_ref().inner_ref(), assert_eq!(writer.get_ref().get_ref(),
~[0, 1, 0, '\n' as u8, 1, '\n' as u8, 2, 3, '\n' as u8]); [0, 1, 0, '\n' as u8, 1, '\n' as u8, 2, 3, '\n' as u8]);
} }
#[test] #[test]

View File

@ -132,7 +132,6 @@ pub fn u64_from_be_bytes(data: &[u8],
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use unstable::finally::Finally; use unstable::finally::Finally;
use io::Decorator;
use prelude::*; use prelude::*;
use io::mem::{MemReader, MemWriter}; use io::mem::{MemReader, MemWriter};
use io::{io_error, placeholder_error}; use io::{io_error, placeholder_error};
@ -419,7 +418,7 @@ mod test {
writer.write_le_u64(*i); writer.write_le_u64(*i);
} }
let mut reader = MemReader::new(writer.inner()); let mut reader = MemReader::new(writer.unwrap());
for i in uints.iter() { for i in uints.iter() {
assert!(reader.read_le_u64() == *i); assert!(reader.read_le_u64() == *i);
} }
@ -435,7 +434,7 @@ mod test {
writer.write_be_u64(*i); writer.write_be_u64(*i);
} }
let mut reader = MemReader::new(writer.inner()); let mut reader = MemReader::new(writer.unwrap());
for i in uints.iter() { for i in uints.iter() {
assert!(reader.read_be_u64() == *i); assert!(reader.read_be_u64() == *i);
} }
@ -450,7 +449,7 @@ mod test {
writer.write_be_i32(*i); writer.write_be_i32(*i);
} }
let mut reader = MemReader::new(writer.inner()); let mut reader = MemReader::new(writer.unwrap());
for i in ints.iter() { for i in ints.iter() {
// this tests that the sign extension is working // this tests that the sign extension is working
// (comparing the values as i32 would not test this) // (comparing the values as i32 would not test this)
@ -466,7 +465,7 @@ mod test {
let mut writer = MemWriter::new(); let mut writer = MemWriter::new();
writer.write(buf); writer.write(buf);
let mut reader = MemReader::new(writer.inner()); let mut reader = MemReader::new(writer.unwrap());
let f = reader.read_be_f32(); let f = reader.read_be_f32();
assert!(f == 8.1250); assert!(f == 8.1250);
} }
@ -479,7 +478,7 @@ mod test {
writer.write_be_f32(f); writer.write_be_f32(f);
writer.write_le_f32(f); writer.write_le_f32(f);
let mut reader = MemReader::new(writer.inner()); let mut reader = MemReader::new(writer.unwrap());
assert!(reader.read_be_f32() == 8.1250); assert!(reader.read_be_f32() == 8.1250);
assert!(reader.read_le_f32() == 8.1250); assert!(reader.read_le_f32() == 8.1250);
} }

View File

@ -34,26 +34,6 @@ impl<W: Writer> Writer for DeflateWriter<W> {
fn flush(&mut self) { fail!() } fn flush(&mut self) { fail!() }
} }
impl<W: Writer> Decorator<W> for DeflateWriter<W> {
fn inner(self) -> W {
match self {
DeflateWriter { inner_writer: w } => w
}
}
fn inner_ref<'a>(&'a self) -> &'a W {
match *self {
DeflateWriter { inner_writer: ref w } => w
}
}
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut W {
match *self {
DeflateWriter { inner_writer: ref mut w } => w
}
}
}
/// A Reader decorator that decompresses using the 'deflate' scheme /// A Reader decorator that decompresses using the 'deflate' scheme
pub struct InflateReader<R> { pub struct InflateReader<R> {
priv inner_reader: R priv inner_reader: R
@ -72,52 +52,3 @@ impl<R: Reader> Reader for InflateReader<R> {
fn eof(&mut self) -> bool { fail!() } fn eof(&mut self) -> bool { fail!() }
} }
impl<R: Reader> Decorator<R> for InflateReader<R> {
fn inner(self) -> R {
match self {
InflateReader { inner_reader: r } => r
}
}
fn inner_ref<'a>(&'a self) -> &'a R {
match *self {
InflateReader { inner_reader: ref r } => r
}
}
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut R {
match *self {
InflateReader { inner_reader: ref mut r } => r
}
}
}
#[cfg(test)]
mod test {
use prelude::*;
use super::*;
use super::super::mem::*;
use super::super::Decorator;
use str;
#[test]
#[ignore]
fn smoke_test() {
let mem_writer = MemWriter::new();
let mut deflate_writer = DeflateWriter::new(mem_writer);
let in_msg: &str = "test";
let in_bytes = in_msg.as_bytes();
deflate_writer.write(in_bytes);
deflate_writer.flush();
let buf = deflate_writer.inner().inner();
let mem_reader = MemReader::new(buf);
let mut inflate_reader = InflateReader::new(mem_reader);
let mut out_bytes = [0, .. 100];
let bytes_read = inflate_reader.read(out_bytes).unwrap();
assert_eq!(bytes_read, in_bytes.len());
let out_msg = str::from_utf8(out_bytes);
assert_eq!(in_msg, out_msg);
}
}

View File

@ -36,6 +36,16 @@ impl MemWriter {
pub fn with_capacity(n: uint) -> MemWriter { pub fn with_capacity(n: uint) -> MemWriter {
MemWriter { buf: vec::with_capacity(n), pos: 0 } MemWriter { buf: vec::with_capacity(n), pos: 0 }
} }
/// Acquires an immutable reference to the underlying buffer of this
/// `MemWriter`.
///
/// No method is exposed for acquiring a mutable reference to the buffer
/// because it could corrupt the state of this `MemWriter`.
pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() }
/// Unwraps this `MemWriter`, returning the underlying buffer
pub fn unwrap(self) -> ~[u8] { self.buf }
} }
impl Writer for MemWriter { impl Writer for MemWriter {
@ -85,12 +95,6 @@ impl Seek for MemWriter {
} }
} }
impl Decorator<~[u8]> for MemWriter {
fn inner(self) -> ~[u8] { self.buf }
fn inner_ref<'a>(&'a self) -> &'a ~[u8] { &self.buf }
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut ~[u8] { &mut self.buf }
}
/// Reads from an owned byte vector /// Reads from an owned byte vector
pub struct MemReader { pub struct MemReader {
priv buf: ~[u8], priv buf: ~[u8],
@ -98,12 +102,24 @@ pub struct MemReader {
} }
impl MemReader { impl MemReader {
/// Creates a new `MemReader` which will read the buffer given. The buffer
/// can be re-acquired through `unwrap`
pub fn new(buf: ~[u8]) -> MemReader { pub fn new(buf: ~[u8]) -> MemReader {
MemReader { MemReader {
buf: buf, buf: buf,
pos: 0 pos: 0
} }
} }
/// Acquires an immutable reference to the underlying buffer of this
/// `MemReader`.
///
/// No method is exposed for acquiring a mutable reference to the buffer
/// because it could corrupt the state of this `MemReader`.
pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() }
/// Unwraps this `MemReader`, returning the underlying buffer
pub fn unwrap(self) -> ~[u8] { self.buf }
} }
impl Reader for MemReader { impl Reader for MemReader {
@ -136,13 +152,6 @@ impl Buffer for MemReader {
fn consume(&mut self, amt: uint) { self.pos += amt; } fn consume(&mut self, amt: uint) { self.pos += amt; }
} }
impl Decorator<~[u8]> for MemReader {
fn inner(self) -> ~[u8] { self.buf }
fn inner_ref<'a>(&'a self) -> &'a ~[u8] { &self.buf }
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut ~[u8] { &mut self.buf }
}
/// Writes to a fixed-size byte slice /// Writes to a fixed-size byte slice
/// ///
/// If a write will not fit in the buffer, it raises the `io_error` /// If a write will not fit in the buffer, it raises the `io_error`
@ -247,7 +256,7 @@ impl<'a> Buffer for BufReader<'a> {
pub fn with_mem_writer(writeFn: |&mut MemWriter|) -> ~[u8] { pub fn with_mem_writer(writeFn: |&mut MemWriter|) -> ~[u8] {
let mut writer = MemWriter::new(); let mut writer = MemWriter::new();
writeFn(&mut writer); writeFn(&mut writer);
writer.inner() writer.unwrap()
} }
#[cfg(test)] #[cfg(test)]
@ -265,24 +274,24 @@ mod test {
writer.write([1, 2, 3]); writer.write([1, 2, 3]);
writer.write([4, 5, 6, 7]); writer.write([4, 5, 6, 7]);
assert_eq!(writer.tell(), 8); assert_eq!(writer.tell(), 8);
assert_eq!(*writer.inner_ref(), ~[0, 1, 2, 3, 4, 5, 6, 7]); assert_eq!(writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7]);
writer.seek(0, SeekSet); writer.seek(0, SeekSet);
assert_eq!(writer.tell(), 0); assert_eq!(writer.tell(), 0);
writer.write([3, 4]); writer.write([3, 4]);
assert_eq!(*writer.inner_ref(), ~[3, 4, 2, 3, 4, 5, 6, 7]); assert_eq!(writer.get_ref(), [3, 4, 2, 3, 4, 5, 6, 7]);
writer.seek(1, SeekCur); writer.seek(1, SeekCur);
writer.write([0, 1]); writer.write([0, 1]);
assert_eq!(*writer.inner_ref(), ~[3, 4, 2, 0, 1, 5, 6, 7]); assert_eq!(writer.get_ref(), [3, 4, 2, 0, 1, 5, 6, 7]);
writer.seek(-1, SeekEnd); writer.seek(-1, SeekEnd);
writer.write([1, 2]); writer.write([1, 2]);
assert_eq!(*writer.inner_ref(), ~[3, 4, 2, 0, 1, 5, 6, 1, 2]); assert_eq!(writer.get_ref(), [3, 4, 2, 0, 1, 5, 6, 1, 2]);
writer.seek(1, SeekEnd); writer.seek(1, SeekEnd);
writer.write([1]); writer.write([1]);
assert_eq!(*writer.inner_ref(), ~[3, 4, 2, 0, 1, 5, 6, 1, 2, 0, 1]); assert_eq!(writer.get_ref(), [3, 4, 2, 0, 1, 5, 6, 1, 2, 0, 1]);
} }
#[test] #[test]
@ -415,7 +424,7 @@ mod test {
writer.write_str("testing"); writer.write_str("testing");
writer.write_line("testing"); writer.write_line("testing");
writer.write_str("testing"); writer.write_str("testing");
let mut r = BufReader::new(*writer.inner_ref()); let mut r = BufReader::new(writer.get_ref());
assert_eq!(r.read_to_str(), ~"testingtesting\ntesting"); assert_eq!(r.read_to_str(), ~"testingtesting\ntesting");
} }
@ -425,7 +434,7 @@ mod test {
writer.write_char('a'); writer.write_char('a');
writer.write_char('\n'); writer.write_char('\n');
writer.write_char('ệ'); writer.write_char('ệ');
let mut r = BufReader::new(*writer.inner_ref()); let mut r = BufReader::new(writer.get_ref());
assert_eq!(r.read_to_str(), ~"a\n"); assert_eq!(r.read_to_str(), ~"a\n");
} }

View File

@ -113,7 +113,6 @@ Some examples of obvious things you might want to do
* Writer - An I/O sink, writes bytes from a buffer * Writer - An I/O sink, writes bytes from a buffer
* Stream - Typical I/O sources like files and sockets are both Readers and Writers, * Stream - Typical I/O sources like files and sockets are both Readers and Writers,
and are collectively referred to a `streams`. and are collectively referred to a `streams`.
* Decorator - A Reader or Writer that composes with others to add additional capabilities
such as encoding or decoding such as encoding or decoding
# Blocking and synchrony # Blocking and synchrony
@ -1298,32 +1297,6 @@ impl<'a, T, A: Acceptor<T>> Iterator<Option<T>> for IncomingIterator<'a, A> {
} }
} }
/// Common trait for decorator types.
///
/// Provides accessors to get the inner, 'decorated' values. The I/O library
/// uses decorators to add functionality like compression and encryption to I/O
/// streams.
///
/// # XXX
///
/// Is this worth having a trait for? May be overkill
pub trait Decorator<T> {
/// Destroy the decorator and extract the decorated value
///
/// # XXX
///
/// Because this takes `self' one could never 'undecorate' a Reader/Writer
/// that has been boxed. Is that ok? This feature is mostly useful for
/// extracting the buffer from MemWriter
fn inner(self) -> T;
/// Take an immutable reference to the decorated value
fn inner_ref<'a>(&'a self) -> &'a T;
/// Take a mutable reference to the decorated value
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut T;
}
pub fn standard_error(kind: IoErrorKind) -> IoError { pub fn standard_error(kind: IoErrorKind) -> IoError {
let desc = match kind { let desc = match kind {
PreviousIoError => "failing due to previous I/O error", PreviousIoError => "failing due to previous I/O error",

View File

@ -106,7 +106,6 @@ impl<T, A: Acceptor<T>> Acceptor<T> for Option<A> {
mod test { mod test {
use prelude::*; use prelude::*;
use super::super::mem::*; use super::super::mem::*;
use io::Decorator;
use super::super::{PreviousIoError, io_error}; use super::super::{PreviousIoError, io_error};
#[test] #[test]
@ -114,7 +113,7 @@ mod test {
let mut writer: Option<MemWriter> = Some(MemWriter::new()); let mut writer: Option<MemWriter> = Some(MemWriter::new());
writer.write([0, 1, 2]); writer.write([0, 1, 2]);
writer.flush(); writer.flush();
assert_eq!(writer.unwrap().inner(), ~[0, 1, 2]); assert_eq!(writer.unwrap().unwrap(), ~[0, 1, 2]);
} }
#[test] #[test]

View File

@ -193,7 +193,6 @@ pub fn copy<R: Reader, W: Writer>(r: &mut R, w: &mut W) {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use io::Decorator;
use io::mem::{MemReader, MemWriter}; use io::mem::{MemReader, MemWriter};
use super::*; use super::*;
use prelude::*; use prelude::*;
@ -282,7 +281,7 @@ mod test {
MemWriter::new()); MemWriter::new());
assert_eq!(~[0, 1, 2], r.read_to_end()); assert_eq!(~[0, 1, 2], r.read_to_end());
let (_, w) = r.unwrap(); let (_, w) = r.unwrap();
assert_eq!(~[0, 1, 2], w.inner()); assert_eq!(~[0, 1, 2], w.unwrap());
} }
#[test] #[test]
@ -291,6 +290,6 @@ mod test {
let mut w = MemWriter::new(); let mut w = MemWriter::new();
copy(&mut r, &mut w); copy(&mut r, &mut w);
assert!(r.eof()); assert!(r.eof());
assert_eq!(~[0, 1, 2, 3, 4], w.inner()); assert_eq!(~[0, 1, 2, 3, 4], w.unwrap());
} }
} }

View File

@ -620,11 +620,10 @@ pub fn write_repr<T>(writer: &mut io::Writer, object: &T) {
pub fn repr_to_str<T>(t: &T) -> ~str { pub fn repr_to_str<T>(t: &T) -> ~str {
use str; use str;
use io; use io;
use io::Decorator;
let mut result = io::mem::MemWriter::new(); let mut result = io::mem::MemWriter::new();
write_repr(&mut result as &mut io::Writer, t); write_repr(&mut result as &mut io::Writer, t);
str::from_utf8_owned(result.inner()) str::from_utf8_owned(result.unwrap())
} }
#[cfg(test)] #[cfg(test)]
@ -635,14 +634,13 @@ fn test_repr() {
use prelude::*; use prelude::*;
use str; use str;
use str::Str; use str::Str;
use io::Decorator;
use util::swap; use util::swap;
use char::is_alphabetic; use char::is_alphabetic;
fn exact_test<T>(t: &T, e:&str) { fn exact_test<T>(t: &T, e:&str) {
let mut m = io::mem::MemWriter::new(); let mut m = io::mem::MemWriter::new();
write_repr(&mut m as &mut io::Writer, t); write_repr(&mut m as &mut io::Writer, t);
let s = str::from_utf8_owned(m.inner()); let s = str::from_utf8_owned(m.unwrap());
assert_eq!(s.as_slice(), e); assert_eq!(s.as_slice(), e);
} }

View File

@ -338,7 +338,6 @@ mod test {
use extra::serialize::Encodable; use extra::serialize::Encodable;
use extra; use extra;
use std::io; use std::io;
use std::io::Decorator;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::str; use std::str;
use codemap::{Span, BytePos, Spanned}; use codemap::{Span, BytePos, Spanned};
@ -356,7 +355,7 @@ mod test {
let mut writer = MemWriter::new(); let mut writer = MemWriter::new();
let mut encoder = extra::json::Encoder::new(&mut writer as &mut io::Writer); let mut encoder = extra::json::Encoder::new(&mut writer as &mut io::Writer);
val.encode(&mut encoder); val.encode(&mut encoder);
str::from_utf8_owned(writer.inner()) str::from_utf8_owned(writer.unwrap())
} }
// produce a codemap::span // produce a codemap::span

View File

@ -32,7 +32,6 @@ use std::cell::RefCell;
use std::char; use std::char;
use std::str; use std::str;
use std::io; use std::io;
use std::io::Decorator;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
// The &mut ps is stored here to prevent recursive type. // The &mut ps is stored here to prevent recursive type.
@ -2322,7 +2321,7 @@ pub fn print_string(s: &mut ps, st: &str, style: ast::StrStyle) {
// downcasts. // downcasts.
unsafe fn get_mem_writer(writer: &mut ~io::Writer) -> ~str { unsafe fn get_mem_writer(writer: &mut ~io::Writer) -> ~str {
let (_, wr): (uint, ~MemWriter) = cast::transmute_copy(writer); let (_, wr): (uint, ~MemWriter) = cast::transmute_copy(writer);
let result = str::from_utf8_owned(wr.inner_ref().to_owned()); let result = str::from_utf8_owned(wr.get_ref().to_owned());
cast::forget(wr); cast::forget(wr);
result result
} }

View File

@ -20,7 +20,6 @@ extern mod extra;
// the common code. // the common code.
use std::hashmap::{HashMap, HashSet}; use std::hashmap::{HashMap, HashSet};
use std::io::Decorator;
use EBReader = extra::ebml::reader; use EBReader = extra::ebml::reader;
use EBWriter = extra::ebml::writer; use EBWriter = extra::ebml::writer;
@ -38,7 +37,7 @@ fn test_ebml<'a, A:
let mut wr = std::io::mem::MemWriter::new(); let mut wr = std::io::mem::MemWriter::new();
let mut ebml_w = EBWriter::Encoder(&mut wr); let mut ebml_w = EBWriter::Encoder(&mut wr);
a1.encode(&mut ebml_w); a1.encode(&mut ebml_w);
let bytes = wr.inner_ref().as_slice(); let bytes = wr.get_ref();
let d: extra::ebml::Doc<'a> = EBReader::Doc(bytes); let d: extra::ebml::Doc<'a> = EBReader::Doc(bytes);
let mut decoder: EBReader::Decoder<'a> = EBReader::Decoder(d); let mut decoder: EBReader::Decoder<'a> = EBReader::Decoder(d);

View File

@ -19,7 +19,6 @@
extern mod extra; extern mod extra;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::io::Decorator;
use std::rand::{random, Rand}; use std::rand::{random, Rand};
use extra::serialize::{Encodable, Decodable}; use extra::serialize::{Encodable, Decodable};
use extra::ebml; use extra::ebml;
@ -61,7 +60,7 @@ fn roundtrip<'a, T: Rand + Eq + Encodable<Encoder> +
let mut w = MemWriter::new(); let mut w = MemWriter::new();
let mut e = Encoder(&mut w); let mut e = Encoder(&mut w);
obj.encode(&mut e); obj.encode(&mut e);
let doc = ebml::reader::Doc(@w.inner_ref().to_owned()); let doc = ebml::reader::Doc(@w.get_ref());
let mut dec = Decoder(doc); let mut dec = Decoder(doc);
let obj2 = Decodable::decode(&mut dec); let obj2 = Decodable::decode(&mut dec);
assert!(obj == obj2); assert!(obj == obj2);

View File

@ -14,7 +14,6 @@
#[deny(warnings)]; #[deny(warnings)];
use std::fmt; use std::fmt;
use std::io::Decorator;
use std::io::mem::MemWriter; use std::io::mem::MemWriter;
use std::io; use std::io;
use std::io::Writer; use std::io::Writer;
@ -262,7 +261,7 @@ fn test_write() {
writeln!(w, "{foo}", foo="bar"); writeln!(w, "{foo}", foo="bar");
} }
let s = str::from_utf8_owned(buf.inner()); let s = str::from_utf8_owned(buf.unwrap());
t!(s, "34helloline\nbar\n"); t!(s, "34helloline\nbar\n");
} }
@ -286,7 +285,7 @@ fn test_format_args() {
format_args!(|args| { fmt::write(w, args) }, "test"); format_args!(|args| { fmt::write(w, args) }, "test");
format_args!(|args| { fmt::write(w, args) }, "{test}", test=3); format_args!(|args| { fmt::write(w, args) }, "{test}", test=3);
} }
let s = str::from_utf8_owned(buf.inner()); let s = str::from_utf8_owned(buf.unwrap());
t!(s, "1test3"); t!(s, "1test3");
let s = format_args!(fmt::format, "hello {}", "world"); let s = format_args!(fmt::format, "hello {}", "world");