Skip to content

Commit

Permalink
Modify the Bytes type so that it remains cloneable even
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
nikomatsakis committed Dec 19, 2014
1 parent 89922e5 commit a04ce71
Showing 1 changed file with 20 additions and 3 deletions.
23 changes: 20 additions & 3 deletions src/libcore/str.rs
Expand Up @@ -21,6 +21,7 @@ pub use self::Searcher::{Naive, TwoWay, TwoWayLong};

use char::Char;
use char;
use clone::Clone;
use cmp::{Eq, mod};
use default::Default;
use iter::{Map, Iterator, IteratorExt, DoubleEndedIterator};
Expand All @@ -31,7 +32,7 @@ use mem;
use num::Int;
use option::Option;
use option::Option::{None, Some};
use ops::FnMut;
use ops::{Fn, FnMut};
use ptr::RawPtr;
use raw::{Repr, Slice};
use slice::{mod, SliceExt};
Expand Down Expand Up @@ -316,7 +317,23 @@ impl<'a> DoubleEndedIterator<(uint, char)> for CharOffsets<'a> {

/// External iterator for a string's bytes.
/// 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`.
#[deriving(Clone)]
Expand Down Expand Up @@ -2009,7 +2026,7 @@ impl StrPrelude for str {
fn bytes(&self) -> Bytes {
fn deref(&x: &u8) -> u8 { x }

self.as_bytes().iter().map(deref)
self.as_bytes().iter().map(BytesFn(deref))
}

#[inline]
Expand Down

0 comments on commit a04ce71

Please sign in to comment.