2014-05-01 00:54:25 -05:00
|
|
|
// Copyright 2012-2014 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.
|
|
|
|
|
|
|
|
//! Slice management and manipulation
|
|
|
|
//!
|
|
|
|
//! For more details `std::slice`.
|
|
|
|
|
2014-08-07 01:59:12 -05:00
|
|
|
#![stable]
|
2014-05-28 21:53:37 -05:00
|
|
|
#![doc(primitive = "slice")]
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
// How this module is organized.
|
|
|
|
//
|
|
|
|
// The library infrastructure for slices is fairly messy. There's
|
|
|
|
// a lot of stuff defined here. Let's keep it clean.
|
|
|
|
//
|
|
|
|
// Since slices don't support inherent methods; all operations
|
|
|
|
// on them are defined on traits, which are then reexported from
|
|
|
|
// the prelude for convenience. So there are a lot of traits here.
|
|
|
|
//
|
|
|
|
// The layout of this file is thus:
|
|
|
|
//
|
|
|
|
// * Slice-specific 'extension' traits and their implementations. This
|
|
|
|
// is where most of the slice API resides.
|
|
|
|
// * Implementations of a few common traits with important slice ops.
|
|
|
|
// * Definitions of a bunch of iterators.
|
|
|
|
// * Free functions.
|
|
|
|
// * The `raw` and `bytes` submodules.
|
|
|
|
// * Boilerplate trait implementations.
|
|
|
|
|
core: Remove the cast module
This commit revisits the `cast` module in libcore and libstd, and scrutinizes
all functions inside of it. The result was to remove the `cast` module entirely,
folding all functionality into the `mem` module. Specifically, this is the fate
of each function in the `cast` module.
* transmute - This function was moved to `mem`, but it is now marked as
#[unstable]. This is due to planned changes to the `transmute`
function and how it can be invoked (see the #[unstable] comment).
For more information, see RFC 5 and #12898
* transmute_copy - This function was moved to `mem`, with clarification that is
is not an error to invoke it with T/U that are different
sizes, but rather that it is strongly discouraged. This
function is now #[stable]
* forget - This function was moved to `mem` and marked #[stable]
* bump_box_refcount - This function was removed due to the deprecation of
managed boxes as well as its questionable utility.
* transmute_mut - This function was previously deprecated, and removed as part
of this commit.
* transmute_mut_unsafe - This function doesn't serve much of a purpose when it
can be achieved with an `as` in safe code, so it was
removed.
* transmute_lifetime - This function was removed because it is likely a strong
indication that code is incorrect in the first place.
* transmute_mut_lifetime - This function was removed for the same reasons as
`transmute_lifetime`
* copy_lifetime - This function was moved to `mem`, but it is marked
`#[unstable]` now due to the likelihood of being removed in
the future if it is found to not be very useful.
* copy_mut_lifetime - This function was also moved to `mem`, but had the same
treatment as `copy_lifetime`.
* copy_lifetime_vec - This function was removed because it is not used today,
and its existence is not necessary with DST
(copy_lifetime will suffice).
In summary, the cast module was stripped down to these functions, and then the
functions were moved to the `mem` module.
transmute - #[unstable]
transmute_copy - #[stable]
forget - #[stable]
copy_lifetime - #[unstable]
copy_mut_lifetime - #[unstable]
[breaking-change]
2014-05-09 12:34:51 -05:00
|
|
|
use mem::transmute;
|
2014-05-01 00:54:25 -05:00
|
|
|
use clone::Clone;
|
2015-01-02 01:53:35 -06:00
|
|
|
use cmp::{Ordering, PartialEq, PartialOrd, Eq, Ord};
|
2014-11-28 10:57:41 -06:00
|
|
|
use cmp::Ordering::{Less, Equal, Greater};
|
2014-05-01 00:54:25 -05:00
|
|
|
use cmp;
|
|
|
|
use default::Default;
|
|
|
|
use iter::*;
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
use kinds::Copy;
|
2014-11-18 22:22:13 -06:00
|
|
|
use num::Int;
|
2015-01-03 21:42:37 -06:00
|
|
|
use ops::{FnMut, self};
|
2014-11-28 10:57:41 -06:00
|
|
|
use option::Option;
|
|
|
|
use option::Option::{None, Some};
|
2014-12-30 12:51:18 -06:00
|
|
|
use result::Result;
|
|
|
|
use result::Result::{Ok, Err};
|
2014-05-01 00:54:25 -05:00
|
|
|
use ptr;
|
2014-12-19 10:57:12 -06:00
|
|
|
use ptr::PtrExt;
|
2014-05-01 00:54:25 -05:00
|
|
|
use mem;
|
|
|
|
use mem::size_of;
|
2014-10-23 10:43:18 -05:00
|
|
|
use kinds::{Sized, marker};
|
2014-08-07 20:30:03 -05:00
|
|
|
use raw::Repr;
|
2014-08-06 22:03:55 -05:00
|
|
|
// Avoid conflicts with *both* the Slice trait (buggy) and the `slice::raw` module.
|
2014-08-18 10:29:44 -05:00
|
|
|
use raw::Slice as RawSlice;
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-08-06 22:48:25 -05:00
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
//
|
|
|
|
// Extension traits
|
|
|
|
//
|
|
|
|
|
2014-11-02 19:04:32 -06:00
|
|
|
/// Extension methods for slices.
|
2014-12-11 11:44:17 -06:00
|
|
|
#[allow(missing_docs)] // docs in libcollections
|
2015-01-04 20:39:02 -06:00
|
|
|
pub trait SliceExt {
|
2015-01-02 08:12:27 -06:00
|
|
|
type Item;
|
|
|
|
|
|
|
|
fn slice<'a>(&'a self, start: uint, end: uint) -> &'a [Self::Item];
|
|
|
|
fn slice_from<'a>(&'a self, start: uint) -> &'a [Self::Item];
|
|
|
|
fn slice_to<'a>(&'a self, end: uint) -> &'a [Self::Item];
|
|
|
|
fn split_at<'a>(&'a self, mid: uint) -> (&'a [Self::Item], &'a [Self::Item]);
|
|
|
|
fn iter<'a>(&'a self) -> Iter<'a, Self::Item>;
|
|
|
|
fn split<'a, P>(&'a self, pred: P) -> Split<'a, Self::Item, P>
|
|
|
|
where P: FnMut(&Self::Item) -> bool;
|
|
|
|
fn splitn<'a, P>(&'a self, n: uint, pred: P) -> SplitN<'a, Self::Item, P>
|
|
|
|
where P: FnMut(&Self::Item) -> bool;
|
|
|
|
fn rsplitn<'a, P>(&'a self, n: uint, pred: P) -> RSplitN<'a, Self::Item, P>
|
|
|
|
where P: FnMut(&Self::Item) -> bool;
|
|
|
|
fn windows<'a>(&'a self, size: uint) -> Windows<'a, Self::Item>;
|
|
|
|
fn chunks<'a>(&'a self, size: uint) -> Chunks<'a, Self::Item>;
|
|
|
|
fn get<'a>(&'a self, index: uint) -> Option<&'a Self::Item>;
|
|
|
|
fn first<'a>(&'a self) -> Option<&'a Self::Item>;
|
|
|
|
fn tail<'a>(&'a self) -> &'a [Self::Item];
|
|
|
|
fn init<'a>(&'a self) -> &'a [Self::Item];
|
|
|
|
fn last<'a>(&'a self) -> Option<&'a Self::Item>;
|
|
|
|
unsafe fn get_unchecked<'a>(&'a self, index: uint) -> &'a Self::Item;
|
|
|
|
fn as_ptr(&self) -> *const Self::Item;
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn binary_search_by<F>(&self, f: F) -> Result<uint, uint> where
|
2015-01-02 08:12:27 -06:00
|
|
|
F: FnMut(&Self::Item) -> Ordering;
|
2014-10-30 15:43:24 -05:00
|
|
|
fn len(&self) -> uint;
|
|
|
|
fn is_empty(&self) -> bool { self.len() == 0 }
|
2015-01-02 08:12:27 -06:00
|
|
|
fn get_mut<'a>(&'a mut self, index: uint) -> Option<&'a mut Self::Item>;
|
|
|
|
fn as_mut_slice<'a>(&'a mut self) -> &'a mut [Self::Item];
|
|
|
|
fn slice_mut<'a>(&'a mut self, start: uint, end: uint) -> &'a mut [Self::Item];
|
|
|
|
fn slice_from_mut<'a>(&'a mut self, start: uint) -> &'a mut [Self::Item];
|
|
|
|
fn slice_to_mut<'a>(&'a mut self, end: uint) -> &'a mut [Self::Item];
|
|
|
|
fn iter_mut<'a>(&'a mut self) -> IterMut<'a, Self::Item>;
|
|
|
|
fn first_mut<'a>(&'a mut self) -> Option<&'a mut Self::Item>;
|
|
|
|
fn tail_mut<'a>(&'a mut self) -> &'a mut [Self::Item];
|
|
|
|
fn init_mut<'a>(&'a mut self) -> &'a mut [Self::Item];
|
|
|
|
fn last_mut<'a>(&'a mut self) -> Option<&'a mut Self::Item>;
|
|
|
|
fn split_mut<'a, P>(&'a mut self, pred: P) -> SplitMut<'a, Self::Item, P>
|
|
|
|
where P: FnMut(&Self::Item) -> bool;
|
|
|
|
fn splitn_mut<P>(&mut self, n: uint, pred: P) -> SplitNMut<Self::Item, P>
|
|
|
|
where P: FnMut(&Self::Item) -> bool;
|
|
|
|
fn rsplitn_mut<P>(&mut self, n: uint, pred: P) -> RSplitNMut<Self::Item, P>
|
|
|
|
where P: FnMut(&Self::Item) -> bool;
|
|
|
|
fn chunks_mut<'a>(&'a mut self, chunk_size: uint) -> ChunksMut<'a, Self::Item>;
|
2014-10-23 10:43:18 -05:00
|
|
|
fn swap(&mut self, a: uint, b: uint);
|
2015-01-02 08:12:27 -06:00
|
|
|
fn split_at_mut<'a>(&'a mut self, mid: uint) -> (&'a mut [Self::Item], &'a mut [Self::Item]);
|
2014-10-23 10:43:18 -05:00
|
|
|
fn reverse(&mut self);
|
2015-01-02 08:12:27 -06:00
|
|
|
unsafe fn get_unchecked_mut<'a>(&'a mut self, index: uint) -> &'a mut Self::Item;
|
|
|
|
fn as_mut_ptr(&mut self) -> *mut Self::Item;
|
|
|
|
|
|
|
|
fn position_elem(&self, t: &Self::Item) -> Option<uint> where Self::Item: PartialEq;
|
|
|
|
|
|
|
|
fn rposition_elem(&self, t: &Self::Item) -> Option<uint> where Self::Item: PartialEq;
|
|
|
|
|
|
|
|
fn contains(&self, x: &Self::Item) -> bool where Self::Item: PartialEq;
|
|
|
|
|
|
|
|
fn starts_with(&self, needle: &[Self::Item]) -> bool where Self::Item: PartialEq;
|
|
|
|
|
|
|
|
fn ends_with(&self, needle: &[Self::Item]) -> bool where Self::Item: PartialEq;
|
|
|
|
|
|
|
|
fn binary_search(&self, x: &Self::Item) -> Result<uint, uint> where Self::Item: Ord;
|
|
|
|
fn next_permutation(&mut self) -> bool where Self::Item: Ord;
|
|
|
|
fn prev_permutation(&mut self) -> bool where Self::Item: Ord;
|
|
|
|
|
|
|
|
fn clone_from_slice(&mut self, &[Self::Item]) -> uint where Self::Item: Clone;
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-11-02 19:04:32 -06:00
|
|
|
#[unstable]
|
2015-01-02 08:12:27 -06:00
|
|
|
impl<T> SliceExt for [T] {
|
|
|
|
type Item = T;
|
|
|
|
|
2014-11-02 19:04:32 -06:00
|
|
|
#[inline]
|
|
|
|
fn slice(&self, start: uint, end: uint) -> &[T] {
|
|
|
|
assert!(start <= end);
|
|
|
|
assert!(end <= self.len());
|
|
|
|
unsafe {
|
|
|
|
transmute(RawSlice {
|
|
|
|
data: self.as_ptr().offset(start as int),
|
|
|
|
len: (end - start)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn slice_from(&self, start: uint) -> &[T] {
|
|
|
|
self.slice(start, self.len())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn slice_to(&self, end: uint) -> &[T] {
|
|
|
|
self.slice(0, end)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn split_at(&self, mid: uint) -> (&[T], &[T]) {
|
|
|
|
(self[..mid], self[mid..])
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-12-19 14:52:10 -06:00
|
|
|
fn iter<'a>(&'a self) -> Iter<'a, T> {
|
2014-11-02 19:04:32 -06:00
|
|
|
unsafe {
|
|
|
|
let p = self.as_ptr();
|
|
|
|
if mem::size_of::<T>() == 0 {
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
Iter {ptr: p,
|
2014-11-02 19:04:32 -06:00
|
|
|
end: (p as uint + self.len()) as *const T,
|
|
|
|
marker: marker::ContravariantLifetime::<'a>}
|
|
|
|
} else {
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
Iter {ptr: p,
|
2014-11-02 19:04:32 -06:00
|
|
|
end: p.offset(self.len() as int),
|
|
|
|
marker: marker::ContravariantLifetime::<'a>}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn split<'a, P>(&'a self, pred: P) -> Split<'a, T, P> where P: FnMut(&T) -> bool {
|
|
|
|
Split {
|
2014-11-02 19:04:32 -06:00
|
|
|
v: self,
|
|
|
|
pred: pred,
|
|
|
|
finished: false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn splitn<'a, P>(&'a self, n: uint, pred: P) -> SplitN<'a, T, P> where
|
2014-12-04 22:47:40 -06:00
|
|
|
P: FnMut(&T) -> bool,
|
|
|
|
{
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
SplitN {
|
|
|
|
inner: GenericSplitN {
|
|
|
|
iter: self.split(pred),
|
|
|
|
count: n,
|
|
|
|
invert: false
|
|
|
|
}
|
2014-11-02 19:04:32 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn rsplitn<'a, P>(&'a self, n: uint, pred: P) -> RSplitN<'a, T, P> where
|
2014-12-04 22:47:40 -06:00
|
|
|
P: FnMut(&T) -> bool,
|
|
|
|
{
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
RSplitN {
|
|
|
|
inner: GenericSplitN {
|
|
|
|
iter: self.split(pred),
|
|
|
|
count: n,
|
|
|
|
invert: true
|
|
|
|
}
|
2014-11-02 19:04:32 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn windows(&self, size: uint) -> Windows<T> {
|
|
|
|
assert!(size != 0);
|
|
|
|
Windows { v: self, size: size }
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn chunks(&self, size: uint) -> Chunks<T> {
|
|
|
|
assert!(size != 0);
|
|
|
|
Chunks { v: self, size: size }
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn get(&self, index: uint) -> Option<&T> {
|
|
|
|
if index < self.len() { Some(&self[index]) } else { None }
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn first(&self) -> Option<&T> {
|
2014-11-02 19:04:32 -06:00
|
|
|
if self.len() == 0 { None } else { Some(&self[0]) }
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn tail(&self) -> &[T] { self[1..] }
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn init(&self) -> &[T] {
|
|
|
|
self[..self.len() - 1]
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn last(&self) -> Option<&T> {
|
|
|
|
if self.len() == 0 { None } else { Some(&self[self.len() - 1]) }
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
unsafe fn get_unchecked(&self, index: uint) -> &T {
|
2014-11-02 19:04:32 -06:00
|
|
|
transmute(self.repr().data.offset(index as int))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn as_ptr(&self) -> *const T {
|
|
|
|
self.repr().data
|
|
|
|
}
|
|
|
|
|
|
|
|
#[unstable]
|
2014-12-30 12:51:18 -06:00
|
|
|
fn binary_search_by<F>(&self, mut f: F) -> Result<uint, uint> where
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
F: FnMut(&T) -> Ordering
|
|
|
|
{
|
2014-11-02 19:04:32 -06:00
|
|
|
let mut base : uint = 0;
|
|
|
|
let mut lim : uint = self.len();
|
|
|
|
|
|
|
|
while lim != 0 {
|
|
|
|
let ix = base + (lim >> 1);
|
|
|
|
match f(&self[ix]) {
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
Equal => return Ok(ix),
|
2014-11-02 19:04:32 -06:00
|
|
|
Less => {
|
|
|
|
base = ix + 1;
|
|
|
|
lim -= 1;
|
|
|
|
}
|
|
|
|
Greater => ()
|
|
|
|
}
|
|
|
|
lim >>= 1;
|
|
|
|
}
|
2014-12-30 12:51:18 -06:00
|
|
|
Err(base)
|
2014-11-02 19:04:32 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn len(&self) -> uint { self.repr().len }
|
|
|
|
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn get_mut(&mut self, index: uint) -> Option<&mut T> {
|
2014-06-30 15:58:53 -05:00
|
|
|
if index < self.len() { Some(&mut self[index]) } else { None }
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_mut_slice(&mut self) -> &mut [T] { self }
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-10-23 10:43:18 -05:00
|
|
|
fn slice_mut(&mut self, start: uint, end: uint) -> &mut [T] {
|
2014-12-18 17:44:24 -06:00
|
|
|
ops::SliceMut::slice_or_fail_mut(self, &start, &end)
|
2014-10-02 13:48:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn slice_from_mut(&mut self, start: uint) -> &mut [T] {
|
2014-12-18 17:44:24 -06:00
|
|
|
ops::SliceMut::slice_from_or_fail_mut(self, &start)
|
2014-10-02 13:48:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn slice_to_mut(&mut self, end: uint) -> &mut [T] {
|
2014-12-18 17:44:24 -06:00
|
|
|
ops::SliceMut::slice_to_or_fail_mut(self, &end)
|
2014-10-02 13:48:07 -05:00
|
|
|
}
|
|
|
|
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn split_at_mut(&mut self, mid: uint) -> (&mut [T], &mut [T]) {
|
2014-06-30 15:58:53 -05:00
|
|
|
unsafe {
|
2014-10-23 10:43:18 -05:00
|
|
|
let self2: &mut [T] = mem::transmute_copy(&self);
|
2014-12-18 17:44:24 -06:00
|
|
|
|
|
|
|
(ops::SliceMut::slice_to_or_fail_mut(self, &mid),
|
|
|
|
ops::SliceMut::slice_from_or_fail_mut(self2, &mid))
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-12-19 14:52:10 -06:00
|
|
|
fn iter_mut<'a>(&'a mut self) -> IterMut<'a, T> {
|
2014-06-30 15:58:53 -05:00
|
|
|
unsafe {
|
|
|
|
let p = self.as_mut_ptr();
|
|
|
|
if mem::size_of::<T>() == 0 {
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
IterMut {ptr: p,
|
2014-06-30 15:58:53 -05:00
|
|
|
end: (p as uint + self.len()) as *mut T,
|
2014-12-13 22:06:44 -06:00
|
|
|
marker: marker::ContravariantLifetime::<'a>}
|
2014-06-30 15:58:53 -05:00
|
|
|
} else {
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
IterMut {ptr: p,
|
2014-06-30 15:58:53 -05:00
|
|
|
end: p.offset(self.len() as int),
|
2014-12-13 22:06:44 -06:00
|
|
|
marker: marker::ContravariantLifetime::<'a>}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn last_mut(&mut self) -> Option<&mut T> {
|
2014-06-30 15:58:53 -05:00
|
|
|
let len = self.len();
|
|
|
|
if len == 0 { return None; }
|
|
|
|
Some(&mut self[len - 1])
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
2014-09-22 18:23:00 -05:00
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn first_mut(&mut self) -> Option<&mut T> {
|
2014-09-22 18:23:00 -05:00
|
|
|
if self.len() == 0 { None } else { Some(&mut self[0]) }
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn tail_mut(&mut self) -> &mut [T] {
|
2014-12-18 17:44:24 -06:00
|
|
|
self.slice_from_mut(1)
|
2014-09-22 18:23:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn init_mut(&mut self) -> &mut [T] {
|
2014-09-22 18:23:00 -05:00
|
|
|
let len = self.len();
|
2014-12-18 17:44:24 -06:00
|
|
|
self.slice_to_mut(len-1)
|
2014-09-22 18:23:00 -05:00
|
|
|
}
|
|
|
|
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn split_mut<'a, P>(&'a mut self, pred: P) -> SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
|
|
|
|
SplitMut { v: self, pred: pred, finished: false }
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
2014-09-22 18:23:00 -05:00
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn splitn_mut<'a, P>(&'a mut self, n: uint, pred: P) -> SplitNMut<'a, T, P> where
|
2014-12-05 00:00:50 -06:00
|
|
|
P: FnMut(&T) -> bool
|
|
|
|
{
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
SplitNMut {
|
|
|
|
inner: GenericSplitN {
|
|
|
|
iter: self.split_mut(pred),
|
|
|
|
count: n,
|
|
|
|
invert: false
|
|
|
|
}
|
2014-09-22 18:23:00 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn rsplitn_mut<'a, P>(&'a mut self, n: uint, pred: P) -> RSplitNMut<'a, T, P> where
|
2014-12-05 00:00:50 -06:00
|
|
|
P: FnMut(&T) -> bool,
|
|
|
|
{
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
RSplitNMut {
|
|
|
|
inner: GenericSplitN {
|
|
|
|
iter: self.split_mut(pred),
|
|
|
|
count: n,
|
|
|
|
invert: true
|
|
|
|
}
|
2014-09-22 18:23:00 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
fn chunks_mut(&mut self, chunk_size: uint) -> ChunksMut<T> {
|
2014-06-30 15:58:53 -05:00
|
|
|
assert!(chunk_size > 0);
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
ChunksMut { v: self, chunk_size: chunk_size }
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
2014-10-23 10:43:18 -05:00
|
|
|
fn swap(&mut self, a: uint, b: uint) {
|
2014-06-30 15:58:53 -05:00
|
|
|
unsafe {
|
|
|
|
// Can't take two mutable loans from one vector, so instead just cast
|
|
|
|
// them to their raw pointers to do the swap
|
|
|
|
let pa: *mut T = &mut self[a];
|
|
|
|
let pb: *mut T = &mut self[b];
|
|
|
|
ptr::swap(pa, pb);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-10-23 10:43:18 -05:00
|
|
|
fn reverse(&mut self) {
|
2014-06-30 15:58:53 -05:00
|
|
|
let mut i: uint = 0;
|
|
|
|
let ln = self.len();
|
|
|
|
while i < ln / 2 {
|
2014-09-04 21:54:41 -05:00
|
|
|
// Unsafe swap to avoid the bounds check in safe swap.
|
|
|
|
unsafe {
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
let pa: *mut T = self.get_unchecked_mut(i);
|
|
|
|
let pb: *mut T = self.get_unchecked_mut(ln - i - 1);
|
2014-09-04 21:54:41 -05:00
|
|
|
ptr::swap(pa, pb);
|
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
i += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
unsafe fn get_unchecked_mut(&mut self, index: uint) -> &mut T {
|
2014-06-30 15:58:53 -05:00
|
|
|
transmute((self.repr().data as *mut T).offset(index as int))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_mut_ptr(&mut self) -> *mut T {
|
2014-06-30 15:58:53 -05:00
|
|
|
self.repr().data as *mut T
|
|
|
|
}
|
2014-11-02 19:04:32 -06:00
|
|
|
|
|
|
|
#[inline]
|
2015-01-02 08:12:27 -06:00
|
|
|
fn position_elem(&self, x: &T) -> Option<uint> where T: PartialEq {
|
2014-05-01 00:54:25 -05:00
|
|
|
self.iter().position(|y| *x == *y)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2015-01-02 08:12:27 -06:00
|
|
|
fn rposition_elem(&self, t: &T) -> Option<uint> where T: PartialEq {
|
2014-05-01 00:54:25 -05:00
|
|
|
self.iter().rposition(|x| *x == *t)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2015-01-02 08:12:27 -06:00
|
|
|
fn contains(&self, x: &T) -> bool where T: PartialEq {
|
2014-05-01 00:54:25 -05:00
|
|
|
self.iter().any(|elt| *x == *elt)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2015-01-02 08:12:27 -06:00
|
|
|
fn starts_with(&self, needle: &[T]) -> bool where T: PartialEq {
|
2014-05-01 00:54:25 -05:00
|
|
|
let n = needle.len();
|
2014-10-23 10:43:18 -05:00
|
|
|
self.len() >= n && needle == self[..n]
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2015-01-02 08:12:27 -06:00
|
|
|
fn ends_with(&self, needle: &[T]) -> bool where T: PartialEq {
|
2014-05-01 00:54:25 -05:00
|
|
|
let (m, n) = (self.len(), needle.len());
|
2014-10-23 10:43:18 -05:00
|
|
|
m >= n && needle == self[m-n..]
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
2014-08-06 22:48:25 -05:00
|
|
|
#[unstable]
|
2015-01-02 08:12:27 -06:00
|
|
|
fn binary_search(&self, x: &T) -> Result<uint, uint> where T: Ord {
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
self.binary_search_by(|p| p.cmp(x))
|
2014-08-06 22:48:25 -05:00
|
|
|
}
|
2014-11-02 19:04:32 -06:00
|
|
|
|
|
|
|
#[experimental]
|
2015-01-02 08:12:27 -06:00
|
|
|
fn next_permutation(&mut self) -> bool where T: Ord {
|
2014-11-02 19:04:32 -06:00
|
|
|
// These cases only have 1 permutation each, so we can't do anything.
|
|
|
|
if self.len() < 2 { return false; }
|
|
|
|
|
|
|
|
// Step 1: Identify the longest, rightmost weakly decreasing part of the vector
|
|
|
|
let mut i = self.len() - 1;
|
|
|
|
while i > 0 && self[i-1] >= self[i] {
|
|
|
|
i -= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If that is the entire vector, this is the last-ordered permutation.
|
|
|
|
if i == 0 {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Step 2: Find the rightmost element larger than the pivot (i-1)
|
|
|
|
let mut j = self.len() - 1;
|
|
|
|
while j >= i && self[j] <= self[i-1] {
|
|
|
|
j -= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Step 3: Swap that element with the pivot
|
|
|
|
self.swap(j, i-1);
|
|
|
|
|
|
|
|
// Step 4: Reverse the (previously) weakly decreasing part
|
2014-12-18 17:44:24 -06:00
|
|
|
self.slice_from_mut(i).reverse();
|
2014-11-02 19:04:32 -06:00
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
|
|
|
#[experimental]
|
2015-01-02 08:12:27 -06:00
|
|
|
fn prev_permutation(&mut self) -> bool where T: Ord {
|
2014-11-02 19:04:32 -06:00
|
|
|
// These cases only have 1 permutation each, so we can't do anything.
|
|
|
|
if self.len() < 2 { return false; }
|
|
|
|
|
|
|
|
// Step 1: Identify the longest, rightmost weakly increasing part of the vector
|
|
|
|
let mut i = self.len() - 1;
|
|
|
|
while i > 0 && self[i-1] <= self[i] {
|
|
|
|
i -= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If that is the entire vector, this is the first-ordered permutation.
|
|
|
|
if i == 0 {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Step 2: Reverse the weakly increasing part
|
2014-12-18 17:44:24 -06:00
|
|
|
self.slice_from_mut(i).reverse();
|
2014-11-02 19:04:32 -06:00
|
|
|
|
|
|
|
// Step 3: Find the rightmost element equal to or bigger than the pivot (i-1)
|
|
|
|
let mut j = self.len() - 1;
|
|
|
|
while j >= i && self[j-1] < self[i-1] {
|
|
|
|
j -= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Step 4: Swap that element with the pivot
|
|
|
|
self.swap(i-1, j);
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
2015-01-02 08:12:27 -06:00
|
|
|
fn clone_from_slice(&mut self, src: &[T]) -> uint where T: Clone {
|
2014-10-11 18:17:11 -05:00
|
|
|
let min = cmp::min(self.len(), src.len());
|
|
|
|
let dst = self.slice_to_mut(min);
|
|
|
|
let src = src.slice_to(min);
|
|
|
|
for i in range(0, min) {
|
|
|
|
dst[i].clone_from(&src[i]);
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
2014-10-11 18:17:11 -05:00
|
|
|
min
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2015-01-03 08:46:29 -06:00
|
|
|
impl<T> ops::Index<uint> for [T] {
|
|
|
|
type Output = T;
|
|
|
|
|
|
|
|
fn index(&self, &index: &uint) -> &T {
|
|
|
|
assert!(index < self.len());
|
|
|
|
|
|
|
|
unsafe { mem::transmute(self.repr().data.offset(index as int)) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> ops::IndexMut<uint> for [T] {
|
|
|
|
type Output = T;
|
|
|
|
|
|
|
|
fn index_mut(&mut self, &index: &uint) -> &mut T {
|
|
|
|
assert!(index < self.len());
|
|
|
|
|
|
|
|
unsafe { mem::transmute(self.repr().data.offset(index as int)) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-02 08:12:27 -06:00
|
|
|
impl<T> ops::Slice<uint, [T]> for [T] {
|
|
|
|
#[inline]
|
|
|
|
fn as_slice_<'a>(&'a self) -> &'a [T] {
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn slice_from_or_fail<'a>(&'a self, start: &uint) -> &'a [T] {
|
|
|
|
self.slice_or_fail(start, &self.len())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn slice_to_or_fail<'a>(&'a self, end: &uint) -> &'a [T] {
|
|
|
|
self.slice_or_fail(&0, end)
|
|
|
|
}
|
|
|
|
#[inline]
|
|
|
|
fn slice_or_fail<'a>(&'a self, start: &uint, end: &uint) -> &'a [T] {
|
|
|
|
assert!(*start <= *end);
|
|
|
|
assert!(*end <= self.len());
|
|
|
|
unsafe {
|
|
|
|
transmute(RawSlice {
|
|
|
|
data: self.as_ptr().offset(*start as int),
|
|
|
|
len: (*end - *start)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> ops::SliceMut<uint, [T]> for [T] {
|
|
|
|
#[inline]
|
|
|
|
fn as_mut_slice_<'a>(&'a mut self) -> &'a mut [T] {
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn slice_from_or_fail_mut<'a>(&'a mut self, start: &uint) -> &'a mut [T] {
|
|
|
|
let len = &self.len();
|
|
|
|
self.slice_or_fail_mut(start, len)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn slice_to_or_fail_mut<'a>(&'a mut self, end: &uint) -> &'a mut [T] {
|
|
|
|
self.slice_or_fail_mut(&0, end)
|
|
|
|
}
|
|
|
|
#[inline]
|
|
|
|
fn slice_or_fail_mut<'a>(&'a mut self, start: &uint, end: &uint) -> &'a mut [T] {
|
|
|
|
assert!(*start <= *end);
|
|
|
|
assert!(*end <= self.len());
|
|
|
|
unsafe {
|
|
|
|
transmute(RawSlice {
|
|
|
|
data: self.as_ptr().offset(*start as int),
|
|
|
|
len: (*end - *start)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2014-06-30 15:58:53 -05:00
|
|
|
// Common traits
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-09-22 18:23:00 -05:00
|
|
|
/// Data that is viewable as a slice.
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[experimental = "will be replaced by slice syntax"]
|
2015-01-04 20:39:02 -06:00
|
|
|
pub trait AsSlice<T> {
|
2014-06-30 15:58:53 -05:00
|
|
|
/// Work with `self` as a slice.
|
|
|
|
fn as_slice<'a>(&'a self) -> &'a [T];
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[experimental = "trait is experimental"]
|
2014-11-04 17:31:46 -06:00
|
|
|
impl<T> AsSlice<T> for [T] {
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline(always)]
|
2014-11-04 17:31:46 -06:00
|
|
|
fn as_slice<'a>(&'a self) -> &'a [T] { self }
|
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[experimental = "trait is experimental"]
|
2015-01-05 15:16:49 -06:00
|
|
|
impl<'a, T, U: ?Sized + AsSlice<T>> AsSlice<T> for &'a U {
|
2014-11-04 17:31:46 -06:00
|
|
|
#[inline(always)]
|
2014-12-12 10:09:32 -06:00
|
|
|
fn as_slice(&self) -> &[T] { AsSlice::as_slice(*self) }
|
2014-11-04 17:31:46 -06:00
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[experimental = "trait is experimental"]
|
2015-01-05 15:16:49 -06:00
|
|
|
impl<'a, T, U: ?Sized + AsSlice<T>> AsSlice<T> for &'a mut U {
|
2014-11-04 17:31:46 -06:00
|
|
|
#[inline(always)]
|
2014-12-12 10:09:32 -06:00
|
|
|
fn as_slice(&self) -> &[T] { AsSlice::as_slice(*self) }
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
|
2014-12-15 22:04:52 -06:00
|
|
|
#[stable]
|
2014-06-30 15:58:53 -05:00
|
|
|
impl<'a, T> Default for &'a [T] {
|
2014-12-15 22:04:52 -06:00
|
|
|
#[stable]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn default() -> &'a [T] { &[] }
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Iterators
|
|
|
|
//
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
// The shared definition of the `Iter` and `IterMut` iterators
|
2014-06-30 15:58:53 -05:00
|
|
|
macro_rules! iterator {
|
|
|
|
(struct $name:ident -> $ptr:ty, $elem:ty) => {
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> Iterator for $name<'a, T> {
|
|
|
|
type Item = $elem;
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
|
|
|
fn next(&mut self) -> Option<$elem> {
|
|
|
|
// could be implemented with slices, but this avoids bounds checks
|
|
|
|
unsafe {
|
|
|
|
if self.ptr == self.end {
|
|
|
|
None
|
|
|
|
} else {
|
2014-07-04 17:29:47 -05:00
|
|
|
if mem::size_of::<T>() == 0 {
|
2014-06-30 15:58:53 -05:00
|
|
|
// purposefully don't use 'ptr.offset' because for
|
|
|
|
// vectors with 0-size elements this would return the
|
|
|
|
// same pointer.
|
2014-07-04 17:29:47 -05:00
|
|
|
self.ptr = transmute(self.ptr as uint + 1);
|
|
|
|
|
|
|
|
// Use a non-null pointer value
|
|
|
|
Some(transmute(1u))
|
2014-06-30 15:58:53 -05:00
|
|
|
} else {
|
2014-07-04 17:29:47 -05:00
|
|
|
let old = self.ptr;
|
|
|
|
self.ptr = self.ptr.offset(1);
|
2014-06-30 15:58:53 -05:00
|
|
|
|
2014-07-04 17:29:47 -05:00
|
|
|
Some(transmute(old))
|
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
|
|
|
let diff = (self.end as uint) - (self.ptr as uint);
|
|
|
|
let size = mem::size_of::<T>();
|
|
|
|
let exact = diff / (if size == 0 {1} else {size});
|
|
|
|
(exact, Some(exact))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> DoubleEndedIterator for $name<'a, T> {
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
|
|
|
fn next_back(&mut self) -> Option<$elem> {
|
|
|
|
// could be implemented with slices, but this avoids bounds checks
|
|
|
|
unsafe {
|
|
|
|
if self.end == self.ptr {
|
|
|
|
None
|
|
|
|
} else {
|
2014-07-04 17:29:47 -05:00
|
|
|
if mem::size_of::<T>() == 0 {
|
2014-06-30 15:58:53 -05:00
|
|
|
// See above for why 'ptr.offset' isn't used
|
2014-07-04 17:29:47 -05:00
|
|
|
self.end = transmute(self.end as uint - 1);
|
|
|
|
|
|
|
|
// Use a non-null pointer value
|
|
|
|
Some(transmute(1u))
|
2014-06-30 15:58:53 -05:00
|
|
|
} else {
|
2014-07-04 17:29:47 -05:00
|
|
|
self.end = self.end.offset(-1);
|
|
|
|
|
|
|
|
Some(transmute(self.end))
|
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-14 21:44:55 -06:00
|
|
|
macro_rules! make_slice {
|
|
|
|
($t: ty -> $result: ty: $start: expr, $end: expr) => {{
|
|
|
|
let diff = $end as uint - $start as uint;
|
|
|
|
let len = if mem::size_of::<T>() == 0 {
|
|
|
|
diff
|
|
|
|
} else {
|
|
|
|
diff / mem::size_of::<$t>()
|
|
|
|
};
|
|
|
|
unsafe {
|
|
|
|
transmute::<_, $result>(RawSlice { data: $start as *const T, len: len })
|
|
|
|
}
|
|
|
|
}}
|
|
|
|
}
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
/// Immutable slice iterator
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[stable]
|
2014-12-19 14:52:10 -06:00
|
|
|
pub struct Iter<'a, T: 'a> {
|
2014-06-30 15:58:53 -05:00
|
|
|
ptr: *const T,
|
|
|
|
end: *const T,
|
|
|
|
marker: marker::ContravariantLifetime<'a>
|
|
|
|
}
|
|
|
|
|
2014-11-14 21:44:55 -06:00
|
|
|
#[experimental]
|
2014-12-19 14:52:10 -06:00
|
|
|
impl<'a, T> ops::Slice<uint, [T]> for Iter<'a, T> {
|
2014-11-14 21:44:55 -06:00
|
|
|
fn as_slice_(&self) -> &[T] {
|
|
|
|
self.as_slice()
|
|
|
|
}
|
|
|
|
fn slice_from_or_fail<'b>(&'b self, from: &uint) -> &'b [T] {
|
|
|
|
use ops::Slice;
|
|
|
|
self.as_slice().slice_from_or_fail(from)
|
|
|
|
}
|
|
|
|
fn slice_to_or_fail<'b>(&'b self, to: &uint) -> &'b [T] {
|
|
|
|
use ops::Slice;
|
|
|
|
self.as_slice().slice_to_or_fail(to)
|
|
|
|
}
|
|
|
|
fn slice_or_fail<'b>(&'b self, from: &uint, to: &uint) -> &'b [T] {
|
|
|
|
use ops::Slice;
|
|
|
|
self.as_slice().slice_or_fail(from, to)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-19 14:52:10 -06:00
|
|
|
impl<'a, T> Iter<'a, T> {
|
2014-11-14 21:44:55 -06:00
|
|
|
/// View the underlying data as a subslice of the original data.
|
|
|
|
///
|
|
|
|
/// This has the same lifetime as the original slice, and so the
|
|
|
|
/// iterator can continue to be used while this exists.
|
|
|
|
#[experimental]
|
|
|
|
pub fn as_slice(&self) -> &'a [T] {
|
|
|
|
make_slice!(T -> &'a [T]: self.ptr, self.end)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-19 14:52:10 -06:00
|
|
|
impl<'a,T> Copy for Iter<'a,T> {}
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
|
2014-12-19 14:52:10 -06:00
|
|
|
iterator!{struct Iter -> *const T, &'a T}
|
2014-06-30 15:58:53 -05:00
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
|
2014-06-30 15:58:53 -05:00
|
|
|
|
2014-12-20 08:28:20 -06:00
|
|
|
#[stable]
|
2014-12-19 14:52:10 -06:00
|
|
|
impl<'a, T> Clone for Iter<'a, T> {
|
|
|
|
fn clone(&self) -> Iter<'a, T> { *self }
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[experimental = "trait is experimental"]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> RandomAccessIterator for Iter<'a, T> {
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn indexable(&self) -> uint {
|
|
|
|
let (exact, _) = self.size_hint();
|
|
|
|
exact
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
|
|
|
fn idx(&mut self, index: uint) -> Option<&'a T> {
|
2014-05-01 00:54:25 -05:00
|
|
|
unsafe {
|
2014-06-30 15:58:53 -05:00
|
|
|
if index < self.indexable() {
|
2014-07-04 17:29:47 -05:00
|
|
|
if mem::size_of::<T>() == 0 {
|
|
|
|
// Use a non-null pointer value
|
|
|
|
Some(transmute(1u))
|
|
|
|
} else {
|
|
|
|
Some(transmute(self.ptr.offset(index as int)))
|
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-22 18:23:00 -05:00
|
|
|
/// Mutable slice iterator.
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[stable]
|
2014-12-19 14:52:10 -06:00
|
|
|
pub struct IterMut<'a, T: 'a> {
|
2014-06-30 15:58:53 -05:00
|
|
|
ptr: *mut T,
|
|
|
|
end: *mut T,
|
|
|
|
marker: marker::ContravariantLifetime<'a>,
|
|
|
|
}
|
|
|
|
|
2014-11-14 21:44:55 -06:00
|
|
|
#[experimental]
|
2014-12-19 14:52:10 -06:00
|
|
|
impl<'a, T> ops::Slice<uint, [T]> for IterMut<'a, T> {
|
2014-11-14 21:44:55 -06:00
|
|
|
fn as_slice_<'b>(&'b self) -> &'b [T] {
|
|
|
|
make_slice!(T -> &'b [T]: self.ptr, self.end)
|
|
|
|
}
|
|
|
|
fn slice_from_or_fail<'b>(&'b self, from: &uint) -> &'b [T] {
|
|
|
|
use ops::Slice;
|
|
|
|
self.as_slice_().slice_from_or_fail(from)
|
|
|
|
}
|
|
|
|
fn slice_to_or_fail<'b>(&'b self, to: &uint) -> &'b [T] {
|
|
|
|
use ops::Slice;
|
|
|
|
self.as_slice_().slice_to_or_fail(to)
|
|
|
|
}
|
|
|
|
fn slice_or_fail<'b>(&'b self, from: &uint, to: &uint) -> &'b [T] {
|
|
|
|
use ops::Slice;
|
|
|
|
self.as_slice_().slice_or_fail(from, to)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[experimental]
|
2014-12-19 14:52:10 -06:00
|
|
|
impl<'a, T> ops::SliceMut<uint, [T]> for IterMut<'a, T> {
|
2014-11-14 21:44:55 -06:00
|
|
|
fn as_mut_slice_<'b>(&'b mut self) -> &'b mut [T] {
|
|
|
|
make_slice!(T -> &'b mut [T]: self.ptr, self.end)
|
|
|
|
}
|
|
|
|
fn slice_from_or_fail_mut<'b>(&'b mut self, from: &uint) -> &'b mut [T] {
|
|
|
|
use ops::SliceMut;
|
|
|
|
self.as_mut_slice_().slice_from_or_fail_mut(from)
|
|
|
|
}
|
|
|
|
fn slice_to_or_fail_mut<'b>(&'b mut self, to: &uint) -> &'b mut [T] {
|
|
|
|
use ops::SliceMut;
|
|
|
|
self.as_mut_slice_().slice_to_or_fail_mut(to)
|
|
|
|
}
|
|
|
|
fn slice_or_fail_mut<'b>(&'b mut self, from: &uint, to: &uint) -> &'b mut [T] {
|
|
|
|
use ops::SliceMut;
|
|
|
|
self.as_mut_slice_().slice_or_fail_mut(from, to)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-19 14:52:10 -06:00
|
|
|
impl<'a, T> IterMut<'a, T> {
|
2014-11-14 21:44:55 -06:00
|
|
|
/// View the underlying data as a subslice of the original data.
|
|
|
|
///
|
|
|
|
/// To avoid creating `&mut` references that alias, this is forced
|
|
|
|
/// to consume the iterator. Consider using the `Slice` and
|
|
|
|
/// `SliceMut` implementations for obtaining slices with more
|
|
|
|
/// restricted lifetimes that do not consume the iterator.
|
|
|
|
#[experimental]
|
|
|
|
pub fn into_slice(self) -> &'a mut [T] {
|
|
|
|
make_slice!(T -> &'a mut [T]: self.ptr, self.end)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-19 14:52:10 -06:00
|
|
|
iterator!{struct IterMut -> *mut T, &'a mut T}
|
2014-06-30 15:58:53 -05:00
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
|
2014-06-30 15:58:53 -05:00
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
/// An internal abstraction over the splitting iterators, so that
|
|
|
|
/// splitn, splitn_mut etc can be implemented once.
|
2014-12-29 15:18:41 -06:00
|
|
|
trait SplitIter: DoubleEndedIterator {
|
2014-09-22 18:23:00 -05:00
|
|
|
/// Mark the underlying iterator as complete, extracting the remaining
|
|
|
|
/// portion of the slice.
|
2014-12-29 15:18:41 -06:00
|
|
|
fn finish(&mut self) -> Option< <Self as Iterator>::Item>;
|
2014-09-22 18:23:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/// An iterator over subslices separated by elements that match a predicate
|
|
|
|
/// function.
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[stable]
|
|
|
|
pub struct Split<'a, T:'a, P> where P: FnMut(&T) -> bool {
|
2014-08-27 20:46:52 -05:00
|
|
|
v: &'a [T],
|
2014-12-04 22:47:40 -06:00
|
|
|
pred: P,
|
2014-08-27 20:46:52 -05:00
|
|
|
finished: bool
|
|
|
|
}
|
|
|
|
|
2015-01-03 21:54:18 -06:00
|
|
|
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
|
2014-12-20 02:35:06 -06:00
|
|
|
#[stable]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
impl<'a, T, P> Clone for Split<'a, T, P> where P: Clone + FnMut(&T) -> bool {
|
|
|
|
fn clone(&self) -> Split<'a, T, P> {
|
|
|
|
Split {
|
2014-12-13 21:04:23 -06:00
|
|
|
v: self.v,
|
|
|
|
pred: self.pred.clone(),
|
|
|
|
finished: self.finished,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T, P> Iterator for Split<'a, T, P> where P: FnMut(&T) -> bool {
|
|
|
|
type Item = &'a [T];
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
|
|
|
fn next(&mut self) -> Option<&'a [T]> {
|
|
|
|
if self.finished { return None; }
|
|
|
|
|
|
|
|
match self.v.iter().position(|x| (self.pred)(x)) {
|
2014-09-22 18:23:00 -05:00
|
|
|
None => self.finish(),
|
2014-06-30 15:58:53 -05:00
|
|
|
Some(idx) => {
|
2014-09-24 06:41:09 -05:00
|
|
|
let ret = Some(self.v[..idx]);
|
|
|
|
self.v = self.v[idx + 1..];
|
2014-06-30 15:58:53 -05:00
|
|
|
ret
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
|
|
|
if self.finished {
|
|
|
|
(0, Some(0))
|
|
|
|
} else {
|
|
|
|
(1, Some(self.v.len() + 1))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T, P> DoubleEndedIterator for Split<'a, T, P> where P: FnMut(&T) -> bool {
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
|
|
|
fn next_back(&mut self) -> Option<&'a [T]> {
|
|
|
|
if self.finished { return None; }
|
|
|
|
|
|
|
|
match self.v.iter().rposition(|x| (self.pred)(x)) {
|
2014-09-22 18:23:00 -05:00
|
|
|
None => self.finish(),
|
2014-06-30 15:58:53 -05:00
|
|
|
Some(idx) => {
|
2014-09-24 06:41:09 -05:00
|
|
|
let ret = Some(self.v[idx + 1..]);
|
|
|
|
self.v = self.v[..idx];
|
2014-06-30 15:58:53 -05:00
|
|
|
ret
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T, P> SplitIter for Split<'a, T, P> where P: FnMut(&T) -> bool {
|
2014-09-22 18:23:00 -05:00
|
|
|
#[inline]
|
|
|
|
fn finish(&mut self) -> Option<&'a [T]> {
|
|
|
|
if self.finished { None } else { self.finished = true; Some(self.v) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
/// An iterator over the subslices of the vector which are separated
|
|
|
|
/// by elements that match `pred`.
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[stable]
|
|
|
|
pub struct SplitMut<'a, T:'a, P> where P: FnMut(&T) -> bool {
|
2014-08-27 20:46:52 -05:00
|
|
|
v: &'a mut [T],
|
2014-12-05 00:00:50 -06:00
|
|
|
pred: P,
|
2014-08-27 20:46:52 -05:00
|
|
|
finished: bool
|
|
|
|
}
|
|
|
|
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T, P> SplitIter for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
|
2014-09-22 18:23:00 -05:00
|
|
|
#[inline]
|
|
|
|
fn finish(&mut self) -> Option<&'a mut [T]> {
|
|
|
|
if self.finished {
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
self.finished = true;
|
|
|
|
Some(mem::replace(&mut self.v, &mut []))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T, P> Iterator for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
|
|
|
|
type Item = &'a mut [T];
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
|
|
|
fn next(&mut self) -> Option<&'a mut [T]> {
|
|
|
|
if self.finished { return None; }
|
|
|
|
|
2014-09-22 18:23:00 -05:00
|
|
|
let idx_opt = { // work around borrowck limitations
|
|
|
|
let pred = &mut self.pred;
|
|
|
|
self.v.iter().position(|x| (*pred)(x))
|
|
|
|
};
|
|
|
|
match idx_opt {
|
|
|
|
None => self.finish(),
|
2014-06-30 15:58:53 -05:00
|
|
|
Some(idx) => {
|
|
|
|
let tmp = mem::replace(&mut self.v, &mut []);
|
2014-09-14 22:27:36 -05:00
|
|
|
let (head, tail) = tmp.split_at_mut(idx);
|
2014-12-18 16:47:48 -06:00
|
|
|
self.v = tail.slice_from_mut(1);
|
2014-06-30 15:58:53 -05:00
|
|
|
Some(head)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
|
|
|
if self.finished {
|
|
|
|
(0, Some(0))
|
|
|
|
} else {
|
|
|
|
// if the predicate doesn't match anything, we yield one slice
|
|
|
|
// if it matches every element, we yield len+1 empty slices.
|
|
|
|
(1, Some(self.v.len() + 1))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T, P> DoubleEndedIterator for SplitMut<'a, T, P> where
|
2014-12-05 00:00:50 -06:00
|
|
|
P: FnMut(&T) -> bool,
|
|
|
|
{
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
|
|
|
fn next_back(&mut self) -> Option<&'a mut [T]> {
|
|
|
|
if self.finished { return None; }
|
|
|
|
|
2014-09-22 18:23:00 -05:00
|
|
|
let idx_opt = { // work around borrowck limitations
|
|
|
|
let pred = &mut self.pred;
|
|
|
|
self.v.iter().rposition(|x| (*pred)(x))
|
|
|
|
};
|
|
|
|
match idx_opt {
|
|
|
|
None => self.finish(),
|
2014-06-30 15:58:53 -05:00
|
|
|
Some(idx) => {
|
|
|
|
let tmp = mem::replace(&mut self.v, &mut []);
|
2014-09-14 22:27:36 -05:00
|
|
|
let (head, tail) = tmp.split_at_mut(idx);
|
2014-06-30 15:58:53 -05:00
|
|
|
self.v = head;
|
2014-12-18 16:47:48 -06:00
|
|
|
Some(tail.slice_from_mut(1))
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
/// An private iterator over subslices separated by elements that
|
|
|
|
/// match a predicate function, splitting at most a fixed number of
|
|
|
|
/// times.
|
|
|
|
struct GenericSplitN<I> {
|
2014-09-22 18:23:00 -05:00
|
|
|
iter: I,
|
2014-08-27 20:46:52 -05:00
|
|
|
count: uint,
|
|
|
|
invert: bool
|
|
|
|
}
|
|
|
|
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<T, I: SplitIter + Iterator<Item=T>> Iterator for GenericSplitN<I> {
|
|
|
|
type Item = T;
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
2014-12-29 15:18:41 -06:00
|
|
|
fn next(&mut self) -> Option<T> {
|
2014-06-30 15:58:53 -05:00
|
|
|
if self.count == 0 {
|
2014-09-22 18:23:00 -05:00
|
|
|
self.iter.finish()
|
2014-06-30 15:58:53 -05:00
|
|
|
} else {
|
|
|
|
self.count -= 1;
|
|
|
|
if self.invert { self.iter.next_back() } else { self.iter.next() }
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
2014-09-22 18:23:00 -05:00
|
|
|
let (lower, upper_opt) = self.iter.size_hint();
|
|
|
|
(lower, upper_opt.map(|upper| cmp::min(self.count + 1, upper)))
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
/// An iterator over subslices separated by elements that match a predicate
|
|
|
|
/// function, limited to a given number of splits.
|
2015-01-04 17:53:00 -06:00
|
|
|
#[stable]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
pub struct SplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
|
|
|
|
inner: GenericSplitN<Split<'a, T, P>>
|
|
|
|
}
|
|
|
|
|
|
|
|
/// An iterator over subslices separated by elements that match a
|
|
|
|
/// predicate function, limited to a given number of splits, starting
|
|
|
|
/// from the end of the slice.
|
2015-01-04 17:53:00 -06:00
|
|
|
#[stable]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
pub struct RSplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
|
|
|
|
inner: GenericSplitN<Split<'a, T, P>>
|
|
|
|
}
|
|
|
|
|
|
|
|
/// An iterator over subslices separated by elements that match a predicate
|
|
|
|
/// function, limited to a given number of splits.
|
2015-01-04 17:53:00 -06:00
|
|
|
#[stable]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
pub struct SplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
|
|
|
|
inner: GenericSplitN<SplitMut<'a, T, P>>
|
|
|
|
}
|
|
|
|
|
|
|
|
/// An iterator over subslices separated by elements that match a
|
|
|
|
/// predicate function, limited to a given number of splits, starting
|
|
|
|
/// from the end of the slice.
|
2015-01-04 17:53:00 -06:00
|
|
|
#[stable]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
pub struct RSplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
|
|
|
|
inner: GenericSplitN<SplitMut<'a, T, P>>
|
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! forward_iterator {
|
|
|
|
($name:ident: $elem:ident, $iter_of:ty) => {
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, $elem, P> Iterator for $name<'a, $elem, P> where
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
P: FnMut(&T) -> bool
|
|
|
|
{
|
2014-12-29 15:18:41 -06:00
|
|
|
type Item = $iter_of;
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[inline]
|
|
|
|
fn next(&mut self) -> Option<$iter_of> {
|
|
|
|
self.inner.next()
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
|
|
|
self.inner.size_hint()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
forward_iterator! { SplitN: T, &'a [T] }
|
|
|
|
forward_iterator! { RSplitN: T, &'a [T] }
|
|
|
|
forward_iterator! { SplitNMut: T, &'a mut [T] }
|
|
|
|
forward_iterator! { RSplitNMut: T, &'a mut [T] }
|
|
|
|
|
2014-09-22 18:23:00 -05:00
|
|
|
/// An iterator over overlapping subslices of length `size`.
|
2015-01-03 21:54:18 -06:00
|
|
|
#[derive(Clone)]
|
2015-01-04 17:53:00 -06:00
|
|
|
#[stable]
|
2014-08-27 20:46:52 -05:00
|
|
|
pub struct Windows<'a, T:'a> {
|
|
|
|
v: &'a [T],
|
|
|
|
size: uint
|
|
|
|
}
|
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> Iterator for Windows<'a, T> {
|
|
|
|
type Item = &'a [T];
|
|
|
|
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn next(&mut self) -> Option<&'a [T]> {
|
|
|
|
if self.size > self.v.len() {
|
|
|
|
None
|
|
|
|
} else {
|
2014-09-24 06:41:09 -05:00
|
|
|
let ret = Some(self.v[..self.size]);
|
|
|
|
self.v = self.v[1..];
|
2014-06-30 15:58:53 -05:00
|
|
|
ret
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
|
|
|
if self.size > self.v.len() {
|
|
|
|
(0, Some(0))
|
|
|
|
} else {
|
|
|
|
let x = self.v.len() - self.size;
|
2014-11-09 07:11:28 -06:00
|
|
|
(x.saturating_add(1), x.checked_add(1u))
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
|
2014-09-22 18:23:00 -05:00
|
|
|
/// An iterator over a slice in (non-overlapping) chunks (`size` elements at a
|
|
|
|
/// time).
|
2014-06-30 15:58:53 -05:00
|
|
|
///
|
2014-09-22 18:23:00 -05:00
|
|
|
/// When the slice len is not evenly divided by the chunk size, the last slice
|
|
|
|
/// of the iteration will be the remainder.
|
2015-01-03 21:54:18 -06:00
|
|
|
#[derive(Clone)]
|
2015-01-04 17:53:00 -06:00
|
|
|
#[stable]
|
2014-08-27 20:46:52 -05:00
|
|
|
pub struct Chunks<'a, T:'a> {
|
|
|
|
v: &'a [T],
|
|
|
|
size: uint
|
|
|
|
}
|
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> Iterator for Chunks<'a, T> {
|
|
|
|
type Item = &'a [T];
|
|
|
|
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn next(&mut self) -> Option<&'a [T]> {
|
|
|
|
if self.v.len() == 0 {
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
let chunksz = cmp::min(self.v.len(), self.size);
|
2014-08-01 21:59:54 -05:00
|
|
|
let (fst, snd) = self.v.split_at(chunksz);
|
2014-06-30 15:58:53 -05:00
|
|
|
self.v = snd;
|
|
|
|
Some(fst)
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
|
|
|
if self.v.len() == 0 {
|
|
|
|
(0, Some(0))
|
|
|
|
} else {
|
2014-11-18 22:22:13 -06:00
|
|
|
let n = self.v.len() / self.size;
|
|
|
|
let rem = self.v.len() % self.size;
|
2014-06-30 15:58:53 -05:00
|
|
|
let n = if rem > 0 { n+1 } else { n };
|
|
|
|
(n, Some(n))
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> DoubleEndedIterator for Chunks<'a, T> {
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn next_back(&mut self) -> Option<&'a [T]> {
|
|
|
|
if self.v.len() == 0 {
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
let remainder = self.v.len() % self.size;
|
|
|
|
let chunksz = if remainder != 0 { remainder } else { self.size };
|
2014-08-01 21:59:54 -05:00
|
|
|
let (fst, snd) = self.v.split_at(self.v.len() - chunksz);
|
2014-06-30 15:58:53 -05:00
|
|
|
self.v = fst;
|
|
|
|
Some(snd)
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[experimental = "trait is experimental"]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> RandomAccessIterator for Chunks<'a, T> {
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn indexable(&self) -> uint {
|
|
|
|
self.v.len()/self.size + if self.v.len() % self.size != 0 { 1 } else { 0 }
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
|
|
|
fn idx(&mut self, index: uint) -> Option<&'a [T]> {
|
|
|
|
if index < self.indexable() {
|
|
|
|
let lo = index * self.size;
|
|
|
|
let mut hi = lo + self.size;
|
|
|
|
if hi < lo || hi > self.v.len() { hi = self.v.len(); }
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-09-24 06:41:09 -05:00
|
|
|
Some(self.v[lo..hi])
|
2014-06-30 15:58:53 -05:00
|
|
|
} else {
|
|
|
|
None
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-09-22 18:23:00 -05:00
|
|
|
/// An iterator over a slice in (non-overlapping) mutable chunks (`size`
|
|
|
|
/// elements at a time). When the slice len is not evenly divided by the chunk
|
|
|
|
/// size, the last slice of the iteration will be the remainder.
|
2015-01-04 17:53:00 -06:00
|
|
|
#[stable]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
pub struct ChunksMut<'a, T:'a> {
|
2014-08-27 20:46:52 -05:00
|
|
|
v: &'a mut [T],
|
|
|
|
chunk_size: uint
|
|
|
|
}
|
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> Iterator for ChunksMut<'a, T> {
|
|
|
|
type Item = &'a mut [T];
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
#[inline]
|
|
|
|
fn next(&mut self) -> Option<&'a mut [T]> {
|
|
|
|
if self.v.len() == 0 {
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
let sz = cmp::min(self.v.len(), self.chunk_size);
|
|
|
|
let tmp = mem::replace(&mut self.v, &mut []);
|
2014-09-14 22:27:36 -05:00
|
|
|
let (head, tail) = tmp.split_at_mut(sz);
|
2014-06-30 15:58:53 -05:00
|
|
|
self.v = tail;
|
|
|
|
Some(head)
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
|
|
|
if self.v.len() == 0 {
|
|
|
|
(0, Some(0))
|
|
|
|
} else {
|
2014-11-18 22:22:13 -06:00
|
|
|
let n = self.v.len() / self.chunk_size;
|
|
|
|
let rem = self.v.len() % self.chunk_size;
|
2014-06-30 15:58:53 -05:00
|
|
|
let n = if rem > 0 { n + 1 } else { n };
|
|
|
|
(n, Some(n))
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2015-01-04 18:16:55 -06:00
|
|
|
#[stable]
|
2014-12-29 15:18:41 -06:00
|
|
|
impl<'a, T> DoubleEndedIterator for ChunksMut<'a, T> {
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
2014-06-30 15:58:53 -05:00
|
|
|
fn next_back(&mut self) -> Option<&'a mut [T]> {
|
|
|
|
if self.v.len() == 0 {
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
let remainder = self.v.len() % self.chunk_size;
|
|
|
|
let sz = if remainder != 0 { remainder } else { self.chunk_size };
|
|
|
|
let tmp = mem::replace(&mut self.v, &mut []);
|
|
|
|
let tmp_len = tmp.len();
|
2014-09-14 22:27:36 -05:00
|
|
|
let (head, tail) = tmp.split_at_mut(tmp_len - sz);
|
2014-06-30 15:58:53 -05:00
|
|
|
self.v = head;
|
|
|
|
Some(tail)
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
//
|
|
|
|
// Free functions
|
|
|
|
//
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// Converts a pointer to A into a slice of length 1 (without copying).
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[unstable]
|
2014-06-30 15:58:53 -05:00
|
|
|
pub fn ref_slice<'a, A>(s: &'a A) -> &'a [A] {
|
|
|
|
unsafe {
|
2014-08-06 22:03:55 -05:00
|
|
|
transmute(RawSlice { data: s, len: 1 })
|
2014-06-30 15:58:53 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// Converts a pointer to A into a slice of length 1 (without copying).
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[unstable]
|
2014-06-30 15:58:53 -05:00
|
|
|
pub fn mut_ref_slice<'a, A>(s: &'a mut A) -> &'a mut [A] {
|
|
|
|
unsafe {
|
|
|
|
let ptr: *const A = transmute(s);
|
2014-08-06 22:03:55 -05:00
|
|
|
transmute(RawSlice { data: ptr, len: 1 })
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-20 12:11:15 -06:00
|
|
|
/// Forms a slice from a pointer and a length.
|
|
|
|
///
|
|
|
|
/// The pointer given is actually a reference to the base of the slice. This
|
|
|
|
/// reference is used to give a concrete lifetime to tie the returned slice to.
|
|
|
|
/// Typically this should indicate that the slice is valid for as long as the
|
|
|
|
/// pointer itself is valid.
|
|
|
|
///
|
|
|
|
/// The `len` argument is the number of **elements**, not the number of bytes.
|
|
|
|
///
|
|
|
|
/// This function is unsafe as there is no guarantee that the given pointer is
|
|
|
|
/// valid for `len` elements, nor whether the lifetime provided is a suitable
|
|
|
|
/// lifetime for the returned slice.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// use std::slice;
|
|
|
|
///
|
|
|
|
/// // manifest a slice out of thin air!
|
|
|
|
/// let ptr = 0x1234 as *const uint;
|
|
|
|
/// let amt = 10;
|
|
|
|
/// unsafe {
|
|
|
|
/// let slice = slice::from_raw_buf(&ptr, amt);
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[inline]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
#[unstable = "should be renamed to from_raw_parts"]
|
2014-11-20 12:11:15 -06:00
|
|
|
pub unsafe fn from_raw_buf<'a, T>(p: &'a *const T, len: uint) -> &'a [T] {
|
|
|
|
transmute(RawSlice { data: *p, len: len })
|
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
|
2014-11-20 12:11:15 -06:00
|
|
|
/// Performs the same functionality as `from_raw_buf`, except that a mutable
|
|
|
|
/// slice is returned.
|
|
|
|
///
|
|
|
|
/// This function is unsafe for the same reasons as `from_raw_buf`, as well as
|
|
|
|
/// not being able to provide a non-aliasing guarantee of the returned mutable
|
|
|
|
/// slice.
|
|
|
|
#[inline]
|
2015-01-04 17:53:00 -06:00
|
|
|
#[unstable = "should be renamed to from_raw_parts_mut"]
|
2014-11-20 12:11:15 -06:00
|
|
|
pub unsafe fn from_raw_mut_buf<'a, T>(p: &'a *mut T, len: uint) -> &'a mut [T] {
|
|
|
|
transmute(RawSlice { data: *p as *const T, len: len })
|
|
|
|
}
|
2014-06-30 15:58:53 -05:00
|
|
|
|
|
|
|
//
|
|
|
|
// Submodules
|
|
|
|
//
|
|
|
|
|
2014-05-01 00:54:25 -05:00
|
|
|
/// Operations on `[u8]`.
|
2014-08-07 01:59:12 -05:00
|
|
|
#[experimental = "needs review"]
|
2014-05-01 00:54:25 -05:00
|
|
|
pub mod bytes {
|
|
|
|
use ptr;
|
2014-12-11 11:44:17 -06:00
|
|
|
use slice::SliceExt;
|
2014-05-01 00:54:25 -05:00
|
|
|
|
|
|
|
/// A trait for operations on mutable `[u8]`s.
|
2015-01-04 20:39:02 -06:00
|
|
|
pub trait MutableByteVector {
|
2014-05-01 00:54:25 -05:00
|
|
|
/// Sets all bytes of the receiver to the given value.
|
2014-10-23 10:43:18 -05:00
|
|
|
fn set_memory(&mut self, value: u8);
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
|
2014-10-23 10:43:18 -05:00
|
|
|
impl MutableByteVector for [u8] {
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
2014-05-29 19:40:18 -05:00
|
|
|
#[allow(experimental)]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn set_memory(&mut self, value: u8) {
|
2014-05-01 00:54:25 -05:00
|
|
|
unsafe { ptr::set_memory(self.as_mut_ptr(), value, self.len()) };
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Copies data from `src` to `dst`
|
|
|
|
///
|
2014-12-02 19:32:37 -06:00
|
|
|
/// Panics if the length of `dst` is less than the length of `src`.
|
2014-05-01 00:54:25 -05:00
|
|
|
#[inline]
|
|
|
|
pub fn copy_memory(dst: &mut [u8], src: &[u8]) {
|
2014-10-15 01:05:01 -05:00
|
|
|
let len_src = src.len();
|
|
|
|
assert!(dst.len() >= len_src);
|
2014-12-02 19:32:37 -06:00
|
|
|
// `dst` is unaliasable, so we know statically it doesn't overlap
|
|
|
|
// with `src`.
|
2014-10-15 01:05:01 -05:00
|
|
|
unsafe {
|
|
|
|
ptr::copy_nonoverlapping_memory(dst.as_mut_ptr(),
|
|
|
|
src.as_ptr(),
|
|
|
|
len_src);
|
|
|
|
}
|
2014-05-01 00:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-30 15:58:53 -05:00
|
|
|
//
|
|
|
|
// Boilerplate traits
|
|
|
|
//
|
2014-05-01 00:54:25 -05:00
|
|
|
|
2014-12-30 16:44:26 -06:00
|
|
|
#[stable]
|
2014-11-20 23:14:05 -06:00
|
|
|
impl<A, B> PartialEq<[B]> for [A] where A: PartialEq<B> {
|
|
|
|
fn eq(&self, other: &[B]) -> bool {
|
2014-10-29 20:11:16 -05:00
|
|
|
self.len() == other.len() &&
|
|
|
|
order::eq(self.iter(), other.iter())
|
|
|
|
}
|
2014-11-20 23:14:05 -06:00
|
|
|
fn ne(&self, other: &[B]) -> bool {
|
2014-10-29 20:11:16 -05:00
|
|
|
self.len() != other.len() ||
|
|
|
|
order::ne(self.iter(), other.iter())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-30 16:44:26 -06:00
|
|
|
#[stable]
|
2014-10-29 20:11:16 -05:00
|
|
|
impl<T: Eq> Eq for [T] {}
|
|
|
|
|
2014-12-30 16:44:26 -06:00
|
|
|
#[stable]
|
2014-10-29 20:11:16 -05:00
|
|
|
impl<T: Ord> Ord for [T] {
|
|
|
|
fn cmp(&self, other: &[T]) -> Ordering {
|
|
|
|
order::cmp(self.iter(), other.iter())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-30 16:44:26 -06:00
|
|
|
#[stable]
|
2014-10-29 20:11:16 -05:00
|
|
|
impl<T: PartialOrd> PartialOrd for [T] {
|
|
|
|
#[inline]
|
|
|
|
fn partial_cmp(&self, other: &[T]) -> Option<Ordering> {
|
|
|
|
order::partial_cmp(self.iter(), other.iter())
|
|
|
|
}
|
|
|
|
#[inline]
|
|
|
|
fn lt(&self, other: &[T]) -> bool {
|
|
|
|
order::lt(self.iter(), other.iter())
|
|
|
|
}
|
|
|
|
#[inline]
|
|
|
|
fn le(&self, other: &[T]) -> bool {
|
|
|
|
order::le(self.iter(), other.iter())
|
|
|
|
}
|
|
|
|
#[inline]
|
|
|
|
fn ge(&self, other: &[T]) -> bool {
|
|
|
|
order::ge(self.iter(), other.iter())
|
|
|
|
}
|
|
|
|
#[inline]
|
|
|
|
fn gt(&self, other: &[T]) -> bool {
|
|
|
|
order::gt(self.iter(), other.iter())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
/// Extension methods for slices containing integers.
|
2014-10-03 13:34:32 -05:00
|
|
|
#[experimental]
|
2015-01-04 20:39:02 -06:00
|
|
|
pub trait IntSliceExt<U, S> {
|
2014-10-03 13:34:32 -05:00
|
|
|
/// Converts the slice to an immutable slice of unsigned integers with the same width.
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_unsigned<'a>(&'a self) -> &'a [U];
|
2014-10-03 13:34:32 -05:00
|
|
|
/// Converts the slice to an immutable slice of signed integers with the same width.
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_signed<'a>(&'a self) -> &'a [S];
|
2014-10-03 13:34:32 -05:00
|
|
|
|
|
|
|
/// Converts the slice to a mutable slice of unsigned integers with the same width.
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_unsigned_mut<'a>(&'a mut self) -> &'a mut [U];
|
2014-10-03 13:34:32 -05:00
|
|
|
/// Converts the slice to a mutable slice of signed integers with the same width.
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_signed_mut<'a>(&'a mut self) -> &'a mut [S];
|
2014-10-03 13:34:32 -05:00
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
macro_rules! impl_int_slice {
|
2014-10-03 13:34:32 -05:00
|
|
|
($u:ty, $s:ty, $t:ty) => {
|
|
|
|
#[experimental]
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
impl IntSliceExt<$u, $s> for [$t] {
|
2014-10-03 13:34:32 -05:00
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_unsigned(&self) -> &[$u] { unsafe { transmute(self) } }
|
2014-10-03 13:34:32 -05:00
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_signed(&self) -> &[$s] { unsafe { transmute(self) } }
|
2014-10-03 13:34:32 -05:00
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_unsigned_mut(&mut self) -> &mut [$u] { unsafe { transmute(self) } }
|
2014-10-03 13:34:32 -05:00
|
|
|
#[inline]
|
2014-10-23 10:43:18 -05:00
|
|
|
fn as_signed_mut(&mut self) -> &mut [$s] { unsafe { transmute(self) } }
|
2014-10-03 13:34:32 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
macro_rules! impl_int_slices {
|
2014-10-03 13:34:32 -05:00
|
|
|
($u:ty, $s:ty) => {
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
impl_int_slice! { $u, $s, $u }
|
|
|
|
impl_int_slice! { $u, $s, $s }
|
2014-10-03 13:34:32 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Second pass stabilization: slice
This commit takes a second pass through the `slice` module to
stabilize its API. The changes are as follows:
**Stable**:
* `as_mut_slice`
* `as_ptr`, `as_mut_ptr`
* `binary_search_by` (was: `binary_search`)
* `binary_search` (was: `binary_search_elem`)
* `chunks`, `chunks_mut`
* `contains`
* `ends_with`
* `first`, `first_mut` (was: `head`)
* `get_unchecked`, `get_unchecked_mut` (was: `unsafe_get`)
* `get`
* `is_empty`
* `iter`, `iter_mut`
* `len`
* `reverse`
* `sort_by`
* `sort`
* `split_at`, `split_at_mut`
* `split_mut`, `splitn_mut`, `rsplitn_mut`
* `split`, `splitn`, `rsplitn`
* `starts_with`
* `swap`
* `to_vec`
* `windows`
**Deprecated**:
* `head`, `head_mut` (renamed as above)
* `unsafe_get`, `unsafe_mut` (renamed as above)
* `binary_search_elem` (renamed as above)
* `partitioned`, deprecated in favor of a new, more
general iterator consumer called `partition`.
* `BinarySearchResult`, deprecated in favor of `Result<uint, uint>`
[breaking-change]
2014-12-17 22:50:16 -06:00
|
|
|
impl_int_slices! { u8, i8 }
|
|
|
|
impl_int_slices! { u16, i16 }
|
|
|
|
impl_int_slices! { u32, i32 }
|
|
|
|
impl_int_slices! { u64, i64 }
|
|
|
|
impl_int_slices! { uint, int }
|