Modify the Bytes
type so that it remains cloneable even
though it includes a `fn()`. This is really a more general problem but I wanted to ensures that `bytes` in particular remains working due to #12677.
This commit is contained in:
parent
89922e52b0
commit
a04ce71172
1 changed files with 20 additions and 3 deletions
|
@ -21,6 +21,7 @@ pub use self::Searcher::{Naive, TwoWay, TwoWayLong};
|
||||||
|
|
||||||
use char::Char;
|
use char::Char;
|
||||||
use char;
|
use char;
|
||||||
|
use clone::Clone;
|
||||||
use cmp::{Eq, mod};
|
use cmp::{Eq, mod};
|
||||||
use default::Default;
|
use default::Default;
|
||||||
use iter::{Map, Iterator, IteratorExt, DoubleEndedIterator};
|
use iter::{Map, Iterator, IteratorExt, DoubleEndedIterator};
|
||||||
|
@ -31,7 +32,7 @@ use mem;
|
||||||
use num::Int;
|
use num::Int;
|
||||||
use option::Option;
|
use option::Option;
|
||||||
use option::Option::{None, Some};
|
use option::Option::{None, Some};
|
||||||
use ops::FnMut;
|
use ops::{Fn, FnMut};
|
||||||
use ptr::RawPtr;
|
use ptr::RawPtr;
|
||||||
use raw::{Repr, Slice};
|
use raw::{Repr, Slice};
|
||||||
use slice::{mod, SliceExt};
|
use slice::{mod, SliceExt};
|
||||||
|
@ -316,7 +317,23 @@ impl<'a> DoubleEndedIterator<(uint, char)> for CharOffsets<'a> {
|
||||||
|
|
||||||
/// External iterator for a string's bytes.
|
/// External iterator for a string's bytes.
|
||||||
/// Use with the `std::iter` module.
|
/// Use with the `std::iter` module.
|
||||||
pub type Bytes<'a> = Map<&'a u8, u8, slice::Items<'a, u8>, fn(&u8) -> u8>;
|
pub type Bytes<'a> = Map<&'a u8, u8, slice::Items<'a, u8>, BytesFn>;
|
||||||
|
|
||||||
|
/// A temporary new type wrapper that ensures that the `Bytes` iterator
|
||||||
|
/// is cloneable.
|
||||||
|
#[deriving(Copy)]
|
||||||
|
#[experimental = "iterator type instability"]
|
||||||
|
pub struct BytesFn(fn(&u8) -> u8);
|
||||||
|
|
||||||
|
impl<'a> Fn(&'a u8) -> u8 for BytesFn {
|
||||||
|
extern "rust-call" fn call(&self, (ptr,): (&'a u8,)) -> u8 {
|
||||||
|
(self.0)(ptr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for BytesFn {
|
||||||
|
fn clone(&self) -> BytesFn { *self }
|
||||||
|
}
|
||||||
|
|
||||||
/// An iterator over the substrings of a string, separated by `sep`.
|
/// An iterator over the substrings of a string, separated by `sep`.
|
||||||
#[deriving(Clone)]
|
#[deriving(Clone)]
|
||||||
|
@ -2009,7 +2026,7 @@ impl StrPrelude for str {
|
||||||
fn bytes(&self) -> Bytes {
|
fn bytes(&self) -> Bytes {
|
||||||
fn deref(&x: &u8) -> u8 { x }
|
fn deref(&x: &u8) -> u8 { x }
|
||||||
|
|
||||||
self.as_bytes().iter().map(deref)
|
self.as_bytes().iter().map(BytesFn(deref))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue