slice.rs 52.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// 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`.

15
#![stable]
16 17
#![doc(primitive = "slice")]

B
Brian Anderson 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
// 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.

A
Alex Crichton 已提交
37
use mem::transmute;
38
use clone::Clone;
39
use collections::Collection;
40
use cmp::{PartialEq, PartialOrd, Eq, Ord, Ordering, Less, Equal, Greater, Equiv};
41 42 43 44
use cmp;
use default::Default;
use iter::*;
use num::{CheckedAdd, Saturating, div_rem};
N
Nick Cameron 已提交
45
use ops;
46 47 48 49 50 51
use option::{None, Option, Some};
use ptr;
use ptr::RawPtr;
use mem;
use mem::size_of;
use kinds::marker;
B
Brian Anderson 已提交
52
use raw::Repr;
53
// Avoid conflicts with *both* the Slice trait (buggy) and the `slice::raw` module.
54
use raw::Slice as RawSlice;
55

56

B
Brian Anderson 已提交
57 58 59 60
//
// Extension traits
//

61
/// Extension methods for immutable slices.
62
#[unstable = "may merge with other traits; region parameter may disappear"]
63
pub trait ImmutableSlice<'a, T> {
64 65 66 67 68 69 70
    /// Divides one slice into two at an index.
    ///
    /// The first will contain all indices from `[0, mid)` (excluding
    /// the index `mid` itself) and the second will contain all
    /// indices from `[mid, len)` (excluding the index `len` itself).
    ///
    /// Fails if `mid > len`.
A
Aaron Turon 已提交
71
    #[unstable = "waiting on final error conventions"]
72 73
    fn split_at(&self, mid: uint) -> (&'a [T], &'a [T]);

A
Aaron Turon 已提交
74
    /// Returns an iterator over the slice
75
    #[unstable = "iterator type may change"]
B
Brian Anderson 已提交
76
    fn iter(self) -> Items<'a, T>;
A
Aaron Turon 已提交
77 78 79 80

    /// Returns an iterator over subslices separated by elements that match
    /// `pred`.  The matched element is not contained in the subslices.
    #[unstable = "iterator type may change, waiting on unboxed closures"]
B
Brian Anderson 已提交
81
    fn split(self, pred: |&T|: 'a -> bool) -> Splits<'a, T>;
A
Aaron Turon 已提交
82 83 84 85

    /// Returns an iterator over subslices separated by elements that match
    /// `pred`, limited to splitting at most `n` times.  The matched element is
    /// not contained in the subslices.
86
    #[unstable = "iterator type may change"]
A
Aaron Turon 已提交
87 88 89 90 91 92
    fn splitn(self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<Splits<'a, T>>;

    /// Returns an iterator over subslices separated by elements that match
    /// `pred` limited to splitting at most `n` times. This starts at the end of
    /// the slice and works backwards.  The matched element is not contained in
    /// the subslices.
93
    #[unstable = "iterator type may change"]
A
Aaron Turon 已提交
94
    fn rsplitn(self,  n: uint, pred: |&T|: 'a -> bool) -> SplitsN<Splits<'a, T>>;
B
Brian Anderson 已提交
95

A
Aaron Turon 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
    /// Returns an iterator over all contiguous windows of length
    /// `size`. The windows overlap. If the slice is shorter than
    /// `size`, the iterator returns no values.
    ///
    /// # Failure
    ///
    /// Fails if `size` is 0.
    ///
    /// # Example
    ///
    /// Print the adjacent pairs of a slice (i.e. `[1,2]`, `[2,3]`,
    /// `[3,4]`):
    ///
    /// ```rust
    /// let v = &[1i, 2, 3, 4];
    /// for win in v.windows(2) {
    ///     println!("{}", win);
    /// }
    /// ```
115
    #[unstable = "iterator type may change"]
B
Brian Anderson 已提交
116
    fn windows(self, size: uint) -> Windows<'a, T>;
A
Aaron Turon 已提交
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137

    /// Returns an iterator over `size` elements of the slice at a
    /// time. The chunks do not overlap. If `size` does not divide the
    /// length of the slice, then the last chunk will not have length
    /// `size`.
    ///
    /// # Failure
    ///
    /// Fails if `size` is 0.
    ///
    /// # Example
    ///
    /// Print the slice two elements at a time (i.e. `[1,2]`,
    /// `[3,4]`, `[5]`):
    ///
    /// ```rust
    /// let v = &[1i, 2, 3, 4, 5];
    /// for win in v.chunks(2) {
    ///     println!("{}", win);
    /// }
    /// ```
138
    #[unstable = "iterator type may change"]
B
Brian Anderson 已提交
139 140
    fn chunks(self, size: uint) -> Chunks<'a, T>;

A
Aaron Turon 已提交
141 142 143
    /// Returns the element of a slice at the given index, or `None` if the
    /// index is out of bounds.
    #[unstable = "waiting on final collection conventions"]
B
Brian Anderson 已提交
144
    fn get(&self, index: uint) -> Option<&'a T>;
A
Aaron Turon 已提交
145 146

    /// Returns the first element of a slice, or `None` if it is empty.
147
    #[unstable = "name may change"]
B
Brian Anderson 已提交
148
    fn head(&self) -> Option<&'a T>;
A
Aaron Turon 已提交
149 150

    /// Returns all but the first element of a slice.
151
    #[unstable = "name may change"]
B
Brian Anderson 已提交
152
    fn tail(&self) -> &'a [T];
A
Aaron Turon 已提交
153 154

    /// Returns all but the first `n' elements of a slice.
A
Aaron Turon 已提交
155
    #[deprecated = "use slicing syntax"]
B
Brian Anderson 已提交
156
    fn tailn(&self, n: uint) -> &'a [T];
A
Aaron Turon 已提交
157 158

    /// Returns all but the last element of a slice.
159
    #[unstable = "name may change"]
B
Brian Anderson 已提交
160
    fn init(&self) -> &'a [T];
A
Aaron Turon 已提交
161 162

    /// Returns all but the last `n' elements of a slice.
163
    #[deprecated = "use slice_to but note the arguments are different"]
A
Aaron Turon 已提交
164
    #[deprecated = "use slicing syntax, but note the arguments are different"]
B
Brian Anderson 已提交
165
    fn initn(&self, n: uint) -> &'a [T];
A
Aaron Turon 已提交
166 167

    /// Returns the last element of a slice, or `None` if it is empty.
168
    #[unstable = "name may change"]
B
Brian Anderson 已提交
169 170 171 172
    fn last(&self) -> Option<&'a T>;

    /// Returns a pointer to the element at the given index, without doing
    /// bounds checking.
173
    #[deprecated = "renamed to `unsafe_get`"]
B
Brian Anderson 已提交
174 175
    unsafe fn unsafe_ref(self, index: uint) -> &'a T;

176 177 178 179 180
    /// Returns a pointer to the element at the given index, without doing
    /// bounds checking.
    #[unstable]
    unsafe fn unsafe_get(self, index: uint) -> &'a T;

A
Aaron Turon 已提交
181 182 183 184 185 186 187
    /// Returns an unsafe pointer to the slice's buffer
    ///
    /// The caller must ensure that the slice outlives the pointer this
    /// function returns, or else it will end up pointing to garbage.
    ///
    /// Modifying the slice may cause its buffer to be reallocated, which
    /// would also make any pointers to it invalid.
188
    #[unstable]
B
Brian Anderson 已提交
189 190
    fn as_ptr(&self) -> *const T;

A
Aaron Turon 已提交
191
    /// Deprecated: use `binary_search`.
192
    #[deprecated = "use binary_search"]
B
Brian Anderson 已提交
193 194
    fn bsearch(&self, f: |&T| -> Ordering) -> Option<uint>;

A
Aaron Turon 已提交
195
    /// Binary search a sorted slice with a comparator function.
B
Brian Anderson 已提交
196 197
    ///
    /// The comparator function should implement an order consistent
A
Aaron Turon 已提交
198
    /// with the sort order of the underlying slice, returning an
B
Brian Anderson 已提交
199 200 201 202 203 204 205
    /// order code that indicates whether its argument is `Less`,
    /// `Equal` or `Greater` the desired target.
    ///
    /// If the value is found then `Found` is returned, containing the
    /// index of the matching element; if the value is not found then
    /// `NotFound` is returned, containing the index where a matching
    /// element could be inserted while maintaining sorted order.
A
Aaron Turon 已提交
206
    #[unstable = "waiting on unboxed closures"]
207 208
    fn binary_search(&self, f: |&T| -> Ordering) -> BinarySearchResult;

B
Brian Anderson 已提交
209 210 211 212 213 214 215 216 217 218
    /**
     * Returns an immutable reference to the first element in this slice
     * and adjusts the slice in place so that it no longer contains
     * that element. O(1).
     *
     * Equivalent to:
     *
     * ```ignore
     *     if self.len() == 0 { return None }
     *     let head = &self[0];
219
     *     *self = self[1..];
B
Brian Anderson 已提交
220 221 222 223 224
     *     Some(head)
     * ```
     *
     * Returns `None` if vector is empty
     */
225
    #[deprecated = "find some other way. sorry"]
B
Brian Anderson 已提交
226 227 228 229 230 231 232 233 234 235 236 237
    fn shift_ref(&mut self) -> Option<&'a T>;

    /**
     * Returns an immutable reference to the last element in this slice
     * and adjusts the slice in place so that it no longer contains
     * that element. O(1).
     *
     * Equivalent to:
     *
     * ```ignore
     *     if self.len() == 0 { return None; }
     *     let tail = &self[self.len() - 1];
238
     *     *self = self[..self.len() - 1];
B
Brian Anderson 已提交
239 240 241 242 243
     *     Some(tail)
     * ```
     *
     * Returns `None` if slice is empty.
     */
244
    #[deprecated = "find some other way. sorry"]
B
Brian Anderson 已提交
245
    fn pop_ref(&mut self) -> Option<&'a T>;
246 247
}

248
#[unstable]
249
impl<'a,T> ImmutableSlice<'a, T> for &'a [T] {
250 251
    #[inline]
    fn split_at(&self, mid: uint) -> (&'a [T], &'a [T]) {
252
        ((*self)[..mid], (*self)[mid..])
253 254
    }

B
Brian Anderson 已提交
255 256 257 258 259 260 261 262 263 264 265 266
    #[inline]
    fn iter(self) -> Items<'a, T> {
        unsafe {
            let p = self.as_ptr();
            if mem::size_of::<T>() == 0 {
                Items{ptr: p,
                      end: (p as uint + self.len()) as *const T,
                      marker: marker::ContravariantLifetime::<'a>}
            } else {
                Items{ptr: p,
                      end: p.offset(self.len() as int),
                      marker: marker::ContravariantLifetime::<'a>}
267 268 269 270 271
            }
        }
    }

    #[inline]
B
Brian Anderson 已提交
272 273 274 275 276
    fn split(self, pred: |&T|: 'a -> bool) -> Splits<'a, T> {
        Splits {
            v: self,
            pred: pred,
            finished: false
277 278 279 280
        }
    }

    #[inline]
A
Aaron Turon 已提交
281
    fn splitn(self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<Splits<'a, T>> {
B
Brian Anderson 已提交
282 283 284 285
        SplitsN {
            iter: self.split(pred),
            count: n,
            invert: false
286 287 288 289
        }
    }

    #[inline]
A
Aaron Turon 已提交
290
    fn rsplitn(self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<Splits<'a, T>> {
B
Brian Anderson 已提交
291 292 293 294
        SplitsN {
            iter: self.split(pred),
            count: n,
            invert: true
295 296 297 298
        }
    }

    #[inline]
B
Brian Anderson 已提交
299 300 301
    fn windows(self, size: uint) -> Windows<'a, T> {
        assert!(size != 0);
        Windows { v: self, size: size }
302 303
    }

B
Brian Anderson 已提交
304 305 306 307 308
    #[inline]
    fn chunks(self, size: uint) -> Chunks<'a, T> {
        assert!(size != 0);
        Chunks { v: self, size: size }
    }
309 310

    #[inline]
B
Brian Anderson 已提交
311 312
    fn get(&self, index: uint) -> Option<&'a T> {
        if index < self.len() { Some(&self[index]) } else { None }
313 314 315
    }

    #[inline]
B
Brian Anderson 已提交
316 317
    fn head(&self) -> Option<&'a T> {
        if self.len() == 0 { None } else { Some(&self[0]) }
318 319
    }

B
Brian Anderson 已提交
320
    #[inline]
321
    fn tail(&self) -> &'a [T] { (*self)[1..] }
322 323

    #[inline]
A
Aaron Turon 已提交
324
    #[deprecated = "use slicing syntax"]
325
    fn tailn(&self, n: uint) -> &'a [T] { (*self)[n..] }
326 327

    #[inline]
B
Brian Anderson 已提交
328
    fn init(&self) -> &'a [T] {
329
        (*self)[..self.len() - 1]
330 331 332
    }

    #[inline]
A
Aaron Turon 已提交
333
    #[deprecated = "use slicing syntax but note the arguments are different"]
B
Brian Anderson 已提交
334
    fn initn(&self, n: uint) -> &'a [T] {
335
        (*self)[..self.len() - n]
336 337 338
    }

    #[inline]
B
Brian Anderson 已提交
339
    fn last(&self) -> Option<&'a T> {
A
Aaron Turon 已提交
340
        if self.len() == 0 { None } else { Some(&self[self.len() - 1]) }
341 342 343
    }

    #[inline]
344
    #[deprecated = "renamed to `unsafe_get`"]
B
Brian Anderson 已提交
345 346
    unsafe fn unsafe_ref(self, index: uint) -> &'a T {
        transmute(self.repr().data.offset(index as int))
347 348
    }

349 350 351 352 353
    #[inline]
    unsafe fn unsafe_get(self, index: uint) -> &'a T {
        transmute(self.repr().data.offset(index as int))
    }

B
Brian Anderson 已提交
354 355 356 357
    #[inline]
    fn as_ptr(&self) -> *const T {
        self.repr().data
    }
358 359


360
    #[deprecated = "use binary_search"]
B
Brian Anderson 已提交
361 362 363
    fn bsearch(&self, f: |&T| -> Ordering) -> Option<uint> {
        let mut base : uint = 0;
        let mut lim : uint = self.len();
364

B
Brian Anderson 已提交
365 366 367 368 369 370 371 372 373 374 375
        while lim != 0 {
            let ix = base + (lim >> 1);
            match f(&self[ix]) {
                Equal => return Some(ix),
                Less => {
                    base = ix + 1;
                    lim -= 1;
                }
                Greater => ()
            }
            lim >>= 1;
376
        }
B
Brian Anderson 已提交
377
        return None;
378 379
    }

380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
    #[unstable]
    fn binary_search(&self, f: |&T| -> Ordering) -> BinarySearchResult {
        let mut base : uint = 0;
        let mut lim : uint = self.len();

        while lim != 0 {
            let ix = base + (lim >> 1);
            match f(&self[ix]) {
                Equal => return Found(ix),
                Less => {
                    base = ix + 1;
                    lim -= 1;
                }
                Greater => ()
            }
            lim >>= 1;
        }
        return NotFound(base);
    }

B
Brian Anderson 已提交
400 401
    fn shift_ref(&mut self) -> Option<&'a T> {
        unsafe {
402
            let s: &mut RawSlice<T> = transmute(self);
B
Brian Anderson 已提交
403 404 405 406
            match raw::shift_ptr(s) {
                Some(p) => Some(&*p),
                None => None
            }
407 408 409
        }
    }

B
Brian Anderson 已提交
410 411
    fn pop_ref(&mut self) -> Option<&'a T> {
        unsafe {
412
            let s: &mut RawSlice<T> = transmute(self);
B
Brian Anderson 已提交
413 414 415 416
            match raw::pop_ptr(s) {
                Some(p) => Some(&*p),
                None => None
            }
417 418 419 420
        }
    }
}

421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449
#[cfg(not(stage0))]
impl<T> ops::Slice<uint, [T]> for [T] {
    #[inline]
    fn as_slice<'a>(&'a self) -> &'a [T] {
        self
    }

    #[inline]
    fn slice_from<'a>(&'a self, start: &uint) -> &'a [T] {
        self.slice(start, &self.len())
    }

    #[inline]
    fn slice_to<'a>(&'a self, end: &uint) -> &'a [T] {
        self.slice(&0, end)
    }
    #[inline]
    fn slice<'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)
                })
        }
    }
}
#[cfg(stage0)]
N
Nick Cameron 已提交
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
impl<T> ops::Slice<uint, [T]> for [T] {
    #[inline]
    fn as_slice_<'a>(&'a self) -> &'a [T] {
        self
    }

    #[inline]
    fn slice_from_<'a>(&'a self, start: &uint) -> &'a [T] {
        self.slice_(start, &self.len())
    }

    #[inline]
    fn slice_to_<'a>(&'a self, end: &uint) -> &'a [T] {
        self.slice_(&0, end)
    }
    #[inline]
    fn slice_<'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)
                })
        }
    }
}
477 478 479 480 481 482 483 484 485 486 487 488
#[cfg(not(stage0))]
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_mut<'a>(&'a mut self, start: &uint) -> &'a mut [T] {
        let len = &self.len();
        self.slice_mut(start, len)
    }
N
Nick Cameron 已提交
489

490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
    #[inline]
    fn slice_to_mut<'a>(&'a mut self, end: &uint) -> &'a mut [T] {
        self.slice_mut(&0, end)
    }
    #[inline]
    fn slice_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)
                })
        }
    }
}
#[cfg(stage0)]
N
Nick Cameron 已提交
507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
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_mut_<'a>(&'a mut self, start: &uint) -> &'a mut [T] {
        let len = &self.len();
        self.slice_mut_(start, len)
    }

    #[inline]
    fn slice_to_mut_<'a>(&'a mut self, end: &uint) -> &'a mut [T] {
        self.slice_mut_(&0, end)
    }
    #[inline]
    fn slice_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)
                })
        }
    }
}

A
Aaron Turon 已提交
536
/// Extension methods for slices such that their elements are
B
Brian Anderson 已提交
537
/// mutable.
538
#[experimental = "may merge with other traits; may lose region param; needs review"]
539
pub trait MutableSlice<'a, T> {
B
Brian Anderson 已提交
540 541
    /// Returns a mutable reference to the element at the given index,
    /// or `None` if the index is out of bounds
A
Aaron Turon 已提交
542
    #[unstable = "waiting on final error conventions"]
B
Brian Anderson 已提交
543 544 545
    fn get_mut(self, index: uint) -> Option<&'a mut T>;
    /// Work with `self` as a mut slice.
    /// Primarily intended for getting a &mut [T] from a [T, ..N].
A
Aaron Turon 已提交
546
    #[deprecated = "use slicing syntax"]
B
Brian Anderson 已提交
547
    fn as_mut_slice(self) -> &'a mut [T];
548

A
Aaron Turon 已提交
549 550 551 552 553
    /// Deprecated: use `iter_mut`.
    #[deprecated = "use iter_mut"]
    fn mut_iter(self) -> MutItems<'a, T> {
        self.iter_mut()
    }
B
Brian Anderson 已提交
554 555

    /// Returns an iterator that allows modifying each value
A
Aaron Turon 已提交
556
    #[unstable = "waiting on iterator type name conventions"]
A
Aaron Turon 已提交
557 558
    fn iter_mut(self) -> MutItems<'a, T>;

A
Aaron Turon 已提交
559 560 561 562 563 564 565 566 567 568 569 570
    /// Returns a mutable pointer to the first element of a slice, or `None` if it is empty
    #[unstable = "name may change"]
    fn head_mut(self) -> Option<&'a mut T>;

    /// Returns all but the first element of a mutable slice
    #[unstable = "name may change"]
    fn tail_mut(self) -> &'a mut [T];

    /// Returns all but the last element of a mutable slice
    #[unstable = "name may change"]
    fn init_mut(self) -> &'a mut [T];

A
Aaron Turon 已提交
571 572 573 574 575
    /// Deprecated: use `last_mut`.
    #[deprecated = "use last_mut"]
    fn mut_last(self) -> Option<&'a mut T> {
        self.last_mut()
    }
B
Brian Anderson 已提交
576

A
Aaron Turon 已提交
577 578
    /// Returns a mutable pointer to the last item in the slice.
    #[unstable = "name may change"]
A
Aaron Turon 已提交
579 580 581 582 583 584 585
    fn last_mut(self) -> Option<&'a mut T>;

    /// Deprecated: use `split_mut`.
    #[deprecated = "use split_mut"]
    fn mut_split(self, pred: |&T|: 'a -> bool) -> MutSplits<'a, T> {
        self.split_mut(pred)
    }
B
Brian Anderson 已提交
586

A
Aaron Turon 已提交
587 588 589
    /// Returns an iterator over mutable subslices separated by elements that
    /// match `pred`.  The matched element is not contained in the subslices.
    #[unstable = "waiting on unboxed closures, iterator type name conventions"]
A
Aaron Turon 已提交
590 591
    fn split_mut(self, pred: |&T|: 'a -> bool) -> MutSplits<'a, T>;

A
Aaron Turon 已提交
592 593 594 595 596 597 598 599 600 601 602 603 604
    /// Returns an iterator over subslices separated by elements that match
    /// `pred`, limited to splitting at most `n` times.  The matched element is
    /// not contained in the subslices.
    #[unstable = "waiting on unboxed closures, iterator type name conventions"]
    fn splitn_mut(self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<MutSplits<'a, T>>;

    /// Returns an iterator over subslices separated by elements that match
    /// `pred` limited to splitting at most `n` times. This starts at the end of
    /// the slice and works backwards.  The matched element is not contained in
    /// the subslices.
    #[unstable = "waiting on unboxed closures, iterator type name conventions"]
    fn rsplitn_mut(self,  n: uint, pred: |&T|: 'a -> bool) -> SplitsN<MutSplits<'a, T>>;

A
Aaron Turon 已提交
605 606 607 608 609
    /// Deprecated: use `chunks_mut`.
    #[deprecated = "use chunks_mut"]
    fn mut_chunks(self, chunk_size: uint) -> MutChunks<'a, T> {
        self.chunks_mut(chunk_size)
    }
610

A
Aaron Turon 已提交
611 612 613 614 615 616 617 618 619
    /// Returns an iterator over `chunk_size` elements of the slice at a time.
    /// The chunks are mutable and do not overlap. If `chunk_size` does
    /// not divide the length of the slice, then the last chunk will not
    /// have length `chunk_size`.
    ///
    /// # Failure
    ///
    /// Fails if `chunk_size` is 0.
    #[unstable = "waiting on iterator type name conventions"]
A
Aaron Turon 已提交
620
    fn chunks_mut(self, chunk_size: uint) -> MutChunks<'a, T>;
621 622

    /**
B
Brian Anderson 已提交
623
     * Returns a mutable reference to the first element in this slice
624 625 626 627 628 629
     * and adjusts the slice in place so that it no longer contains
     * that element. O(1).
     *
     * Equivalent to:
     *
     * ```ignore
B
Brian Anderson 已提交
630 631
     *     if self.len() == 0 { return None; }
     *     let head = &mut self[0];
632
     *     *self = self[mut 1..];
633 634 635
     *     Some(head)
     * ```
     *
B
Brian Anderson 已提交
636
     * Returns `None` if slice is empty
637
     */
A
Aaron Turon 已提交
638
    #[deprecated = "use iter_mut"]
B
Brian Anderson 已提交
639
    fn mut_shift_ref(&mut self) -> Option<&'a mut T>;
640 641

    /**
B
Brian Anderson 已提交
642
     * Returns a mutable reference to the last element in this slice
643 644 645 646 647 648 649
     * and adjusts the slice in place so that it no longer contains
     * that element. O(1).
     *
     * Equivalent to:
     *
     * ```ignore
     *     if self.len() == 0 { return None; }
B
Brian Anderson 已提交
650
     *     let tail = &mut self[self.len() - 1];
651
     *     *self = self[mut ..self.len() - 1];
652 653 654 655 656
     *     Some(tail)
     * ```
     *
     * Returns `None` if slice is empty.
     */
A
Aaron Turon 已提交
657
    #[deprecated = "use iter_mut"]
B
Brian Anderson 已提交
658
    fn mut_pop_ref(&mut self) -> Option<&'a mut T>;
659

A
Aaron Turon 已提交
660
    /// Swaps two elements in a slice.
B
Brian Anderson 已提交
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675
    ///
    /// Fails if `a` or `b` are out of bounds.
    ///
    /// # Arguments
    ///
    /// * a - The index of the first element
    /// * b - The index of the second element
    ///
    /// # Example
    ///
    /// ```rust
    /// let mut v = ["a", "b", "c", "d"];
    /// v.swap(1, 3);
    /// assert!(v == ["a", "d", "c", "b"]);
    /// ```
A
Aaron Turon 已提交
676
    #[unstable = "waiting on final error conventions"]
B
Brian Anderson 已提交
677
    fn swap(self, a: uint, b: uint);
678

A
Aaron Turon 已提交
679 680 681 682 683
    /// Deprecated: use `split_at_mut`.
    #[deprecated = "use split_at_mut"]
    fn mut_split_at(self, mid: uint) -> (&'a mut [T], &'a mut [T]) {
        self.split_at_mut(mid)
    }
684

B
Brian Anderson 已提交
685 686 687 688 689 690 691 692 693 694 695 696 697 698 699
    /// Divides one `&mut` into two at an index.
    ///
    /// The first will contain all indices from `[0, mid)` (excluding
    /// the index `mid` itself) and the second will contain all
    /// indices from `[mid, len)` (excluding the index `len` itself).
    ///
    /// Fails if `mid > len`.
    ///
    /// # Example
    ///
    /// ```rust
    /// let mut v = [1i, 2, 3, 4, 5, 6];
    ///
    /// // scoped to restrict the lifetime of the borrows
    /// {
A
Aaron Turon 已提交
700
    ///    let (left, right) = v.split_at_mut(0);
B
Brian Anderson 已提交
701 702 703 704 705
    ///    assert!(left == &mut []);
    ///    assert!(right == &mut [1i, 2, 3, 4, 5, 6]);
    /// }
    ///
    /// {
A
Aaron Turon 已提交
706
    ///     let (left, right) = v.split_at_mut(2);
B
Brian Anderson 已提交
707 708 709 710 711
    ///     assert!(left == &mut [1i, 2]);
    ///     assert!(right == &mut [3i, 4, 5, 6]);
    /// }
    ///
    /// {
A
Aaron Turon 已提交
712
    ///     let (left, right) = v.split_at_mut(6);
B
Brian Anderson 已提交
713 714 715 716
    ///     assert!(left == &mut [1i, 2, 3, 4, 5, 6]);
    ///     assert!(right == &mut []);
    /// }
    /// ```
A
Aaron Turon 已提交
717
    #[unstable = "waiting on final error conventions"]
A
Aaron Turon 已提交
718
    fn split_at_mut(self, mid: uint) -> (&'a mut [T], &'a mut [T]);
719

A
Aaron Turon 已提交
720
    /// Reverse the order of elements in a slice, in place.
B
Brian Anderson 已提交
721 722 723 724 725 726 727 728
    ///
    /// # Example
    ///
    /// ```rust
    /// let mut v = [1i, 2, 3];
    /// v.reverse();
    /// assert!(v == [3i, 2, 1]);
    /// ```
A
Aaron Turon 已提交
729
    #[experimental = "may be moved to iterators instead"]
B
Brian Anderson 已提交
730
    fn reverse(self);
731

A
Aaron Turon 已提交
732 733 734 735 736 737
    /// Deprecated: use `unsafe_mut`.
    #[deprecated = "use unsafe_mut"]
    unsafe fn unsafe_mut_ref(self, index: uint) -> &'a mut T {
        self.unsafe_mut(index)
    }

B
Brian Anderson 已提交
738
    /// Returns an unsafe mutable pointer to the element in index
A
Aaron Turon 已提交
739
    #[experimental = "waiting on unsafe conventions"]
A
Aaron Turon 已提交
740
    unsafe fn unsafe_mut(self, index: uint) -> &'a mut T;
741

A
Aaron Turon 已提交
742
    /// Return an unsafe mutable pointer to the slice's buffer.
B
Brian Anderson 已提交
743
    ///
A
Aaron Turon 已提交
744
    /// The caller must ensure that the slice outlives the pointer this
B
Brian Anderson 已提交
745 746
    /// function returns, or else it will end up pointing to garbage.
    ///
A
Aaron Turon 已提交
747
    /// Modifying the slice may cause its buffer to be reallocated, which
B
Brian Anderson 已提交
748
    /// would also make any pointers to it invalid.
749
    #[inline]
A
Aaron Turon 已提交
750
    #[unstable]
B
Brian Anderson 已提交
751
    fn as_mut_ptr(self) -> *mut T;
752

A
Aaron Turon 已提交
753 754
    /// Deprecated: use `*foo.as_mut_ptr().offset(index) = val` instead.
    #[deprecated = "use `*foo.as_mut_ptr().offset(index) = val`"]
B
Brian Anderson 已提交
755
    unsafe fn unsafe_set(self, index: uint, val: T);
756

A
Aaron Turon 已提交
757 758
    /// Deprecated: use `ptr::write(foo.as_mut_ptr().offset(i), val)` instead.
    #[deprecated = "use `ptr::write(foo.as_mut_ptr().offset(i), val)`"]
B
Brian Anderson 已提交
759
    unsafe fn init_elem(self, i: uint, val: T);
760

A
Aaron Turon 已提交
761 762
    /// Deprecated: use `as_mut_ptr` and `ptr::copy_memory` instead.
    #[deprecated = "use as_mut_ptr and ptr::copy_memory"]
B
Brian Anderson 已提交
763 764
    unsafe fn copy_memory(self, src: &[T]);
}
765

766
#[experimental = "trait is experimental"]
767
impl<'a,T> MutableSlice<'a, T> for &'a mut [T] {
768
    #[inline]
B
Brian Anderson 已提交
769 770
    fn get_mut(self, index: uint) -> Option<&'a mut T> {
        if index < self.len() { Some(&mut self[index]) } else { None }
771 772 773
    }

    #[inline]
B
Brian Anderson 已提交
774
    fn as_mut_slice(self) -> &'a mut [T] { self }
775 776

    #[inline]
A
Aaron Turon 已提交
777
    fn split_at_mut(self, mid: uint) -> (&'a mut [T], &'a mut [T]) {
B
Brian Anderson 已提交
778 779
        unsafe {
            let self2: &'a mut [T] = mem::transmute_copy(&self);
780
            (self[mut ..mid], self2[mut mid..])
B
Brian Anderson 已提交
781
        }
782 783 784
    }

    #[inline]
A
Aaron Turon 已提交
785
    fn iter_mut(self) -> MutItems<'a, T> {
B
Brian Anderson 已提交
786 787 788 789 790 791 792 793 794 795 796 797 798 799
        unsafe {
            let p = self.as_mut_ptr();
            if mem::size_of::<T>() == 0 {
                MutItems{ptr: p,
                         end: (p as uint + self.len()) as *mut T,
                         marker: marker::ContravariantLifetime::<'a>,
                         marker2: marker::NoCopy}
            } else {
                MutItems{ptr: p,
                         end: p.offset(self.len() as int),
                         marker: marker::ContravariantLifetime::<'a>,
                         marker2: marker::NoCopy}
            }
        }
800 801 802
    }

    #[inline]
A
Aaron Turon 已提交
803
    fn last_mut(self) -> Option<&'a mut T> {
B
Brian Anderson 已提交
804 805 806
        let len = self.len();
        if len == 0 { return None; }
        Some(&mut self[len - 1])
807 808
    }

A
Aaron Turon 已提交
809 810 811 812 813 814 815 816
    #[inline]
    fn head_mut(self) -> Option<&'a mut T> {
        if self.len() == 0 { None } else { Some(&mut self[0]) }
    }

    #[inline]
    fn tail_mut(self) -> &'a mut [T] {
        let len = self.len();
817
        self.slice_mut(1, len)
A
Aaron Turon 已提交
818 819 820 821 822
    }

    #[inline]
    fn init_mut(self) -> &'a mut [T] {
        let len = self.len();
823
        self.slice_mut(0, len - 1)
A
Aaron Turon 已提交
824 825
    }

826
    #[inline]
A
Aaron Turon 已提交
827
    fn split_mut(self, pred: |&T|: 'a -> bool) -> MutSplits<'a, T> {
B
Brian Anderson 已提交
828
        MutSplits { v: self, pred: pred, finished: false }
829 830
    }

A
Aaron Turon 已提交
831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848
    #[inline]
    fn splitn_mut(self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<MutSplits<'a, T>> {
        SplitsN {
            iter: self.split_mut(pred),
            count: n,
            invert: false
        }
    }

    #[inline]
    fn rsplitn_mut(self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<MutSplits<'a, T>> {
        SplitsN {
            iter: self.split_mut(pred),
            count: n,
            invert: true
        }
   }

B
Brian Anderson 已提交
849
    #[inline]
A
Aaron Turon 已提交
850
    fn chunks_mut(self, chunk_size: uint) -> MutChunks<'a, T> {
B
Brian Anderson 已提交
851 852
        assert!(chunk_size > 0);
        MutChunks { v: self, chunk_size: chunk_size }
853 854
    }

B
Brian Anderson 已提交
855
    fn mut_shift_ref(&mut self) -> Option<&'a mut T> {
856
        unsafe {
857
            let s: &mut RawSlice<T> = transmute(self);
858
            match raw::shift_ptr(s) {
B
Brian Anderson 已提交
859 860 861 862
                // FIXME #13933: this `&` -> `&mut` cast is a little
                // dubious
                Some(p) => Some(&mut *(p as *mut _)),
                None => None,
863
            }
864 865 866
        }
    }

B
Brian Anderson 已提交
867
    fn mut_pop_ref(&mut self) -> Option<&'a mut T> {
868
        unsafe {
869
            let s: &mut RawSlice<T> = transmute(self);
870
            match raw::pop_ptr(s) {
B
Brian Anderson 已提交
871 872 873 874
                // FIXME #13933: this `&` -> `&mut` cast is a little
                // dubious
                Some(p) => Some(&mut *(p as *mut _)),
                None => None,
875
            }
876 877
        }
    }
B
Brian Anderson 已提交
878 879 880 881 882 883 884 885 886 887 888 889 890 891 892

    fn swap(self, a: uint, b: uint) {
        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);
        }
    }

    fn reverse(self) {
        let mut i: uint = 0;
        let ln = self.len();
        while i < ln / 2 {
B
Brian Anderson 已提交
893 894
            // Unsafe swap to avoid the bounds check in safe swap.
            unsafe {
A
Aaron Turon 已提交
895 896
                let pa: *mut T = self.unsafe_mut(i);
                let pb: *mut T = self.unsafe_mut(ln - i - 1);
B
Brian Anderson 已提交
897 898
                ptr::swap(pa, pb);
            }
B
Brian Anderson 已提交
899 900 901 902 903
            i += 1;
        }
    }

    #[inline]
A
Aaron Turon 已提交
904
    unsafe fn unsafe_mut(self, index: uint) -> &'a mut T {
B
Brian Anderson 已提交
905 906 907 908 909 910 911 912 913 914
        transmute((self.repr().data as *mut T).offset(index as int))
    }

    #[inline]
    fn as_mut_ptr(self) -> *mut T {
        self.repr().data as *mut T
    }

    #[inline]
    unsafe fn unsafe_set(self, index: uint, val: T) {
A
Aaron Turon 已提交
915
        *self.unsafe_mut(index) = val;
B
Brian Anderson 已提交
916 917 918 919 920 921 922 923 924 925 926 927 928
    }

    #[inline]
    unsafe fn init_elem(self, i: uint, val: T) {
        ptr::write(&mut (*self.as_mut_ptr().offset(i as int)), val);
    }

    #[inline]
    unsafe fn copy_memory(self, src: &[T]) {
        let len_src = src.len();
        assert!(self.len() >= len_src);
        ptr::copy_nonoverlapping_memory(self.as_mut_ptr(), src.as_ptr(), len_src)
    }
929 930
}

A
Aaron Turon 已提交
931
/// Extension methods for slices containing `PartialEq` elements.
932
#[unstable = "may merge with other traits"]
933
pub trait ImmutablePartialEqSlice<T:PartialEq> {
A
Aaron Turon 已提交
934
    /// Find the first index containing a matching value.
935 936
    fn position_elem(&self, t: &T) -> Option<uint>;

A
Aaron Turon 已提交
937
    /// Find the last index containing a matching value.
938 939
    fn rposition_elem(&self, t: &T) -> Option<uint>;

A
Aaron Turon 已提交
940
    /// Return true if the slice contains an element with the given value.
941 942
    fn contains(&self, x: &T) -> bool;

A
Aaron Turon 已提交
943
    /// Returns true if `needle` is a prefix of the slice.
944 945
    fn starts_with(&self, needle: &[T]) -> bool;

A
Aaron Turon 已提交
946
    /// Returns true if `needle` is a suffix of the slice.
947 948 949
    fn ends_with(&self, needle: &[T]) -> bool;
}

950
#[unstable = "trait is unstable"]
951
impl<'a,T:PartialEq> ImmutablePartialEqSlice<T> for &'a [T] {
952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969
    #[inline]
    fn position_elem(&self, x: &T) -> Option<uint> {
        self.iter().position(|y| *x == *y)
    }

    #[inline]
    fn rposition_elem(&self, t: &T) -> Option<uint> {
        self.iter().rposition(|x| *x == *t)
    }

    #[inline]
    fn contains(&self, x: &T) -> bool {
        self.iter().any(|elt| *x == *elt)
    }

    #[inline]
    fn starts_with(&self, needle: &[T]) -> bool {
        let n = needle.len();
970
        self.len() >= n && needle == (*self)[..n]
971 972 973 974 975
    }

    #[inline]
    fn ends_with(&self, needle: &[T]) -> bool {
        let (m, n) = (self.len(), needle.len());
976
        m >= n && needle == (*self)[m-n..]
977 978 979
    }
}

A
Aaron Turon 已提交
980
/// Extension methods for slices containing `Ord` elements.
981
#[unstable = "may merge with other traits"]
982
pub trait ImmutableOrdSlice<T: Ord> {
A
Aaron Turon 已提交
983
    /// Deprecated: use `binary_search_elem`.
984
    #[deprecated = "use binary_search_elem"]
985
    fn bsearch_elem(&self, x: &T) -> Option<uint>;
986

A
Aaron Turon 已提交
987 988 989 990 991 992 993
    /// Binary search a sorted slice for a given element.
    ///
    /// If the value is found then `Found` is returned, containing the
    /// index of the matching element; if the value is not found then
    /// `NotFound` is returned, containing the index where a matching
    /// element could be inserted while maintaining sorted order.
    #[unstable = "name likely to change"]
994
    fn binary_search_elem(&self, x: &T) -> BinarySearchResult;
995 996
}

997
#[unstable = "trait is unstable"]
998
impl<'a, T: Ord> ImmutableOrdSlice<T> for &'a [T] {
999
    #[deprecated = "use binary_search_elem"]
1000
    #[allow(deprecated)]
1001 1002 1003
    fn bsearch_elem(&self, x: &T) -> Option<uint> {
        self.bsearch(|p| p.cmp(x))
    }
1004 1005 1006 1007 1008

    #[unstable]
    fn binary_search_elem(&self, x: &T) -> BinarySearchResult {
        self.binary_search(|p| p.cmp(x))
    }
1009 1010
}

B
Brian Anderson 已提交
1011
/// Trait for &[T] where T is Cloneable
1012
#[unstable = "may merge with other traits"]
1013
pub trait MutableCloneableSlice<T> {
1014 1015 1016 1017 1018 1019
    /// Copies as many elements from `src` as it can into `self` (the
    /// shorter of `self.len()` and `src.len()`). Returns the number
    /// of elements copied.
    #[deprecated = "renamed to clone_from_slice"]
    fn copy_from(self, s: &[T]) -> uint { self.clone_from_slice(s) }

B
Brian Anderson 已提交
1020 1021 1022
    /// Copies as many elements from `src` as it can into `self` (the
    /// shorter of `self.len()` and `src.len()`). Returns the number
    /// of elements copied.
1023 1024 1025 1026
    ///
    /// # Example
    ///
    /// ```rust
1027
    /// use std::slice::MutableCloneableSlice;
1028
    ///
B
Brian Anderson 已提交
1029 1030
    /// let mut dst = [0i, 0, 0];
    /// let src = [1i, 2];
1031
    ///
1032
    /// assert!(dst.clone_from_slice(src) == 2);
B
Brian Anderson 已提交
1033
    /// assert!(dst == [1, 2, 0]);
1034
    ///
B
Brian Anderson 已提交
1035
    /// let src2 = [3i, 4, 5, 6];
1036
    /// assert!(dst.clone_from_slice(src2) == 3);
B
Brian Anderson 已提交
1037
    /// assert!(dst == [3i, 4, 5]);
1038
    /// ```
1039
    fn clone_from_slice(self, &[T]) -> uint;
B
Brian Anderson 已提交
1040
}
1041

1042
#[unstable = "trait is unstable"]
1043
impl<'a, T:Clone> MutableCloneableSlice<T> for &'a mut [T] {
B
Brian Anderson 已提交
1044
    #[inline]
1045
    fn clone_from_slice(self, src: &[T]) -> uint {
A
Aaron Turon 已提交
1046
        for (a, b) in self.iter_mut().zip(src.iter()) {
B
Brian Anderson 已提交
1047 1048 1049 1050 1051
            a.clone_from(b);
        }
        cmp::min(self.len(), src.len())
    }
}
1052 1053 1054 1055




B
Brian Anderson 已提交
1056 1057 1058
//
// Common traits
//
1059

A
Aaron Turon 已提交
1060
/// Data that is viewable as a slice.
1061
#[unstable = "may merge with other traits"]
1062
pub trait Slice<T> {
B
Brian Anderson 已提交
1063 1064
    /// Work with `self` as a slice.
    fn as_slice<'a>(&'a self) -> &'a [T];
1065 1066
}

1067
#[unstable = "trait is unstable"]
1068
impl<'a,T> Slice<T> for &'a [T] {
B
Brian Anderson 已提交
1069 1070 1071 1072
    #[inline(always)]
    fn as_slice<'a>(&'a self) -> &'a [T] { *self }
}

1073
#[experimental = "trait is experimental"]
B
Brian Anderson 已提交
1074
impl<'a, T> Collection for &'a [T] {
A
Aaron Turon 已提交
1075
    /// Returns the length of a slice.
B
bachm 已提交
1076
    #[inline]
B
Brian Anderson 已提交
1077 1078
    fn len(&self) -> uint {
        self.repr().len
B
bachm 已提交
1079
    }
B
Brian Anderson 已提交
1080 1081
}

1082 1083
#[experimental = "trait is experimental"]
impl<'a, T> Collection for &'a mut [T] {
A
Aaron Turon 已提交
1084
    /// Returns the length of a slice.
1085 1086 1087 1088 1089 1090
    #[inline]
    fn len(&self) -> uint {
        self.repr().len
    }
}

1091
#[unstable = "waiting for DST"]
B
Brian Anderson 已提交
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102
impl<'a, T> Default for &'a [T] {
    fn default() -> &'a [T] { &[] }
}

//
// Iterators
//

// The shared definition of the `Item` and `MutItems` iterators
macro_rules! iterator {
    (struct $name:ident -> $ptr:ty, $elem:ty) => {
1103
        #[experimental = "needs review"]
B
Brian Anderson 已提交
1104 1105 1106 1107 1108 1109 1110 1111
        impl<'a, T> Iterator<$elem> for $name<'a, T> {
            #[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 {
1112
                        if mem::size_of::<T>() == 0 {
B
Brian Anderson 已提交
1113 1114 1115
                            // purposefully don't use 'ptr.offset' because for
                            // vectors with 0-size elements this would return the
                            // same pointer.
1116 1117 1118 1119
                            self.ptr = transmute(self.ptr as uint + 1);

                            // Use a non-null pointer value
                            Some(transmute(1u))
B
Brian Anderson 已提交
1120
                        } else {
1121 1122
                            let old = self.ptr;
                            self.ptr = self.ptr.offset(1);
B
Brian Anderson 已提交
1123

1124 1125
                            Some(transmute(old))
                        }
B
Brian Anderson 已提交
1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138
                    }
                }
            }

            #[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))
            }
        }

1139
        #[experimental = "needs review"]
B
Brian Anderson 已提交
1140 1141 1142 1143 1144 1145 1146 1147
        impl<'a, T> DoubleEndedIterator<$elem> for $name<'a, T> {
            #[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 {
1148
                        if mem::size_of::<T>() == 0 {
B
Brian Anderson 已提交
1149
                            // See above for why 'ptr.offset' isn't used
1150 1151 1152 1153
                            self.end = transmute(self.end as uint - 1);

                            // Use a non-null pointer value
                            Some(transmute(1u))
B
Brian Anderson 已提交
1154
                        } else {
1155 1156 1157 1158
                            self.end = self.end.offset(-1);

                            Some(transmute(self.end))
                        }
B
Brian Anderson 已提交
1159 1160 1161 1162 1163 1164 1165 1166
                    }
                }
            }
        }
    }
}

/// Immutable slice iterator
1167
#[experimental = "needs review"]
B
Brian Anderson 已提交
1168 1169 1170 1171 1172 1173 1174 1175
pub struct Items<'a, T> {
    ptr: *const T,
    end: *const T,
    marker: marker::ContravariantLifetime<'a>
}

iterator!{struct Items -> *const T, &'a T}

1176
#[experimental = "needs review"]
B
Brian Anderson 已提交
1177 1178
impl<'a, T> ExactSize<&'a T> for Items<'a, T> {}

1179
#[experimental = "needs review"]
B
Brian Anderson 已提交
1180 1181 1182 1183
impl<'a, T> Clone for Items<'a, T> {
    fn clone(&self) -> Items<'a, T> { *self }
}

1184
#[experimental = "needs review"]
B
Brian Anderson 已提交
1185
impl<'a, T> RandomAccessIterator<&'a T> for Items<'a, T> {
1186
    #[inline]
B
Brian Anderson 已提交
1187 1188 1189 1190
    fn indexable(&self) -> uint {
        let (exact, _) = self.size_hint();
        exact
    }
1191

B
Brian Anderson 已提交
1192 1193
    #[inline]
    fn idx(&mut self, index: uint) -> Option<&'a T> {
1194
        unsafe {
B
Brian Anderson 已提交
1195
            if index < self.indexable() {
1196 1197 1198 1199 1200 1201
                if mem::size_of::<T>() == 0 {
                    // Use a non-null pointer value
                    Some(transmute(1u))
                } else {
                    Some(transmute(self.ptr.offset(index as int)))
                }
B
Brian Anderson 已提交
1202 1203 1204 1205 1206 1207 1208
            } else {
                None
            }
        }
    }
}

A
Aaron Turon 已提交
1209
/// Mutable slice iterator.
1210
#[experimental = "needs review"]
B
Brian Anderson 已提交
1211 1212 1213 1214 1215 1216 1217 1218 1219
pub struct MutItems<'a, T> {
    ptr: *mut T,
    end: *mut T,
    marker: marker::ContravariantLifetime<'a>,
    marker2: marker::NoCopy
}

iterator!{struct MutItems -> *mut T, &'a mut T}

1220
#[experimental = "needs review"]
B
Brian Anderson 已提交
1221 1222
impl<'a, T> ExactSize<&'a mut T> for MutItems<'a, T> {}

A
Aaron Turon 已提交
1223 1224 1225 1226 1227 1228 1229 1230 1231 1232
/// An abstraction over the splitting iterators, so that splitn, splitn_mut etc
/// can be implemented once.
trait SplitsIter<E>: DoubleEndedIterator<E> {
    /// Mark the underlying iterator as complete, extracting the remaining
    /// portion of the slice.
    fn finish(&mut self) -> Option<E>;
}

/// An iterator over subslices separated by elements that match a predicate
/// function.
1233
#[experimental = "needs review"]
1234 1235 1236 1237 1238 1239
pub struct Splits<'a, T:'a> {
    v: &'a [T],
    pred: |t: &T|: 'a -> bool,
    finished: bool
}

1240
#[experimental = "needs review"]
B
Brian Anderson 已提交
1241 1242 1243 1244 1245 1246
impl<'a, T> Iterator<&'a [T]> for Splits<'a, T> {
    #[inline]
    fn next(&mut self) -> Option<&'a [T]> {
        if self.finished { return None; }

        match self.v.iter().position(|x| (self.pred)(x)) {
A
Aaron Turon 已提交
1247
            None => self.finish(),
B
Brian Anderson 已提交
1248
            Some(idx) => {
1249 1250
                let ret = Some(self.v[..idx]);
                self.v = self.v[idx + 1..];
B
Brian Anderson 已提交
1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265
                ret
            }
        }
    }

    #[inline]
    fn size_hint(&self) -> (uint, Option<uint>) {
        if self.finished {
            (0, Some(0))
        } else {
            (1, Some(self.v.len() + 1))
        }
    }
}

1266
#[experimental = "needs review"]
B
Brian Anderson 已提交
1267 1268 1269 1270 1271 1272
impl<'a, T> DoubleEndedIterator<&'a [T]> for Splits<'a, T> {
    #[inline]
    fn next_back(&mut self) -> Option<&'a [T]> {
        if self.finished { return None; }

        match self.v.iter().rposition(|x| (self.pred)(x)) {
A
Aaron Turon 已提交
1273
            None => self.finish(),
B
Brian Anderson 已提交
1274
            Some(idx) => {
1275 1276
                let ret = Some(self.v[idx + 1..]);
                self.v = self.v[..idx];
B
Brian Anderson 已提交
1277 1278 1279 1280 1281 1282
                ret
            }
        }
    }
}

A
Aaron Turon 已提交
1283 1284 1285 1286 1287 1288 1289
impl<'a, T> SplitsIter<&'a [T]> for Splits<'a, T> {
    #[inline]
    fn finish(&mut self) -> Option<&'a [T]> {
        if self.finished { None } else { self.finished = true; Some(self.v) }
    }
}

B
Brian Anderson 已提交
1290 1291
/// An iterator over the subslices of the vector which are separated
/// by elements that match `pred`.
1292
#[experimental = "needs review"]
1293 1294 1295 1296 1297 1298
pub struct MutSplits<'a, T:'a> {
    v: &'a mut [T],
    pred: |t: &T|: 'a -> bool,
    finished: bool
}

A
Aaron Turon 已提交
1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310
impl<'a, T> SplitsIter<&'a mut [T]> for MutSplits<'a, T> {
    #[inline]
    fn finish(&mut self) -> Option<&'a mut [T]> {
        if self.finished {
            None
        } else {
            self.finished = true;
            Some(mem::replace(&mut self.v, &mut []))
        }
    }
}

1311
#[experimental = "needs review"]
B
Brian Anderson 已提交
1312 1313 1314 1315 1316
impl<'a, T> Iterator<&'a mut [T]> for MutSplits<'a, T> {
    #[inline]
    fn next(&mut self) -> Option<&'a mut [T]> {
        if self.finished { return None; }

A
Aaron Turon 已提交
1317 1318 1319 1320 1321 1322
        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(),
B
Brian Anderson 已提交
1323 1324
            Some(idx) => {
                let tmp = mem::replace(&mut self.v, &mut []);
A
Aaron Turon 已提交
1325
                let (head, tail) = tmp.split_at_mut(idx);
1326
                self.v = tail[mut 1..];
B
Brian Anderson 已提交
1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343
                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))
        }
    }
}

1344
#[experimental = "needs review"]
B
Brian Anderson 已提交
1345 1346 1347 1348 1349
impl<'a, T> DoubleEndedIterator<&'a mut [T]> for MutSplits<'a, T> {
    #[inline]
    fn next_back(&mut self) -> Option<&'a mut [T]> {
        if self.finished { return None; }

A
Aaron Turon 已提交
1350 1351 1352 1353 1354 1355
        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(),
B
Brian Anderson 已提交
1356 1357
            Some(idx) => {
                let tmp = mem::replace(&mut self.v, &mut []);
A
Aaron Turon 已提交
1358
                let (head, tail) = tmp.split_at_mut(idx);
B
Brian Anderson 已提交
1359
                self.v = head;
1360
                Some(tail[mut 1..])
B
Brian Anderson 已提交
1361 1362 1363 1364 1365
            }
        }
    }
}

A
Aaron Turon 已提交
1366 1367
/// An iterator over subslices separated by elements that match a predicate
/// function, splitting at most a fixed number of times.
1368
#[experimental = "needs review"]
A
Aaron Turon 已提交
1369 1370
pub struct SplitsN<I> {
    iter: I,
1371 1372 1373 1374
    count: uint,
    invert: bool
}

1375
#[experimental = "needs review"]
A
Aaron Turon 已提交
1376
impl<E, I: SplitsIter<E>> Iterator<E> for SplitsN<I> {
B
Brian Anderson 已提交
1377
    #[inline]
A
Aaron Turon 已提交
1378
    fn next(&mut self) -> Option<E> {
B
Brian Anderson 已提交
1379
        if self.count == 0 {
A
Aaron Turon 已提交
1380
            self.iter.finish()
B
Brian Anderson 已提交
1381 1382 1383
        } else {
            self.count -= 1;
            if self.invert { self.iter.next_back() } else { self.iter.next() }
1384 1385 1386 1387
        }
    }

    #[inline]
B
Brian Anderson 已提交
1388
    fn size_hint(&self) -> (uint, Option<uint>) {
A
Aaron Turon 已提交
1389 1390
        let (lower, upper_opt) = self.iter.size_hint();
        (lower, upper_opt.map(|upper| cmp::min(self.count + 1, upper)))
1391
    }
B
Brian Anderson 已提交
1392 1393
}

A
Aaron Turon 已提交
1394
/// An iterator over overlapping subslices of length `size`.
1395
#[deriving(Clone)]
1396
#[experimental = "needs review"]
1397 1398 1399 1400 1401
pub struct Windows<'a, T:'a> {
    v: &'a [T],
    size: uint
}

B
Brian Anderson 已提交
1402
impl<'a, T> Iterator<&'a [T]> for Windows<'a, T> {
1403
    #[inline]
B
Brian Anderson 已提交
1404 1405 1406 1407
    fn next(&mut self) -> Option<&'a [T]> {
        if self.size > self.v.len() {
            None
        } else {
1408 1409
            let ret = Some(self.v[..self.size]);
            self.v = self.v[1..];
B
Brian Anderson 已提交
1410 1411
            ret
        }
1412 1413 1414
    }

    #[inline]
B
Brian Anderson 已提交
1415 1416 1417 1418 1419 1420
    fn size_hint(&self) -> (uint, Option<uint>) {
        if self.size > self.v.len() {
            (0, Some(0))
        } else {
            let x = self.v.len() - self.size;
            (x.saturating_add(1), x.checked_add(&1u))
1421 1422
        }
    }
B
Brian Anderson 已提交
1423 1424
}

A
Aaron Turon 已提交
1425 1426
/// An iterator over a slice in (non-overlapping) chunks (`size` elements at a
/// time).
B
Brian Anderson 已提交
1427
///
A
Aaron Turon 已提交
1428 1429
/// When the slice len is not evenly divided by the chunk size, the last slice
/// of the iteration will be the remainder.
B
Brian Anderson 已提交
1430
#[deriving(Clone)]
1431
#[experimental = "needs review"]
1432 1433 1434 1435 1436
pub struct Chunks<'a, T:'a> {
    v: &'a [T],
    size: uint
}

1437
#[experimental = "needs review"]
B
Brian Anderson 已提交
1438
impl<'a, T> Iterator<&'a [T]> for Chunks<'a, T> {
1439
    #[inline]
B
Brian Anderson 已提交
1440 1441 1442 1443 1444
    fn next(&mut self) -> Option<&'a [T]> {
        if self.v.len() == 0 {
            None
        } else {
            let chunksz = cmp::min(self.v.len(), self.size);
1445
            let (fst, snd) = self.v.split_at(chunksz);
B
Brian Anderson 已提交
1446 1447
            self.v = snd;
            Some(fst)
1448 1449 1450 1451
        }
    }

    #[inline]
B
Brian Anderson 已提交
1452 1453 1454 1455 1456 1457 1458 1459
    fn size_hint(&self) -> (uint, Option<uint>) {
        if self.v.len() == 0 {
            (0, Some(0))
        } else {
            let (n, rem) = div_rem(self.v.len(), self.size);
            let n = if rem > 0 { n+1 } else { n };
            (n, Some(n))
        }
1460
    }
B
Brian Anderson 已提交
1461
}
1462

1463
#[experimental = "needs review"]
B
Brian Anderson 已提交
1464
impl<'a, T> DoubleEndedIterator<&'a [T]> for Chunks<'a, T> {
1465
    #[inline]
B
Brian Anderson 已提交
1466 1467 1468 1469 1470 1471
    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 };
1472
            let (fst, snd) = self.v.split_at(self.v.len() - chunksz);
B
Brian Anderson 已提交
1473 1474 1475
            self.v = fst;
            Some(snd)
        }
1476
    }
B
Brian Anderson 已提交
1477
}
1478

1479
#[experimental = "needs review"]
B
Brian Anderson 已提交
1480
impl<'a, T> RandomAccessIterator<&'a [T]> for Chunks<'a, T> {
1481
    #[inline]
B
Brian Anderson 已提交
1482 1483
    fn indexable(&self) -> uint {
        self.v.len()/self.size + if self.v.len() % self.size != 0 { 1 } else { 0 }
1484 1485
    }

B
Brian Anderson 已提交
1486 1487 1488 1489 1490 1491
    #[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(); }
1492

1493
            Some(self.v[lo..hi])
B
Brian Anderson 已提交
1494 1495
        } else {
            None
1496 1497
        }
    }
B
Brian Anderson 已提交
1498
}
1499

A
Aaron Turon 已提交
1500 1501 1502
/// 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.
1503
#[experimental = "needs review"]
1504 1505 1506 1507 1508
pub struct MutChunks<'a, T:'a> {
    v: &'a mut [T],
    chunk_size: uint
}

1509
#[experimental = "needs review"]
B
Brian Anderson 已提交
1510 1511 1512 1513 1514 1515 1516 1517
impl<'a, T> Iterator<&'a mut [T]> for MutChunks<'a, T> {
    #[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 []);
A
Aaron Turon 已提交
1518
            let (head, tail) = tmp.split_at_mut(sz);
B
Brian Anderson 已提交
1519 1520
            self.v = tail;
            Some(head)
1521 1522 1523 1524
        }
    }

    #[inline]
B
Brian Anderson 已提交
1525 1526 1527 1528 1529 1530 1531 1532
    fn size_hint(&self) -> (uint, Option<uint>) {
        if self.v.len() == 0 {
            (0, Some(0))
        } else {
            let (n, rem) = div_rem(self.v.len(), self.chunk_size);
            let n = if rem > 0 { n + 1 } else { n };
            (n, Some(n))
        }
1533
    }
B
Brian Anderson 已提交
1534
}
1535

1536
#[experimental = "needs review"]
B
Brian Anderson 已提交
1537
impl<'a, T> DoubleEndedIterator<&'a mut [T]> for MutChunks<'a, T> {
1538
    #[inline]
B
Brian Anderson 已提交
1539 1540 1541 1542 1543 1544 1545 1546
    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();
A
Aaron Turon 已提交
1547
            let (head, tail) = tmp.split_at_mut(tmp_len - sz);
B
Brian Anderson 已提交
1548 1549 1550
            self.v = head;
            Some(tail)
        }
1551
    }
B
Brian Anderson 已提交
1552
}
1553 1554 1555



1556 1557 1558 1559 1560 1561 1562
/// The result of calling `binary_search`.
///
/// `Found` means the search succeeded, and the contained value is the
/// index of the matching element. `NotFound` means the search
/// succeeded, and the contained value is an index where a matching
/// value could be inserted while maintaining sort order.
#[deriving(PartialEq, Show)]
1563
#[experimental = "needs review"]
1564 1565 1566 1567 1568 1569 1570
pub enum BinarySearchResult {
    /// The index of the found value.
    Found(uint),
    /// The index where the value should have been found.
    NotFound(uint)
}

1571
#[experimental = "needs review"]
1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
impl BinarySearchResult {
    /// Converts a `Found` to `Some`, `NotFound` to `None`.
    /// Similar to `Result::ok`.
    pub fn found(&self) -> Option<uint> {
        match *self {
            Found(i) => Some(i),
            NotFound(_) => None
        }
    }

    /// Convert a `Found` to `None`, `NotFound` to `Some`.
    /// Similar to `Result::err`.
    pub fn not_found(&self) -> Option<uint> {
        match *self {
            Found(_) => None,
            NotFound(i) => Some(i)
        }
    }
}


1593

B
Brian Anderson 已提交
1594 1595 1596
//
// Free functions
//
1597

B
Brian Anderson 已提交
1598 1599 1600
/**
 * Converts a pointer to A into a slice of length 1 (without copying).
 */
1601
#[unstable = "waiting for DST"]
B
Brian Anderson 已提交
1602 1603
pub fn ref_slice<'a, A>(s: &'a A) -> &'a [A] {
    unsafe {
1604
        transmute(RawSlice { data: s, len: 1 })
B
Brian Anderson 已提交
1605 1606 1607 1608 1609 1610
    }
}

/**
 * Converts a pointer to A into a slice of length 1 (without copying).
 */
1611
#[unstable = "waiting for DST"]
B
Brian Anderson 已提交
1612 1613 1614
pub fn mut_ref_slice<'a, A>(s: &'a mut A) -> &'a mut [A] {
    unsafe {
        let ptr: *const A = transmute(s);
1615
        transmute(RawSlice { data: ptr, len: 1 })
1616 1617 1618
    }
}

B
Brian Anderson 已提交
1619 1620 1621 1622 1623 1624 1625



//
// Submodules
//

1626
/// Unsafe operations
1627
#[experimental = "needs review"]
1628
pub mod raw {
A
Alex Crichton 已提交
1629
    use mem::transmute;
1630 1631
    use ptr::RawPtr;
    use raw::Slice;
1632
    use option::{None, Option, Some};
1633 1634 1635 1636 1637 1638

    /**
     * Form a slice from a pointer and length (as a number of units,
     * not bytes).
     */
    #[inline]
1639
    pub unsafe fn buf_as_slice<T,U>(p: *const T, len: uint, f: |v: &[T]| -> U)
1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658
                               -> U {
        f(transmute(Slice {
            data: p,
            len: len
        }))
    }

    /**
     * Form a slice from a pointer and length (as a number of units,
     * not bytes).
     */
    #[inline]
    pub unsafe fn mut_buf_as_slice<T,
                                   U>(
                                   p: *mut T,
                                   len: uint,
                                   f: |v: &mut [T]| -> U)
                                   -> U {
        f(transmute(Slice {
1659
            data: p as *const T,
1660 1661 1662 1663 1664 1665
            len: len
        }))
    }

    /**
     * Returns a pointer to first element in slice and adjusts
1666 1667
     * slice so it no longer contains that element. Returns None
     * if the slice is empty. O(1).
1668
     */
1669
     #[inline]
1670
    pub unsafe fn shift_ptr<T>(slice: &mut Slice<T>) -> Option<*const T> {
1671
        if slice.len == 0 { return None; }
1672
        let head: *const T = slice.data;
1673 1674
        slice.data = slice.data.offset(1);
        slice.len -= 1;
1675
        Some(head)
1676 1677 1678 1679
    }

    /**
     * Returns a pointer to last element in slice and adjusts
1680 1681
     * slice so it no longer contains that element. Returns None
     * if the slice is empty. O(1).
1682
     */
1683
     #[inline]
1684
    pub unsafe fn pop_ptr<T>(slice: &mut Slice<T>) -> Option<*const T> {
1685
        if slice.len == 0 { return None; }
1686
        let tail: *const T = slice.data.offset((slice.len - 1) as int);
1687
        slice.len -= 1;
1688
        Some(tail)
1689 1690 1691 1692
    }
}

/// Operations on `[u8]`.
1693
#[experimental = "needs review"]
1694
pub mod bytes {
1695
    use collections::Collection;
1696
    use ptr;
1697
    use slice::MutableSlice;
1698 1699 1700 1701 1702 1703 1704 1705 1706

    /// A trait for operations on mutable `[u8]`s.
    pub trait MutableByteVector {
        /// Sets all bytes of the receiver to the given value.
        fn set_memory(self, value: u8);
    }

    impl<'a> MutableByteVector for &'a mut [u8] {
        #[inline]
1707
        #[allow(experimental)]
1708 1709 1710 1711 1712 1713 1714 1715 1716 1717
        fn set_memory(self, value: u8) {
            unsafe { ptr::set_memory(self.as_mut_ptr(), value, self.len()) };
        }
    }

    /// Copies data from `src` to `dst`
    ///
    /// `src` and `dst` must not overlap. Fails if the length of `dst`
    /// is less than the length of `src`.
    #[inline]
A
Aaron Turon 已提交
1718
    #[allow(deprecated)]
1719 1720 1721 1722 1723 1724 1725 1726
    pub fn copy_memory(dst: &mut [u8], src: &[u8]) {
        // Bound checks are done at .copy_memory.
        unsafe { dst.copy_memory(src) }
    }
}



B
Brian Anderson 已提交
1727 1728 1729
//
// Boilerplate traits
//
1730

1731
#[unstable = "waiting for DST"]
1732 1733 1734 1735 1736 1737 1738 1739
impl<'a,T:PartialEq> PartialEq for &'a [T] {
    fn eq(&self, other: & &'a [T]) -> bool {
        self.len() == other.len() &&
            order::eq(self.iter(), other.iter())
    }
    fn ne(&self, other: & &'a [T]) -> bool {
        self.len() != other.len() ||
            order::ne(self.iter(), other.iter())
1740
    }
1741
}
1742

1743
#[unstable = "waiting for DST"]
1744
impl<'a,T:Eq> Eq for &'a [T] {}
1745

1746
#[unstable = "waiting for DST"]
1747
impl<'a,T:PartialEq, V: Slice<T>> Equiv<V> for &'a [T] {
1748 1749 1750
    #[inline]
    fn equiv(&self, other: &V) -> bool { self.as_slice() == other.as_slice() }
}
1751

N
Nick Cameron 已提交
1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772
#[unstable = "waiting for DST"]
impl<'a,T:PartialEq> PartialEq for &'a mut [T] {
    fn eq(&self, other: & &'a mut [T]) -> bool {
        self.len() == other.len() &&
        order::eq(self.iter(), other.iter())
    }
    fn ne(&self, other: & &'a mut [T]) -> bool {
        self.len() != other.len() ||
        order::ne(self.iter(), other.iter())
    }
}

#[unstable = "waiting for DST"]
impl<'a,T:Eq> Eq for &'a mut [T] {}

#[unstable = "waiting for DST"]
impl<'a,T:PartialEq, V: Slice<T>> Equiv<V> for &'a mut [T] {
    #[inline]
    fn equiv(&self, other: &V) -> bool { self.as_slice() == other.as_slice() }
}

1773
#[unstable = "waiting for DST"]
1774 1775 1776
impl<'a,T:Ord> Ord for &'a [T] {
    fn cmp(&self, other: & &'a [T]) -> Ordering {
        order::cmp(self.iter(), other.iter())
1777
    }
1778
}
1779

1780
#[unstable = "waiting for DST"]
1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800
impl<'a, T: PartialOrd> PartialOrd for &'a [T] {
    #[inline]
    fn partial_cmp(&self, other: &&'a [T]) -> Option<Ordering> {
        order::partial_cmp(self.iter(), other.iter())
    }
    #[inline]
    fn lt(&self, other: & &'a [T]) -> bool {
        order::lt(self.iter(), other.iter())
    }
    #[inline]
    fn le(&self, other: & &'a [T]) -> bool {
        order::le(self.iter(), other.iter())
    }
    #[inline]
    fn ge(&self, other: & &'a [T]) -> bool {
        order::ge(self.iter(), other.iter())
    }
    #[inline]
    fn gt(&self, other: & &'a [T]) -> bool {
        order::gt(self.iter(), other.iter())
1801 1802
    }
}