std: Address XXXes in flatpipes

This commit is contained in:
Tim Chevalier 2013-01-10 20:09:26 -08:00
parent 3e7da96fd2
commit 0274292bed
3 changed files with 70 additions and 67 deletions

View file

@ -329,7 +329,7 @@ pub impl<T,F:Flattener<T>,C:ByteChan> FlatChan<T, F, C> {
pub mod flatteners {
use ebml;
use flatpipes::{ByteChan, BytePort, Flattener, Unflattener};
use flatpipes::util::BufReader;
use io_util::BufReader;
use json;
use serialize::{Encoder, Decoder, Encodable, Decodable};
@ -340,7 +340,8 @@ pub mod flatteners {
use core::sys::size_of;
use core::vec;
// XXX: Is copy/send equivalent to pod?
// FIXME #4074: Copy + Owned != POD
pub struct PodUnflattener<T: Copy Owned> {
bogus: ()
}
@ -625,78 +626,18 @@ pub mod bytepipes {
}
// XXX: This belongs elsewhere
mod util {
use core::io::{Reader, BytesReader};
use core::io;
use core::prelude::*;
pub struct BufReader {
buf: ~[u8],
mut pos: uint
}
pub impl BufReader {
static pub fn new(v: ~[u8]) -> BufReader {
BufReader {
buf: move v,
pos: 0
}
}
priv fn as_bytes_reader<A>(f: &fn(&BytesReader) -> A) -> A {
// Recreating the BytesReader state every call since
// I can't get the borrowing to work correctly
let bytes_reader = BytesReader {
bytes: ::core::util::id::<&[u8]>(self.buf),
pos: self.pos
};
let res = f(&bytes_reader);
// XXX: This isn't correct if f fails
self.pos = bytes_reader.pos;
return move res;
}
}
impl BufReader: Reader {
fn read(&self, bytes: &[mut u8], len: uint) -> uint {
self.as_bytes_reader(|r| r.read(bytes, len) )
}
fn read_byte(&self) -> int {
self.as_bytes_reader(|r| r.read_byte() )
}
fn eof(&self) -> bool {
self.as_bytes_reader(|r| r.eof() )
}
fn seek(&self, offset: int, whence: io::SeekStyle) {
self.as_bytes_reader(|r| r.seek(offset, whence) )
}
fn tell(&self) -> uint {
self.as_bytes_reader(|r| r.tell() )
}
}
}
#[cfg(test)]
mod test {
use core::prelude::*;
// XXX: json::Decoder doesn't work because of problems related to
// its interior pointers
//use DefaultEncoder = json::Encoder;
//use DefaultDecoder = json::Decoder;
use DefaultEncoder = ebml::writer::Encoder;
use DefaultDecoder = ebml::reader::Decoder;
use DefaultEncoder = json::Encoder;
use DefaultDecoder = json::Decoder;
use flatpipes::flatteners::*;
use flatpipes::bytepipes::*;
use flatpipes::pod;
use flatpipes::serial;
use flatpipes::util::BufReader;
use io_util::BufReader;
use flatpipes::{BytePort, FlatChan, FlatPort};
use net::ip;
use net::tcp::TcpSocketBuf;
@ -787,7 +728,7 @@ mod test {
}
}
// XXX: Networking doesn't work on x86
// FIXME #2064: Networking doesn't work on x86
#[test]
#[cfg(target_arch = "x86_64")]
fn test_pod_tcp_stream() {
@ -934,7 +875,7 @@ mod test {
use flatpipes::{BytePort, FlatPort};
use flatpipes::flatteners::PodUnflattener;
use flatpipes::pod;
use flatpipes::util::BufReader;
use io_util::BufReader;
use core::io;
use core::pipes;

61
src/libstd/io_util.rs Normal file
View file

@ -0,0 +1,61 @@
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use core::io::{Reader, BytesReader};
use core::io;
use core::prelude::*;
pub struct BufReader {
buf: ~[u8],
mut pos: uint
}
pub impl BufReader {
static pub fn new(v: ~[u8]) -> BufReader {
BufReader {
buf: move v,
pos: 0
}
}
priv fn as_bytes_reader<A>(f: &fn(&BytesReader) -> A) -> A {
// Recreating the BytesReader state every call since
// I can't get the borrowing to work correctly
let bytes_reader = BytesReader {
bytes: ::core::util::id::<&[u8]>(self.buf),
pos: self.pos
};
let res = f(&bytes_reader);
// FIXME #4429: This isn't correct if f fails
self.pos = bytes_reader.pos;
return move res;
}
}
impl BufReader: Reader {
fn read(&self, bytes: &[mut u8], len: uint) -> uint {
self.as_bytes_reader(|r| r.read(bytes, len) )
}
fn read_byte(&self) -> int {
self.as_bytes_reader(|r| r.read_byte() )
}
fn eof(&self) -> bool {
self.as_bytes_reader(|r| r.eof() )
}
fn seek(&self, offset: int, whence: io::SeekStyle) {
self.as_bytes_reader(|r| r.seek(offset, whence) )
}
fn tell(&self) -> uint {
self.as_bytes_reader(|r| r.tell() )
}
}

View file

@ -57,6 +57,7 @@ pub mod uv_global_loop;
pub mod c_vec;
pub mod timer;
pub mod cell;
pub mod io_util;
// Concurrency