From 51d84b85cbfd0e4c2e24f8f7c72140db376c7d5d Mon Sep 17 00:00:00 2001 From: Michael Gehring Date: Mon, 3 Nov 2014 19:59:23 +0100 Subject: [PATCH] shuf: fix build It's no longer possible to have a Box due to the new object safety rules. Wrap in an enum as a workaround. --- src/shuf/shuf.rs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/shuf/shuf.rs b/src/shuf/shuf.rs index 4d5394be0..7441e0b32 100644 --- a/src/shuf/shuf.rs +++ b/src/shuf/shuf.rs @@ -19,7 +19,7 @@ use std::from_str::from_str; use std::io; use std::io::IoResult; use std::iter::{range_inclusive, RangeInclusive}; -use std::rand; +use std::rand::{mod, Rng}; use std::uint; #[path = "../common/util.rs"] @@ -151,14 +151,28 @@ fn shuf(input: Vec, mode: Mode, repeat: bool, zero: bool, count: uint, o } } +enum WrappedRng { + RngFile(rand::reader::ReaderRng), + RngDefault(rand::TaskRng), +} + +impl WrappedRng { + fn next_u32(&mut self) -> u32 { + match self { + &RngFile(ref mut r) => r.next_u32(), + &RngDefault(ref mut r) => r.next_u32(), + } + } +} + fn shuf_lines(mut lines: Vec, repeat: bool, zero: bool, count: uint, outname: Option, random: Option) -> IoResult<()> { let mut output = match outname { Some(name) => box io::BufferedWriter::new(try!(io::File::create(&Path::new(name)))) as Box, None => box io::stdout() as Box }; let mut rng = match random { - Some(name) => box rand::reader::ReaderRng::new(try!(io::File::open(&Path::new(name)))) as Box, - None => box rand::task_rng() as Box + Some(name) => RngFile(rand::reader::ReaderRng::new(try!(io::File::open(&Path::new(name))))), + None => RngDefault(rand::task_rng()), }; let mut len = lines.len(); let max = if repeat { count } else { cmp::min(count, len) };