From fd9ad77bd2f03cf205150299768f34df91ecc3b6 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Tue, 29 Jul 2014 18:27:28 -0700 Subject: [PATCH] Move SeekableMemWriter into librbml --- src/{librustc/util => librbml}/io.rs | 3 +- src/librbml/lib.rs | 120 +-------------------------- src/librustc/lib.rs | 1 - src/librustc/metadata/encoder.rs | 2 +- src/librustc/metadata/tyencode.rs | 2 +- src/librustc/middle/astencode.rs | 2 +- src/test/run-pass/issue-11881.rs | 116 +------------------------- 7 files changed, 11 insertions(+), 235 deletions(-) rename src/{librustc/util => librbml}/io.rs (99%) diff --git a/src/librustc/util/io.rs b/src/librbml/io.rs similarity index 99% rename from src/librustc/util/io.rs rename to src/librbml/io.rs index f153aca7fac7..9ab163c5f474 100644 --- a/src/librustc/util/io.rs +++ b/src/librbml/io.rs @@ -39,7 +39,7 @@ fn combine(seek: SeekStyle, cur: uint, end: uint, offset: i64) -> IoResult /// /// ```rust /// # #![allow(unused_must_use)] -/// use std::io::SeekableMemWriter; +/// use rbml::io::SeekableMemWriter; /// /// let mut w = SeekableMemWriter::new(); /// w.write([0, 1, 2]); @@ -128,6 +128,7 @@ impl Seek for SeekableMemWriter { #[cfg(test)] mod tests { + extern crate test; use super::SeekableMemWriter; use std::io; use test::Bencher; diff --git a/src/librbml/lib.rs b/src/librbml/lib.rs index e54410b6a5d0..f77d36d1e064 100644 --- a/src/librbml/lib.rs +++ b/src/librbml/lib.rs @@ -32,9 +32,9 @@ extern crate serialize; #[phase(plugin, link)] extern crate log; #[cfg(test)] extern crate test; -use std::io; use std::str; +pub mod io; /// Common data structures #[deriving(Clone)] @@ -105,7 +105,7 @@ pub enum EbmlEncoderTag { pub enum Error { IntTooBig(uint), Expected(String), - IoError(io::IoError) + IoError(std::io::IoError) } // -------------------------------------- @@ -1038,6 +1038,8 @@ pub mod writer { #[cfg(test)] mod tests { use super::{Doc, reader, writer}; + use super::io::SeekableMemWriter; + use serialize::{Encodable, Decodable}; use std::io::{IoError, IoResult, SeekStyle}; @@ -1045,120 +1047,6 @@ mod tests { use std::option::{None, Option, Some}; use std::slice; - static BUF_CAPACITY: uint = 128; - - fn combine(seek: SeekStyle, cur: uint, end: uint, offset: i64) -> IoResult { - // compute offset as signed and clamp to prevent overflow - let pos = match seek { - io::SeekSet => 0, - io::SeekEnd => end, - io::SeekCur => cur, - } as i64; - - if offset + pos < 0 { - Err(IoError { - kind: io::InvalidInput, - desc: "invalid seek to a negative offset", - detail: None - }) - } else { - Ok((offset + pos) as u64) - } - } - - /// Writes to an owned, growable byte vector that supports seeking. - /// - /// # Example - /// - /// ```rust - /// # #![allow(unused_must_use)] - /// use std::io::SeekableMemWriter; - /// - /// let mut w = SeekableMemWriter::new(); - /// w.write([0, 1, 2]); - /// - /// assert_eq!(w.unwrap(), vec!(0, 1, 2)); - /// ``` - pub struct SeekableMemWriter { - buf: Vec, - pos: uint, - } - - impl SeekableMemWriter { - /// Create a new `SeekableMemWriter`. - #[inline] - pub fn new() -> SeekableMemWriter { - SeekableMemWriter::with_capacity(BUF_CAPACITY) - } - /// Create a new `SeekableMemWriter`, allocating at least `n` bytes for - /// the internal buffer. - #[inline] - pub fn with_capacity(n: uint) -> SeekableMemWriter { - SeekableMemWriter { buf: Vec::with_capacity(n), pos: 0 } - } - - /// Acquires an immutable reference to the underlying buffer of this - /// `SeekableMemWriter`. - /// - /// No method is exposed for acquiring a mutable reference to the buffer - /// because it could corrupt the state of this `MemWriter`. - #[inline] - pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() } - - /// Unwraps this `SeekableMemWriter`, returning the underlying buffer - #[inline] - pub fn unwrap(self) -> Vec { self.buf } - } - - impl Writer for SeekableMemWriter { - #[inline] - fn write(&mut self, buf: &[u8]) -> IoResult<()> { - if self.pos == self.buf.len() { - self.buf.push_all(buf) - } else { - // Make sure the internal buffer is as least as big as where we - // currently are - let difference = self.pos as i64 - self.buf.len() as i64; - if difference > 0 { - self.buf.grow(difference as uint, &0); - } - - // Figure out what bytes will be used to overwrite what's currently - // there (left), and what will be appended on the end (right) - let cap = self.buf.len() - self.pos; - let (left, right) = if cap <= buf.len() { - (buf.slice_to(cap), buf.slice_from(cap)) - } else { - (buf, &[]) - }; - - // Do the necessary writes - if left.len() > 0 { - slice::bytes::copy_memory(self.buf.mut_slice_from(self.pos), left); - } - if right.len() > 0 { - self.buf.push_all(right); - } - } - - // Bump us forward - self.pos += buf.len(); - Ok(()) - } - } - - impl Seek for SeekableMemWriter { - #[inline] - fn tell(&self) -> IoResult { Ok(self.pos as u64) } - - #[inline] - fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> { - let new = try!(combine(style, self.pos, self.buf.len(), pos)); - self.pos = new as uint; - Ok(()) - } - } - #[test] fn test_vuint_at() { let data = [ diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 5385c6103507..f9774e83e8a1 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -133,7 +133,6 @@ pub mod util { pub mod common; pub mod ppaux; - pub mod io; pub mod nodemap; } diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 40da534bfaba..f093f7439658 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -26,7 +26,6 @@ use middle::ty; use middle::typeck; use middle::stability; use middle; -use util::io::SeekableMemWriter; use util::nodemap::{NodeMap, NodeSet}; use serialize::Encodable; @@ -53,6 +52,7 @@ use syntax::visit::Visitor; use syntax::visit; use syntax; use rbml::writer; +use rbml::io::SeekableMemWriter; /// A borrowed version of ast::InlinedItem. pub enum InlinedItemRef<'a> { diff --git a/src/librustc/metadata/tyencode.rs b/src/librustc/metadata/tyencode.rs index f301dc3760db..f16a46ed7293 100644 --- a/src/librustc/metadata/tyencode.rs +++ b/src/librustc/metadata/tyencode.rs @@ -27,7 +27,7 @@ use syntax::ast::*; use syntax::diagnostic::SpanHandler; use syntax::parse::token; -use util::io::SeekableMemWriter; +use rbml::io::SeekableMemWriter; macro_rules! mywrite( ($($arg:tt)*) => ({ write!($($arg)*); }) ) diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs index 98111c7c4cfd..f68501bbb914 100644 --- a/src/librustc/middle/astencode.rs +++ b/src/librustc/middle/astencode.rs @@ -28,7 +28,6 @@ use middle::subst; use middle::subst::VecPerParamSpace; use middle::typeck::{MethodCall, MethodCallee, MethodOrigin}; use middle::{ty, typeck}; -use util::io::SeekableMemWriter; use util::ppaux::ty_to_string; use syntax::{ast, ast_map, ast_util, codemap, fold}; @@ -43,6 +42,7 @@ use std::io::Seek; use std::mem; use std::gc::GC; +use rbml::io::SeekableMemWriter; use rbml::{reader, writer}; use rbml; use serialize; diff --git a/src/test/run-pass/issue-11881.rs b/src/test/run-pass/issue-11881.rs index 799cea865a33..28fc4ce192e1 100644 --- a/src/test/run-pass/issue-11881.rs +++ b/src/test/run-pass/issue-11881.rs @@ -17,121 +17,9 @@ use std::slice; use serialize::{Encodable, Encoder}; use serialize::json; + use rbml::writer; - -static BUF_CAPACITY: uint = 128; - -fn combine(seek: SeekStyle, cur: uint, end: uint, offset: i64) -> IoResult { - // compute offset as signed and clamp to prevent overflow - let pos = match seek { - io::SeekSet => 0, - io::SeekEnd => end, - io::SeekCur => cur, - } as i64; - - if offset + pos < 0 { - Err(IoError { - kind: io::InvalidInput, - desc: "invalid seek to a negative offset", - detail: None - }) - } else { - Ok((offset + pos) as u64) - } -} - -/// Writes to an owned, growable byte vector that supports seeking. -/// -/// # Example -/// -/// ```rust -/// # #![allow(unused_must_use)] -/// use std::io::SeekableMemWriter; -/// -/// let mut w = SeekableMemWriter::new(); -/// w.write([0, 1, 2]); -/// -/// assert_eq!(w.unwrap(), vec!(0, 1, 2)); -/// ``` -pub struct SeekableMemWriter { - buf: Vec, - pos: uint, -} - -impl SeekableMemWriter { - /// Create a new `SeekableMemWriter`. - #[inline] - pub fn new() -> SeekableMemWriter { - SeekableMemWriter::with_capacity(BUF_CAPACITY) - } - /// Create a new `SeekableMemWriter`, allocating at least `n` bytes for - /// the internal buffer. - #[inline] - pub fn with_capacity(n: uint) -> SeekableMemWriter { - SeekableMemWriter { buf: Vec::with_capacity(n), pos: 0 } - } - - /// Acquires an immutable reference to the underlying buffer of this - /// `SeekableMemWriter`. - /// - /// No method is exposed for acquiring a mutable reference to the buffer - /// because it could corrupt the state of this `MemWriter`. - #[inline] - pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() } - - /// Unwraps this `SeekableMemWriter`, returning the underlying buffer - #[inline] - pub fn unwrap(self) -> Vec { self.buf } -} - -impl Writer for SeekableMemWriter { - #[inline] - fn write(&mut self, buf: &[u8]) -> IoResult<()> { - if self.pos == self.buf.len() { - self.buf.push_all(buf) - } else { - // Make sure the internal buffer is as least as big as where we - // currently are - let difference = self.pos as i64 - self.buf.len() as i64; - if difference > 0 { - self.buf.grow(difference as uint, &0); - } - - // Figure out what bytes will be used to overwrite what's currently - // there (left), and what will be appended on the end (right) - let cap = self.buf.len() - self.pos; - let (left, right) = if cap <= buf.len() { - (buf.slice_to(cap), buf.slice_from(cap)) - } else { - (buf, &[]) - }; - - // Do the necessary writes - if left.len() > 0 { - slice::bytes::copy_memory(self.buf.mut_slice_from(self.pos), left); - } - if right.len() > 0 { - self.buf.push_all(right); - } - } - - // Bump us forward - self.pos += buf.len(); - Ok(()) - } -} - -impl Seek for SeekableMemWriter { - #[inline] - fn tell(&self) -> IoResult { Ok(self.pos as u64) } - - #[inline] - fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> { - let new = try!(combine(style, self.pos, self.buf.len(), pos)); - self.pos = new as uint; - Ok(()) - } -} +use rbml::io::SeekableMemWriter; #[deriving(Encodable)] struct Foo {