std: remove remaining boxed closures

This commit is contained in:
Jorge Aparicio 2015-01-01 18:07:31 -05:00
parent a291a80fbe
commit 37f62ae1c0
2 changed files with 15 additions and 12 deletions

View File

@ -518,14 +518,16 @@ pub fn rmdir(path: &Path) -> IoResult<()> {
/// use std::io; /// use std::io;
/// ///
/// // one possible implementation of fs::walk_dir only visiting files /// // one possible implementation of fs::walk_dir only visiting files
/// fn visit_dirs(dir: &Path, cb: |&Path|) -> io::IoResult<()> { /// fn visit_dirs<F>(dir: &Path, cb: &mut F) -> io::IoResult<()> where
/// F: FnMut(&Path),
/// {
/// if dir.is_dir() { /// if dir.is_dir() {
/// let contents = try!(fs::readdir(dir)); /// let contents = try!(fs::readdir(dir));
/// for entry in contents.iter() { /// for entry in contents.iter() {
/// if entry.is_dir() { /// if entry.is_dir() {
/// try!(visit_dirs(entry, |p| cb(p))); /// try!(visit_dirs(entry, cb));
/// } else { /// } else {
/// cb(entry); /// (*cb)(entry);
/// } /// }
/// } /// }
/// Ok(()) /// Ok(())

View File

@ -17,11 +17,12 @@
pub use self::IpAddr::*; pub use self::IpAddr::*;
use boxed::Box;
use fmt; use fmt;
use io::{self, IoResult, IoError}; use io::{self, IoResult, IoError};
use io::net; use io::net;
use iter::{Iterator, IteratorExt}; use iter::{Iterator, IteratorExt};
use ops::FnOnce; use ops::{FnOnce, FnMut};
use option::Option; use option::Option;
use option::Option::{None, Some}; use option::Option::{None, Some};
use result::Result::{Ok, Err}; use result::Result::{Ok, Err};
@ -120,10 +121,10 @@ impl<'a> Parser<'a> {
} }
// Return result of first successful parser // Return result of first successful parser
fn read_or<T>(&mut self, parsers: &mut [|&mut Parser| -> Option<T>]) fn read_or<T>(&mut self, parsers: &mut [Box<FnMut(&mut Parser) -> Option<T>>])
-> Option<T> { -> Option<T> {
for pf in parsers.iter_mut() { for pf in parsers.iter_mut() {
match self.read_atomically(|p: &mut Parser| (*pf)(p)) { match self.read_atomically(|p: &mut Parser| pf.call_mut((p,))) {
Some(r) => return Some(r), Some(r) => return Some(r),
None => {} None => {}
} }
@ -320,22 +321,22 @@ impl<'a> Parser<'a> {
} }
fn read_ip_addr(&mut self) -> Option<IpAddr> { fn read_ip_addr(&mut self) -> Option<IpAddr> {
let ipv4_addr = |p: &mut Parser| p.read_ipv4_addr(); let ipv4_addr = |&mut: p: &mut Parser| p.read_ipv4_addr();
let ipv6_addr = |p: &mut Parser| p.read_ipv6_addr(); let ipv6_addr = |&mut: p: &mut Parser| p.read_ipv6_addr();
self.read_or(&mut [ipv4_addr, ipv6_addr]) self.read_or(&mut [box ipv4_addr, box ipv6_addr])
} }
fn read_socket_addr(&mut self) -> Option<SocketAddr> { fn read_socket_addr(&mut self) -> Option<SocketAddr> {
let ip_addr = |&: p: &mut Parser| { let ip_addr = |&: p: &mut Parser| {
let ipv4_p = |p: &mut Parser| p.read_ip_addr(); let ipv4_p = |&mut: p: &mut Parser| p.read_ip_addr();
let ipv6_p = |p: &mut Parser| { let ipv6_p = |&mut: p: &mut Parser| {
let open_br = |&: p: &mut Parser| p.read_given_char('['); let open_br = |&: p: &mut Parser| p.read_given_char('[');
let ip_addr = |&: p: &mut Parser| p.read_ipv6_addr(); let ip_addr = |&: p: &mut Parser| p.read_ipv6_addr();
let clos_br = |&: p: &mut Parser| p.read_given_char(']'); let clos_br = |&: p: &mut Parser| p.read_given_char(']');
p.read_seq_3::<char, IpAddr, char, _, _, _>(open_br, ip_addr, clos_br) p.read_seq_3::<char, IpAddr, char, _, _, _>(open_br, ip_addr, clos_br)
.map(|t| match t { (_, ip, _) => ip }) .map(|t| match t { (_, ip, _) => ip })
}; };
p.read_or(&mut [ipv4_p, ipv6_p]) p.read_or(&mut [box ipv4_p, box ipv6_p])
}; };
let colon = |&: p: &mut Parser| p.read_given_char(':'); let colon = |&: p: &mut Parser| p.read_given_char(':');
let port = |&: p: &mut Parser| p.read_number(10, 5, 0x10000).map(|n| n as u16); let port = |&: p: &mut Parser| p.read_number(10, 5, 0x10000).map(|n| n as u16);