slice.rs 49.9 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
use option::{None, Option, Some};
use ptr;
use ptr::RawPtr;
use mem;
use mem::size_of;
J
Jorge Aparicio 已提交
51
use kinds::{Sized, 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"]
J
Jorge Aparicio 已提交
63
pub trait ImmutableSlice<T> for Sized? {
64 65 66 67 68 69
    /// Returns a subslice spanning the interval [`start`, `end`).
    ///
    /// Fails when the end of the new slice lies beyond the end of the
    /// original slice (i.e. when `end > self.len()`) or when `start > end`.
    ///
    /// Slicing with `start` equal to `end` yields an empty slice.
70
    #[unstable = "waiting on final error conventions/slicing syntax"]
J
Jorge Aparicio 已提交
71
    fn slice<'a>(&'a self, start: uint, end: uint) -> &'a [T];
72 73 74 75 76 77

    /// Returns a subslice from `start` to the end of the slice.
    ///
    /// Fails when `start` is strictly greater than the length of the original slice.
    ///
    /// Slicing from `self.len()` yields an empty slice.
78
    #[unstable = "waiting on final error conventions/slicing syntax"]
J
Jorge Aparicio 已提交
79
    fn slice_from<'a>(&'a self, start: uint) -> &'a [T];
80 81 82 83 84 85

    /// Returns a subslice from the start of the slice to `end`.
    ///
    /// Fails when `end` is strictly greater than the length of the original slice.
    ///
    /// Slicing to `0` yields an empty slice.
86
    #[unstable = "waiting on final error conventions/slicing syntax"]
J
Jorge Aparicio 已提交
87
    fn slice_to<'a>(&'a self, end: uint) -> &'a [T];
88

89 90 91 92 93 94 95
    /// 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 已提交
96
    #[unstable = "waiting on final error conventions"]
J
Jorge Aparicio 已提交
97
    fn split_at<'a>(&'a self, mid: uint) -> (&'a [T], &'a [T]);
98

A
Aaron Turon 已提交
99
    /// Returns an iterator over the slice
100
    #[unstable = "iterator type may change"]
J
Jorge Aparicio 已提交
101
    fn iter<'a>(&'a self) -> Items<'a, T>;
A
Aaron Turon 已提交
102 103 104 105

    /// 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"]
J
Jorge Aparicio 已提交
106
    fn split<'a>(&'a self, pred: |&T|: 'a -> bool) -> Splits<'a, T>;
A
Aaron Turon 已提交
107 108 109 110

    /// 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.
111
    #[unstable = "iterator type may change"]
J
Jorge Aparicio 已提交
112
    fn splitn<'a>(&'a self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<Splits<'a, T>>;
A
Aaron Turon 已提交
113 114 115 116 117

    /// 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.
118
    #[unstable = "iterator type may change"]
J
Jorge Aparicio 已提交
119
    fn rsplitn<'a>(&'a self,  n: uint, pred: |&T|: 'a -> bool) -> SplitsN<Splits<'a, T>>;
B
Brian Anderson 已提交
120

A
Aaron Turon 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
    /// 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);
    /// }
    /// ```
140
    #[unstable = "iterator type may change"]
J
Jorge Aparicio 已提交
141
    fn windows<'a>(&'a self, size: uint) -> Windows<'a, T>;
A
Aaron Turon 已提交
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

    /// 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);
    /// }
    /// ```
163
    #[unstable = "iterator type may change"]
J
Jorge Aparicio 已提交
164
    fn chunks<'a>(&'a self, size: uint) -> Chunks<'a, T>;
B
Brian Anderson 已提交
165

A
Aaron Turon 已提交
166 167 168
    /// 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"]
J
Jorge Aparicio 已提交
169
    fn get<'a>(&'a self, index: uint) -> Option<&'a T>;
A
Aaron Turon 已提交
170 171

    /// Returns the first element of a slice, or `None` if it is empty.
172
    #[unstable = "name may change"]
J
Jorge Aparicio 已提交
173
    fn head<'a>(&'a self) -> Option<&'a T>;
A
Aaron Turon 已提交
174 175

    /// Returns all but the first element of a slice.
176
    #[unstable = "name may change"]
J
Jorge Aparicio 已提交
177
    fn tail<'a>(&'a self) -> &'a [T];
A
Aaron Turon 已提交
178 179

    /// Returns all but the last element of a slice.
180
    #[unstable = "name may change"]
J
Jorge Aparicio 已提交
181
    fn init<'a>(&'a self) -> &'a [T];
A
Aaron Turon 已提交
182 183

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

187 188 189
    /// Returns a pointer to the element at the given index, without doing
    /// bounds checking.
    #[unstable]
J
Jorge Aparicio 已提交
190
    unsafe fn unsafe_get<'a>(&'a self, index: uint) -> &'a T;
191

A
Aaron Turon 已提交
192 193 194 195 196 197 198
    /// 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.
199
    #[unstable]
B
Brian Anderson 已提交
200 201
    fn as_ptr(&self) -> *const T;

A
Aaron Turon 已提交
202
    /// Binary search a sorted slice with a comparator function.
B
Brian Anderson 已提交
203 204
    ///
    /// The comparator function should implement an order consistent
A
Aaron Turon 已提交
205
    /// with the sort order of the underlying slice, returning an
B
Brian Anderson 已提交
206 207 208
    /// order code that indicates whether its argument is `Less`,
    /// `Equal` or `Greater` the desired target.
    ///
209 210
    /// If a matching value is found then returns `Found`, containing
    /// the index for the matched element; if no match is found then
B
Brian Anderson 已提交
211 212
    /// `NotFound` is returned, containing the index where a matching
    /// element could be inserted while maintaining sorted order.
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
    ///
    /// # Example
    ///
    /// Looks up a series of four elements. The first is found, with a
    /// uniquely determined position; the second and third are not
    /// found; the fourth could match any position in `[1,4]`.
    ///
    /// ```rust
    /// use std::slice::{Found, NotFound};
    /// let s = [0i, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
    /// let s = s.as_slice();
    ///
    /// let seek = 13;
    /// assert_eq!(s.binary_search(|probe| probe.cmp(&seek)), Found(9));
    /// let seek = 4;
    /// assert_eq!(s.binary_search(|probe| probe.cmp(&seek)), NotFound(7));
    /// let seek = 100;
    /// assert_eq!(s.binary_search(|probe| probe.cmp(&seek)), NotFound(13));
    /// let seek = 1;
    /// let r = s.binary_search(|probe| probe.cmp(&seek));
    /// assert!(match r { Found(1...4) => true, _ => false, });
    /// ```
A
Aaron Turon 已提交
235
    #[unstable = "waiting on unboxed closures"]
236
    fn binary_search(&self, f: |&T| -> Ordering) -> BinarySearchResult;
237 238
}

239
#[unstable]
J
Jorge Aparicio 已提交
240
impl<T> ImmutableSlice<T> for [T] {
241
    #[inline]
J
Jorge Aparicio 已提交
242
    fn slice(&self, start: uint, end: uint) -> &[T] {
243 244 245 246
        assert!(start <= end);
        assert!(end <= self.len());
        unsafe {
            transmute(RawSlice {
247 248 249
                data: self.as_ptr().offset(start as int),
                len: (end - start)
            })
250 251 252 253
        }
    }

    #[inline]
J
Jorge Aparicio 已提交
254
    fn slice_from(&self, start: uint) -> &[T] {
255 256 257 258
        self.slice(start, self.len())
    }

    #[inline]
J
Jorge Aparicio 已提交
259
    fn slice_to(&self, end: uint) -> &[T] {
260 261 262
        self.slice(0, end)
    }

263
    #[inline]
J
Jorge Aparicio 已提交
264 265
    fn split_at(&self, mid: uint) -> (&[T], &[T]) {
        (self[..mid], self[mid..])
266 267
    }

B
Brian Anderson 已提交
268
    #[inline]
J
Jorge Aparicio 已提交
269
    fn iter<'a>(&'a self) -> Items<'a, T> {
B
Brian Anderson 已提交
270 271 272 273 274 275 276 277 278 279
        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>}
280 281 282 283 284
            }
        }
    }

    #[inline]
J
Jorge Aparicio 已提交
285
    fn split<'a>(&'a self, pred: |&T|: 'a -> bool) -> Splits<'a, T> {
B
Brian Anderson 已提交
286 287 288 289
        Splits {
            v: self,
            pred: pred,
            finished: false
290 291 292 293
        }
    }

    #[inline]
J
Jorge Aparicio 已提交
294
    fn splitn<'a>(&'a self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<Splits<'a, T>> {
B
Brian Anderson 已提交
295 296 297 298
        SplitsN {
            iter: self.split(pred),
            count: n,
            invert: false
299 300 301 302
        }
    }

    #[inline]
J
Jorge Aparicio 已提交
303
    fn rsplitn<'a>(&'a self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<Splits<'a, T>> {
B
Brian Anderson 已提交
304 305 306 307
        SplitsN {
            iter: self.split(pred),
            count: n,
            invert: true
308 309 310 311
        }
    }

    #[inline]
J
Jorge Aparicio 已提交
312
    fn windows(&self, size: uint) -> Windows<T> {
B
Brian Anderson 已提交
313 314
        assert!(size != 0);
        Windows { v: self, size: size }
315 316
    }

B
Brian Anderson 已提交
317
    #[inline]
J
Jorge Aparicio 已提交
318
    fn chunks(&self, size: uint) -> Chunks<T> {
B
Brian Anderson 已提交
319 320 321
        assert!(size != 0);
        Chunks { v: self, size: size }
    }
322 323

    #[inline]
J
Jorge Aparicio 已提交
324
    fn get(&self, index: uint) -> Option<&T> {
B
Brian Anderson 已提交
325
        if index < self.len() { Some(&self[index]) } else { None }
326 327 328
    }

    #[inline]
J
Jorge Aparicio 已提交
329
    fn head(&self) -> Option<&T> {
B
Brian Anderson 已提交
330
        if self.len() == 0 { None } else { Some(&self[0]) }
331 332
    }

B
Brian Anderson 已提交
333
    #[inline]
J
Jorge Aparicio 已提交
334
    fn tail(&self) -> &[T] { self[1..] }
335 336

    #[inline]
J
Jorge Aparicio 已提交
337 338
    fn init(&self) -> &[T] {
        self[..self.len() - 1]
339 340 341
    }

    #[inline]
J
Jorge Aparicio 已提交
342
    fn last(&self) -> Option<&T> {
A
Aaron Turon 已提交
343
        if self.len() == 0 { None } else { Some(&self[self.len() - 1]) }
344 345
    }

346
    #[inline]
J
Jorge Aparicio 已提交
347
    unsafe fn unsafe_get(&self, index: uint) -> &T {
348 349 350
        transmute(self.repr().data.offset(index as int))
    }

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

356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
    #[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);
    }
375 376
}

N
Nick Cameron 已提交
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405


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)
                })
        }
    }
}
N
Nick Cameron 已提交
406

N
Nick Cameron 已提交
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424
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] {
N
Nick Cameron 已提交
425 426 427 428 429 430 431 432 433 434 435
        assert!(*start <= *end);
        assert!(*end <= self.len());
        unsafe {
            transmute(RawSlice {
                    data: self.as_ptr().offset(*start as int),
                    len: (*end - *start)
                })
        }
    }
}

A
Aaron Turon 已提交
436
/// Extension methods for slices such that their elements are
B
Brian Anderson 已提交
437
/// mutable.
438
#[experimental = "may merge with other traits; may lose region param; needs review"]
J
Jorge Aparicio 已提交
439
pub trait MutableSlice<T> for Sized? {
B
Brian Anderson 已提交
440 441
    /// Returns a mutable reference to the element at the given index,
    /// or `None` if the index is out of bounds
A
Aaron Turon 已提交
442
    #[unstable = "waiting on final error conventions"]
J
Jorge Aparicio 已提交
443
    fn get_mut<'a>(&'a mut self, index: uint) -> Option<&'a mut T>;
B
Brian Anderson 已提交
444 445
    /// Work with `self` as a mut slice.
    /// Primarily intended for getting a &mut [T] from a [T, ..N].
J
Jorge Aparicio 已提交
446
    fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T];
447

448 449 450 451 452 453 454
    /// Returns a mutable subslice spanning the interval [`start`, `end`).
    ///
    /// Fails when the end of the new slice lies beyond the end of the
    /// original slice (i.e. when `end > self.len()`) or when `start > end`.
    ///
    /// Slicing with `start` equal to `end` yields an empty slice.
    #[unstable = "waiting on final error conventions"]
J
Jorge Aparicio 已提交
455
    fn slice_mut<'a>(&'a mut self, start: uint, end: uint) -> &'a mut [T];
456 457 458 459 460 461 462

    /// Returns a mutable subslice from `start` to the end of the slice.
    ///
    /// Fails when `start` is strictly greater than the length of the original slice.
    ///
    /// Slicing from `self.len()` yields an empty slice.
    #[unstable = "waiting on final error conventions"]
J
Jorge Aparicio 已提交
463
    fn slice_from_mut<'a>(&'a mut self, start: uint) -> &'a mut [T];
464 465 466 467 468 469 470

    /// Returns a mutable subslice from the start of the slice to `end`.
    ///
    /// Fails when `end` is strictly greater than the length of the original slice.
    ///
    /// Slicing to `0` yields an empty slice.
    #[unstable = "waiting on final error conventions"]
J
Jorge Aparicio 已提交
471
    fn slice_to_mut<'a>(&'a mut self, end: uint) -> &'a mut [T];
472

B
Brian Anderson 已提交
473
    /// Returns an iterator that allows modifying each value
A
Aaron Turon 已提交
474
    #[unstable = "waiting on iterator type name conventions"]
J
Jorge Aparicio 已提交
475
    fn iter_mut<'a>(&'a mut self) -> MutItems<'a, T>;
A
Aaron Turon 已提交
476

A
Aaron Turon 已提交
477 478
    /// Returns a mutable pointer to the first element of a slice, or `None` if it is empty
    #[unstable = "name may change"]
J
Jorge Aparicio 已提交
479
    fn head_mut<'a>(&'a mut self) -> Option<&'a mut T>;
A
Aaron Turon 已提交
480 481 482

    /// Returns all but the first element of a mutable slice
    #[unstable = "name may change"]
J
Jorge Aparicio 已提交
483
    fn tail_mut<'a>(&'a mut self) -> &'a mut [T];
A
Aaron Turon 已提交
484 485 486

    /// Returns all but the last element of a mutable slice
    #[unstable = "name may change"]
J
Jorge Aparicio 已提交
487
    fn init_mut<'a>(&'a mut self) -> &'a mut [T];
A
Aaron Turon 已提交
488 489 490

    /// Returns a mutable pointer to the last item in the slice.
    #[unstable = "name may change"]
J
Jorge Aparicio 已提交
491
    fn last_mut<'a>(&'a mut self) -> Option<&'a mut T>;
A
Aaron Turon 已提交
492

A
Aaron Turon 已提交
493 494 495
    /// 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"]
J
Jorge Aparicio 已提交
496
    fn split_mut<'a>(&'a mut self, pred: |&T|: 'a -> bool) -> MutSplits<'a, T>;
A
Aaron Turon 已提交
497

A
Aaron Turon 已提交
498 499 500 501
    /// 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"]
J
Jorge Aparicio 已提交
502
    fn splitn_mut<'a>(&'a mut self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<MutSplits<'a, T>>;
A
Aaron Turon 已提交
503 504 505 506 507 508

    /// 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"]
J
Jorge Aparicio 已提交
509
    fn rsplitn_mut<'a>(&'a mut self,  n: uint, pred: |&T|: 'a -> bool) -> SplitsN<MutSplits<'a, T>>;
A
Aaron Turon 已提交
510 511 512 513 514 515 516 517 518 519

    /// 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"]
J
Jorge Aparicio 已提交
520
    fn chunks_mut<'a>(&'a mut self, chunk_size: uint) -> MutChunks<'a, T>;
521

A
Aaron Turon 已提交
522
    /// Swaps two elements in a slice.
B
Brian Anderson 已提交
523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
    ///
    /// 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 已提交
538
    #[unstable = "waiting on final error conventions"]
J
Jorge Aparicio 已提交
539
    fn swap(&mut self, a: uint, b: uint);
540

B
Brian Anderson 已提交
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
    /// 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 已提交
556
    ///    let (left, right) = v.split_at_mut(0);
B
Brian Anderson 已提交
557 558 559 560 561
    ///    assert!(left == &mut []);
    ///    assert!(right == &mut [1i, 2, 3, 4, 5, 6]);
    /// }
    ///
    /// {
A
Aaron Turon 已提交
562
    ///     let (left, right) = v.split_at_mut(2);
B
Brian Anderson 已提交
563 564 565 566 567
    ///     assert!(left == &mut [1i, 2]);
    ///     assert!(right == &mut [3i, 4, 5, 6]);
    /// }
    ///
    /// {
A
Aaron Turon 已提交
568
    ///     let (left, right) = v.split_at_mut(6);
B
Brian Anderson 已提交
569 570 571 572
    ///     assert!(left == &mut [1i, 2, 3, 4, 5, 6]);
    ///     assert!(right == &mut []);
    /// }
    /// ```
A
Aaron Turon 已提交
573
    #[unstable = "waiting on final error conventions"]
J
Jorge Aparicio 已提交
574
    fn split_at_mut<'a>(&'a mut self, mid: uint) -> (&'a mut [T], &'a mut [T]);
575

A
Aaron Turon 已提交
576
    /// Reverse the order of elements in a slice, in place.
B
Brian Anderson 已提交
577 578 579 580 581 582 583 584
    ///
    /// # Example
    ///
    /// ```rust
    /// let mut v = [1i, 2, 3];
    /// v.reverse();
    /// assert!(v == [3i, 2, 1]);
    /// ```
A
Aaron Turon 已提交
585
    #[experimental = "may be moved to iterators instead"]
J
Jorge Aparicio 已提交
586
    fn reverse(&mut self);
587

B
Brian Anderson 已提交
588
    /// Returns an unsafe mutable pointer to the element in index
A
Aaron Turon 已提交
589
    #[experimental = "waiting on unsafe conventions"]
J
Jorge Aparicio 已提交
590
    unsafe fn unsafe_mut<'a>(&'a mut self, index: uint) -> &'a mut T;
591

A
Aaron Turon 已提交
592
    /// Return an unsafe mutable pointer to the slice's buffer.
B
Brian Anderson 已提交
593
    ///
A
Aaron Turon 已提交
594
    /// The caller must ensure that the slice outlives the pointer this
B
Brian Anderson 已提交
595 596
    /// function returns, or else it will end up pointing to garbage.
    ///
A
Aaron Turon 已提交
597
    /// Modifying the slice may cause its buffer to be reallocated, which
B
Brian Anderson 已提交
598
    /// would also make any pointers to it invalid.
599
    #[inline]
A
Aaron Turon 已提交
600
    #[unstable]
J
Jorge Aparicio 已提交
601
    fn as_mut_ptr(&mut self) -> *mut T;
B
Brian Anderson 已提交
602
}
603

604
#[experimental = "trait is experimental"]
J
Jorge Aparicio 已提交
605
impl<T> MutableSlice<T> for [T] {
606
    #[inline]
J
Jorge Aparicio 已提交
607
    fn get_mut(&mut self, index: uint) -> Option<&mut T> {
B
Brian Anderson 已提交
608
        if index < self.len() { Some(&mut self[index]) } else { None }
609 610 611
    }

    #[inline]
J
Jorge Aparicio 已提交
612
    fn as_mut_slice(&mut self) -> &mut [T] { self }
613

J
Jorge Aparicio 已提交
614
    fn slice_mut(&mut self, start: uint, end: uint) -> &mut [T] {
615
        self[mut start..end]
616 617 618
    }

    #[inline]
J
Jorge Aparicio 已提交
619
    fn slice_from_mut(&mut self, start: uint) -> &mut [T] {
620
        self[mut start..]
621 622 623
    }

    #[inline]
J
Jorge Aparicio 已提交
624
    fn slice_to_mut(&mut self, end: uint) -> &mut [T] {
625
        self[mut ..end]
626 627
    }

628
    #[inline]
J
Jorge Aparicio 已提交
629
    fn split_at_mut(&mut self, mid: uint) -> (&mut [T], &mut [T]) {
B
Brian Anderson 已提交
630
        unsafe {
J
Jorge Aparicio 已提交
631
            let self2: &mut [T] = mem::transmute_copy(&self);
632
            (self[mut ..mid], self2[mut mid..])
B
Brian Anderson 已提交
633
        }
634 635 636
    }

    #[inline]
J
Jorge Aparicio 已提交
637
    fn iter_mut<'a>(&'a mut self) -> MutItems<'a, T> {
B
Brian Anderson 已提交
638 639 640 641 642 643 644 645 646 647 648 649 650 651
        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}
            }
        }
652 653 654
    }

    #[inline]
J
Jorge Aparicio 已提交
655
    fn last_mut(&mut self) -> Option<&mut T> {
B
Brian Anderson 已提交
656 657 658
        let len = self.len();
        if len == 0 { return None; }
        Some(&mut self[len - 1])
659 660
    }

A
Aaron Turon 已提交
661
    #[inline]
J
Jorge Aparicio 已提交
662
    fn head_mut(&mut self) -> Option<&mut T> {
A
Aaron Turon 已提交
663 664 665 666
        if self.len() == 0 { None } else { Some(&mut self[0]) }
    }

    #[inline]
J
Jorge Aparicio 已提交
667
    fn tail_mut(&mut self) -> &mut [T] {
A
Aaron Turon 已提交
668
        let len = self.len();
669
        self[mut 1..len]
A
Aaron Turon 已提交
670 671 672
    }

    #[inline]
J
Jorge Aparicio 已提交
673
    fn init_mut(&mut self) -> &mut [T] {
A
Aaron Turon 已提交
674
        let len = self.len();
675
        self[mut 0..len - 1]
A
Aaron Turon 已提交
676 677
    }

678
    #[inline]
J
Jorge Aparicio 已提交
679
    fn split_mut<'a>(&'a mut self, pred: |&T|: 'a -> bool) -> MutSplits<'a, T> {
B
Brian Anderson 已提交
680
        MutSplits { v: self, pred: pred, finished: false }
681 682
    }

A
Aaron Turon 已提交
683
    #[inline]
J
Jorge Aparicio 已提交
684
    fn splitn_mut<'a>(&'a mut self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<MutSplits<'a, T>> {
A
Aaron Turon 已提交
685 686 687 688 689 690 691 692
        SplitsN {
            iter: self.split_mut(pred),
            count: n,
            invert: false
        }
    }

    #[inline]
J
Jorge Aparicio 已提交
693
    fn rsplitn_mut<'a>(&'a mut self, n: uint, pred: |&T|: 'a -> bool) -> SplitsN<MutSplits<'a, T>> {
A
Aaron Turon 已提交
694 695 696 697 698 699 700
        SplitsN {
            iter: self.split_mut(pred),
            count: n,
            invert: true
        }
   }

B
Brian Anderson 已提交
701
    #[inline]
J
Jorge Aparicio 已提交
702
    fn chunks_mut(&mut self, chunk_size: uint) -> MutChunks<T> {
B
Brian Anderson 已提交
703 704
        assert!(chunk_size > 0);
        MutChunks { v: self, chunk_size: chunk_size }
705 706
    }

J
Jorge Aparicio 已提交
707
    fn swap(&mut self, a: uint, b: uint) {
B
Brian Anderson 已提交
708 709 710 711 712 713 714 715 716
        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);
        }
    }

J
Jorge Aparicio 已提交
717
    fn reverse(&mut self) {
B
Brian Anderson 已提交
718 719 720
        let mut i: uint = 0;
        let ln = self.len();
        while i < ln / 2 {
B
Brian Anderson 已提交
721 722
            // Unsafe swap to avoid the bounds check in safe swap.
            unsafe {
A
Aaron Turon 已提交
723 724
                let pa: *mut T = self.unsafe_mut(i);
                let pb: *mut T = self.unsafe_mut(ln - i - 1);
B
Brian Anderson 已提交
725 726
                ptr::swap(pa, pb);
            }
B
Brian Anderson 已提交
727 728 729 730 731
            i += 1;
        }
    }

    #[inline]
J
Jorge Aparicio 已提交
732
    unsafe fn unsafe_mut(&mut self, index: uint) -> &mut T {
B
Brian Anderson 已提交
733 734 735 736
        transmute((self.repr().data as *mut T).offset(index as int))
    }

    #[inline]
J
Jorge Aparicio 已提交
737
    fn as_mut_ptr(&mut self) -> *mut T {
B
Brian Anderson 已提交
738 739
        self.repr().data as *mut T
    }
740 741
}

A
Aaron Turon 已提交
742
/// Extension methods for slices containing `PartialEq` elements.
743
#[unstable = "may merge with other traits"]
J
Jorge Aparicio 已提交
744
pub trait ImmutablePartialEqSlice<T: PartialEq> for Sized? {
A
Aaron Turon 已提交
745
    /// Find the first index containing a matching value.
746 747
    fn position_elem(&self, t: &T) -> Option<uint>;

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

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

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

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

761
#[unstable = "trait is unstable"]
J
Jorge Aparicio 已提交
762
impl<T: PartialEq> ImmutablePartialEqSlice<T> for [T] {
763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
    #[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();
J
Jorge Aparicio 已提交
781
        self.len() >= n && needle == self[..n]
782 783 784 785 786
    }

    #[inline]
    fn ends_with(&self, needle: &[T]) -> bool {
        let (m, n) = (self.len(), needle.len());
J
Jorge Aparicio 已提交
787
        m >= n && needle == self[m-n..]
788 789 790
    }
}

A
Aaron Turon 已提交
791
/// Extension methods for slices containing `Ord` elements.
792
#[unstable = "may merge with other traits"]
J
Jorge Aparicio 已提交
793
pub trait ImmutableOrdSlice<T: Ord> for Sized? {
A
Aaron Turon 已提交
794 795 796 797 798 799
    /// 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.
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
    ///
    /// # Example
    ///
    /// Looks up a series of four elements. The first is found, with a
    /// uniquely determined position; the second and third are not
    /// found; the fourth could match any position in `[1,4]`.
    ///
    /// ```rust
    /// use std::slice::{Found, NotFound};
    /// let s = [0i, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
    /// let s = s.as_slice();
    ///
    /// assert_eq!(s.binary_search_elem(&13),  Found(9));
    /// assert_eq!(s.binary_search_elem(&4),   NotFound(7));
    /// assert_eq!(s.binary_search_elem(&100), NotFound(13));
    /// let r = s.binary_search_elem(&1);
    /// assert!(match r { Found(1...4) => true, _ => false, });
    /// ```
A
Aaron Turon 已提交
818
    #[unstable = "name likely to change"]
819
    fn binary_search_elem(&self, x: &T) -> BinarySearchResult;
820 821
}

822
#[unstable = "trait is unstable"]
J
Jorge Aparicio 已提交
823
impl<T: Ord> ImmutableOrdSlice<T> for [T] {
824 825 826 827
    #[unstable]
    fn binary_search_elem(&self, x: &T) -> BinarySearchResult {
        self.binary_search(|p| p.cmp(x))
    }
828 829
}

B
Brian Anderson 已提交
830
/// Trait for &[T] where T is Cloneable
831
#[unstable = "may merge with other traits"]
J
Jorge Aparicio 已提交
832
pub trait MutableCloneableSlice<T> for Sized? {
B
Brian Anderson 已提交
833 834 835
    /// 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.
836 837 838 839
    ///
    /// # Example
    ///
    /// ```rust
840
    /// use std::slice::MutableCloneableSlice;
841
    ///
B
Brian Anderson 已提交
842 843
    /// let mut dst = [0i, 0, 0];
    /// let src = [1i, 2];
844
    ///
845
    /// assert!(dst.clone_from_slice(src) == 2);
B
Brian Anderson 已提交
846
    /// assert!(dst == [1, 2, 0]);
847
    ///
B
Brian Anderson 已提交
848
    /// let src2 = [3i, 4, 5, 6];
849
    /// assert!(dst.clone_from_slice(src2) == 3);
B
Brian Anderson 已提交
850
    /// assert!(dst == [3i, 4, 5]);
851
    /// ```
J
Jorge Aparicio 已提交
852
    fn clone_from_slice(&mut self, &[T]) -> uint;
B
Brian Anderson 已提交
853
}
854

855
#[unstable = "trait is unstable"]
J
Jorge Aparicio 已提交
856
impl<T: Clone> MutableCloneableSlice<T> for [T] {
B
Brian Anderson 已提交
857
    #[inline]
J
Jorge Aparicio 已提交
858
    fn clone_from_slice(&mut self, src: &[T]) -> uint {
J
Julian Orth 已提交
859 860 861 862 863
        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]);
B
Brian Anderson 已提交
864
        }
J
Julian Orth 已提交
865
        min
B
Brian Anderson 已提交
866 867
    }
}
868 869 870 871




B
Brian Anderson 已提交
872 873 874
//
// Common traits
//
875

A
Aaron Turon 已提交
876
/// Data that is viewable as a slice.
877
#[unstable = "may merge with other traits"]
N
Nick Cameron 已提交
878
pub trait AsSlice<T> {
B
Brian Anderson 已提交
879 880
    /// Work with `self` as a slice.
    fn as_slice<'a>(&'a self) -> &'a [T];
881 882
}

883
#[unstable = "trait is unstable"]
N
Nick Cameron 已提交
884
impl<'a,T> AsSlice<T> for &'a [T] {
B
Brian Anderson 已提交
885 886 887 888
    #[inline(always)]
    fn as_slice<'a>(&'a self) -> &'a [T] { *self }
}

889
#[experimental = "trait is experimental"]
B
Brian Anderson 已提交
890
impl<'a, T> Collection for &'a [T] {
A
Aaron Turon 已提交
891
    /// Returns the length of a slice.
B
bachm 已提交
892
    #[inline]
B
Brian Anderson 已提交
893 894
    fn len(&self) -> uint {
        self.repr().len
B
bachm 已提交
895
    }
B
Brian Anderson 已提交
896 897
}

898 899
#[experimental = "trait is experimental"]
impl<'a, T> Collection for &'a mut [T] {
A
Aaron Turon 已提交
900
    /// Returns the length of a slice.
901 902 903 904 905 906
    #[inline]
    fn len(&self) -> uint {
        self.repr().len
    }
}

907
#[unstable = "waiting for DST"]
B
Brian Anderson 已提交
908 909 910 911 912 913 914 915 916 917 918
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) => {
919
        #[experimental = "needs review"]
B
Brian Anderson 已提交
920 921 922 923 924 925 926 927
        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 {
928
                        if mem::size_of::<T>() == 0 {
B
Brian Anderson 已提交
929 930 931
                            // purposefully don't use 'ptr.offset' because for
                            // vectors with 0-size elements this would return the
                            // same pointer.
932 933 934 935
                            self.ptr = transmute(self.ptr as uint + 1);

                            // Use a non-null pointer value
                            Some(transmute(1u))
B
Brian Anderson 已提交
936
                        } else {
937 938
                            let old = self.ptr;
                            self.ptr = self.ptr.offset(1);
B
Brian Anderson 已提交
939

940 941
                            Some(transmute(old))
                        }
B
Brian Anderson 已提交
942 943 944 945 946 947 948 949 950 951 952 953 954
                    }
                }
            }

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

955
        #[experimental = "needs review"]
B
Brian Anderson 已提交
956 957 958 959 960 961 962 963
        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 {
964
                        if mem::size_of::<T>() == 0 {
B
Brian Anderson 已提交
965
                            // See above for why 'ptr.offset' isn't used
966 967 968 969
                            self.end = transmute(self.end as uint - 1);

                            // Use a non-null pointer value
                            Some(transmute(1u))
B
Brian Anderson 已提交
970
                        } else {
971 972 973 974
                            self.end = self.end.offset(-1);

                            Some(transmute(self.end))
                        }
B
Brian Anderson 已提交
975 976 977 978 979 980 981 982
                    }
                }
            }
        }
    }
}

/// Immutable slice iterator
983
#[experimental = "needs review"]
984
pub struct Items<'a, T: 'a> {
B
Brian Anderson 已提交
985 986 987 988 989 990 991
    ptr: *const T,
    end: *const T,
    marker: marker::ContravariantLifetime<'a>
}

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

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

995
#[experimental = "needs review"]
B
Brian Anderson 已提交
996 997 998 999
impl<'a, T> Clone for Items<'a, T> {
    fn clone(&self) -> Items<'a, T> { *self }
}

1000
#[experimental = "needs review"]
B
Brian Anderson 已提交
1001
impl<'a, T> RandomAccessIterator<&'a T> for Items<'a, T> {
1002
    #[inline]
B
Brian Anderson 已提交
1003 1004 1005 1006
    fn indexable(&self) -> uint {
        let (exact, _) = self.size_hint();
        exact
    }
1007

B
Brian Anderson 已提交
1008 1009
    #[inline]
    fn idx(&mut self, index: uint) -> Option<&'a T> {
1010
        unsafe {
B
Brian Anderson 已提交
1011
            if index < self.indexable() {
1012 1013 1014 1015 1016 1017
                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 已提交
1018 1019 1020 1021 1022 1023 1024
            } else {
                None
            }
        }
    }
}

A
Aaron Turon 已提交
1025
/// Mutable slice iterator.
1026
#[experimental = "needs review"]
1027
pub struct MutItems<'a, T: 'a> {
B
Brian Anderson 已提交
1028 1029 1030 1031 1032 1033 1034 1035
    ptr: *mut T,
    end: *mut T,
    marker: marker::ContravariantLifetime<'a>,
    marker2: marker::NoCopy
}

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

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

A
Aaron Turon 已提交
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
/// 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.
1049
#[experimental = "needs review"]
1050 1051 1052 1053 1054 1055
pub struct Splits<'a, T:'a> {
    v: &'a [T],
    pred: |t: &T|: 'a -> bool,
    finished: bool
}

1056
#[experimental = "needs review"]
B
Brian Anderson 已提交
1057 1058 1059 1060 1061 1062
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 已提交
1063
            None => self.finish(),
B
Brian Anderson 已提交
1064
            Some(idx) => {
1065 1066
                let ret = Some(self.v[..idx]);
                self.v = self.v[idx + 1..];
B
Brian Anderson 已提交
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
                ret
            }
        }
    }

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

1082
#[experimental = "needs review"]
B
Brian Anderson 已提交
1083 1084 1085 1086 1087 1088
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 已提交
1089
            None => self.finish(),
B
Brian Anderson 已提交
1090
            Some(idx) => {
1091 1092
                let ret = Some(self.v[idx + 1..]);
                self.v = self.v[..idx];
B
Brian Anderson 已提交
1093 1094 1095 1096 1097 1098
                ret
            }
        }
    }
}

A
Aaron Turon 已提交
1099 1100 1101 1102 1103 1104 1105
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 已提交
1106 1107
/// An iterator over the subslices of the vector which are separated
/// by elements that match `pred`.
1108
#[experimental = "needs review"]
1109 1110 1111 1112 1113 1114
pub struct MutSplits<'a, T:'a> {
    v: &'a mut [T],
    pred: |t: &T|: 'a -> bool,
    finished: bool
}

A
Aaron Turon 已提交
1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
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 []))
        }
    }
}

1127
#[experimental = "needs review"]
B
Brian Anderson 已提交
1128 1129 1130 1131 1132
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 已提交
1133 1134 1135 1136 1137 1138
        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 已提交
1139 1140
            Some(idx) => {
                let tmp = mem::replace(&mut self.v, &mut []);
A
Aaron Turon 已提交
1141
                let (head, tail) = tmp.split_at_mut(idx);
1142
                self.v = tail[mut 1..];
B
Brian Anderson 已提交
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
                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))
        }
    }
}

1160
#[experimental = "needs review"]
B
Brian Anderson 已提交
1161 1162 1163 1164 1165
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 已提交
1166 1167 1168 1169 1170 1171
        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 已提交
1172 1173
            Some(idx) => {
                let tmp = mem::replace(&mut self.v, &mut []);
A
Aaron Turon 已提交
1174
                let (head, tail) = tmp.split_at_mut(idx);
B
Brian Anderson 已提交
1175
                self.v = head;
1176
                Some(tail[mut 1..])
B
Brian Anderson 已提交
1177 1178 1179 1180 1181
            }
        }
    }
}

A
Aaron Turon 已提交
1182 1183
/// An iterator over subslices separated by elements that match a predicate
/// function, splitting at most a fixed number of times.
1184
#[experimental = "needs review"]
A
Aaron Turon 已提交
1185 1186
pub struct SplitsN<I> {
    iter: I,
1187 1188 1189 1190
    count: uint,
    invert: bool
}

1191
#[experimental = "needs review"]
A
Aaron Turon 已提交
1192
impl<E, I: SplitsIter<E>> Iterator<E> for SplitsN<I> {
B
Brian Anderson 已提交
1193
    #[inline]
A
Aaron Turon 已提交
1194
    fn next(&mut self) -> Option<E> {
B
Brian Anderson 已提交
1195
        if self.count == 0 {
A
Aaron Turon 已提交
1196
            self.iter.finish()
B
Brian Anderson 已提交
1197 1198 1199
        } else {
            self.count -= 1;
            if self.invert { self.iter.next_back() } else { self.iter.next() }
1200 1201 1202 1203
        }
    }

    #[inline]
B
Brian Anderson 已提交
1204
    fn size_hint(&self) -> (uint, Option<uint>) {
A
Aaron Turon 已提交
1205 1206
        let (lower, upper_opt) = self.iter.size_hint();
        (lower, upper_opt.map(|upper| cmp::min(self.count + 1, upper)))
1207
    }
B
Brian Anderson 已提交
1208 1209
}

A
Aaron Turon 已提交
1210
/// An iterator over overlapping subslices of length `size`.
1211
#[deriving(Clone)]
1212
#[experimental = "needs review"]
1213 1214 1215 1216 1217
pub struct Windows<'a, T:'a> {
    v: &'a [T],
    size: uint
}

B
Brian Anderson 已提交
1218
impl<'a, T> Iterator<&'a [T]> for Windows<'a, T> {
1219
    #[inline]
B
Brian Anderson 已提交
1220 1221 1222 1223
    fn next(&mut self) -> Option<&'a [T]> {
        if self.size > self.v.len() {
            None
        } else {
1224 1225
            let ret = Some(self.v[..self.size]);
            self.v = self.v[1..];
B
Brian Anderson 已提交
1226 1227
            ret
        }
1228 1229 1230
    }

    #[inline]
B
Brian Anderson 已提交
1231 1232 1233 1234 1235 1236
    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))
1237 1238
        }
    }
B
Brian Anderson 已提交
1239 1240
}

A
Aaron Turon 已提交
1241 1242
/// An iterator over a slice in (non-overlapping) chunks (`size` elements at a
/// time).
B
Brian Anderson 已提交
1243
///
A
Aaron Turon 已提交
1244 1245
/// 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 已提交
1246
#[deriving(Clone)]
1247
#[experimental = "needs review"]
1248 1249 1250 1251 1252
pub struct Chunks<'a, T:'a> {
    v: &'a [T],
    size: uint
}

1253
#[experimental = "needs review"]
B
Brian Anderson 已提交
1254
impl<'a, T> Iterator<&'a [T]> for Chunks<'a, T> {
1255
    #[inline]
B
Brian Anderson 已提交
1256 1257 1258 1259 1260
    fn next(&mut self) -> Option<&'a [T]> {
        if self.v.len() == 0 {
            None
        } else {
            let chunksz = cmp::min(self.v.len(), self.size);
1261
            let (fst, snd) = self.v.split_at(chunksz);
B
Brian Anderson 已提交
1262 1263
            self.v = snd;
            Some(fst)
1264 1265 1266 1267
        }
    }

    #[inline]
B
Brian Anderson 已提交
1268 1269 1270 1271 1272 1273 1274 1275
    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))
        }
1276
    }
B
Brian Anderson 已提交
1277
}
1278

1279
#[experimental = "needs review"]
B
Brian Anderson 已提交
1280
impl<'a, T> DoubleEndedIterator<&'a [T]> for Chunks<'a, T> {
1281
    #[inline]
B
Brian Anderson 已提交
1282 1283 1284 1285 1286 1287
    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 };
1288
            let (fst, snd) = self.v.split_at(self.v.len() - chunksz);
B
Brian Anderson 已提交
1289 1290 1291
            self.v = fst;
            Some(snd)
        }
1292
    }
B
Brian Anderson 已提交
1293
}
1294

1295
#[experimental = "needs review"]
B
Brian Anderson 已提交
1296
impl<'a, T> RandomAccessIterator<&'a [T]> for Chunks<'a, T> {
1297
    #[inline]
B
Brian Anderson 已提交
1298 1299
    fn indexable(&self) -> uint {
        self.v.len()/self.size + if self.v.len() % self.size != 0 { 1 } else { 0 }
1300 1301
    }

B
Brian Anderson 已提交
1302 1303 1304 1305 1306 1307
    #[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(); }
1308

1309
            Some(self.v[lo..hi])
B
Brian Anderson 已提交
1310 1311
        } else {
            None
1312 1313
        }
    }
B
Brian Anderson 已提交
1314
}
1315

A
Aaron Turon 已提交
1316 1317 1318
/// 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.
1319
#[experimental = "needs review"]
1320 1321 1322 1323 1324
pub struct MutChunks<'a, T:'a> {
    v: &'a mut [T],
    chunk_size: uint
}

1325
#[experimental = "needs review"]
B
Brian Anderson 已提交
1326 1327 1328 1329 1330 1331 1332 1333
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 已提交
1334
            let (head, tail) = tmp.split_at_mut(sz);
B
Brian Anderson 已提交
1335 1336
            self.v = tail;
            Some(head)
1337 1338 1339 1340
        }
    }

    #[inline]
B
Brian Anderson 已提交
1341 1342 1343 1344 1345 1346 1347 1348
    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))
        }
1349
    }
B
Brian Anderson 已提交
1350
}
1351

1352
#[experimental = "needs review"]
B
Brian Anderson 已提交
1353
impl<'a, T> DoubleEndedIterator<&'a mut [T]> for MutChunks<'a, T> {
1354
    #[inline]
B
Brian Anderson 已提交
1355 1356 1357 1358 1359 1360 1361 1362
    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 已提交
1363
            let (head, tail) = tmp.split_at_mut(tmp_len - sz);
B
Brian Anderson 已提交
1364 1365 1366
            self.v = head;
            Some(tail)
        }
1367
    }
B
Brian Anderson 已提交
1368
}
1369 1370 1371



1372 1373 1374 1375 1376 1377 1378
/// 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)]
1379
#[experimental = "needs review"]
1380 1381 1382 1383 1384 1385 1386
pub enum BinarySearchResult {
    /// The index of the found value.
    Found(uint),
    /// The index where the value should have been found.
    NotFound(uint)
}

1387
#[experimental = "needs review"]
1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408
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)
        }
    }
}


1409

B
Brian Anderson 已提交
1410 1411 1412
//
// Free functions
//
1413

B
Brian Anderson 已提交
1414 1415 1416
/**
 * Converts a pointer to A into a slice of length 1 (without copying).
 */
1417
#[unstable = "waiting for DST"]
B
Brian Anderson 已提交
1418 1419
pub fn ref_slice<'a, A>(s: &'a A) -> &'a [A] {
    unsafe {
1420
        transmute(RawSlice { data: s, len: 1 })
B
Brian Anderson 已提交
1421 1422 1423 1424 1425 1426
    }
}

/**
 * Converts a pointer to A into a slice of length 1 (without copying).
 */
1427
#[unstable = "waiting for DST"]
B
Brian Anderson 已提交
1428 1429 1430
pub fn mut_ref_slice<'a, A>(s: &'a mut A) -> &'a mut [A] {
    unsafe {
        let ptr: *const A = transmute(s);
1431
        transmute(RawSlice { data: ptr, len: 1 })
1432 1433 1434
    }
}

B
Brian Anderson 已提交
1435 1436 1437 1438 1439 1440 1441



//
// Submodules
//

1442
/// Unsafe operations
1443
#[experimental = "needs review"]
1444
pub mod raw {
A
Alex Crichton 已提交
1445
    use mem::transmute;
1446 1447
    use ptr::RawPtr;
    use raw::Slice;
1448
    use option::{None, Option, Some};
1449 1450 1451 1452 1453 1454

    /**
     * Form a slice from a pointer and length (as a number of units,
     * not bytes).
     */
    #[inline]
1455
    pub unsafe fn buf_as_slice<T,U>(p: *const T, len: uint, f: |v: &[T]| -> U)
1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474
                               -> 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 {
1475
            data: p as *const T,
1476 1477 1478 1479 1480 1481
            len: len
        }))
    }

    /**
     * Returns a pointer to first element in slice and adjusts
1482 1483
     * slice so it no longer contains that element. Returns None
     * if the slice is empty. O(1).
1484
     */
1485
     #[inline]
1486
    pub unsafe fn shift_ptr<T>(slice: &mut Slice<T>) -> Option<*const T> {
1487
        if slice.len == 0 { return None; }
1488
        let head: *const T = slice.data;
1489 1490
        slice.data = slice.data.offset(1);
        slice.len -= 1;
1491
        Some(head)
1492 1493 1494 1495
    }

    /**
     * Returns a pointer to last element in slice and adjusts
1496 1497
     * slice so it no longer contains that element. Returns None
     * if the slice is empty. O(1).
1498
     */
1499
     #[inline]
1500
    pub unsafe fn pop_ptr<T>(slice: &mut Slice<T>) -> Option<*const T> {
1501
        if slice.len == 0 { return None; }
1502
        let tail: *const T = slice.data.offset((slice.len - 1) as int);
1503
        slice.len -= 1;
1504
        Some(tail)
1505 1506 1507 1508
    }
}

/// Operations on `[u8]`.
1509
#[experimental = "needs review"]
1510
pub mod bytes {
1511
    use collections::Collection;
J
Jorge Aparicio 已提交
1512
    use kinds::Sized;
1513
    use ptr;
1514
    use slice::{ImmutableSlice, MutableSlice};
1515 1516

    /// A trait for operations on mutable `[u8]`s.
J
Jorge Aparicio 已提交
1517
    pub trait MutableByteVector for Sized? {
1518
        /// Sets all bytes of the receiver to the given value.
J
Jorge Aparicio 已提交
1519
        fn set_memory(&mut self, value: u8);
1520 1521
    }

J
Jorge Aparicio 已提交
1522
    impl MutableByteVector for [u8] {
1523
        #[inline]
1524
        #[allow(experimental)]
J
Jorge Aparicio 已提交
1525
        fn set_memory(&mut self, value: u8) {
1526 1527 1528 1529 1530 1531 1532 1533 1534 1535
            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]
    pub fn copy_memory(dst: &mut [u8], src: &[u8]) {
1536 1537 1538 1539 1540 1541 1542
        let len_src = src.len();
        assert!(dst.len() >= len_src);
        unsafe {
            ptr::copy_nonoverlapping_memory(dst.as_mut_ptr(),
                                            src.as_ptr(),
                                            len_src);
        }
1543 1544 1545 1546 1547
    }
}



B
Brian Anderson 已提交
1548 1549 1550
//
// Boilerplate traits
//
1551

1552
#[unstable = "waiting for DST"]
1553 1554 1555 1556 1557 1558 1559 1560
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())
1561
    }
1562
}
1563

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

1567
#[unstable = "waiting for DST"]
N
Nick Cameron 已提交
1568
impl<'a,T:PartialEq, V: AsSlice<T>> Equiv<V> for &'a [T] {
1569 1570 1571
    #[inline]
    fn equiv(&self, other: &V) -> bool { self.as_slice() == other.as_slice() }
}
1572

N
Nick Cameron 已提交
1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588
#[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"]
N
Nick Cameron 已提交
1589
impl<'a,T:PartialEq, V: AsSlice<T>> Equiv<V> for &'a mut [T] {
N
Nick Cameron 已提交
1590 1591 1592 1593
    #[inline]
    fn equiv(&self, other: &V) -> bool { self.as_slice() == other.as_slice() }
}

1594
#[unstable = "waiting for DST"]
1595 1596 1597
impl<'a,T:Ord> Ord for &'a [T] {
    fn cmp(&self, other: & &'a [T]) -> Ordering {
        order::cmp(self.iter(), other.iter())
1598
    }
1599
}
1600

1601
#[unstable = "waiting for DST"]
1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621
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())
1622 1623
    }
}
J
Julian Orth 已提交
1624 1625 1626

/// Extension methods for immutable slices containing integers.
#[experimental]
J
Jorge Aparicio 已提交
1627
pub trait ImmutableIntSlice<U, S> for Sized? {
J
Julian Orth 已提交
1628
    /// Converts the slice to an immutable slice of unsigned integers with the same width.
J
Jorge Aparicio 已提交
1629
    fn as_unsigned<'a>(&'a self) -> &'a [U];
J
Julian Orth 已提交
1630
    /// Converts the slice to an immutable slice of signed integers with the same width.
J
Jorge Aparicio 已提交
1631
    fn as_signed<'a>(&'a self) -> &'a [S];
J
Julian Orth 已提交
1632 1633 1634 1635
}

/// Extension methods for mutable slices containing integers.
#[experimental]
J
Jorge Aparicio 已提交
1636
pub trait MutableIntSlice<U, S> for Sized?: ImmutableIntSlice<U, S> {
J
Julian Orth 已提交
1637
    /// Converts the slice to a mutable slice of unsigned integers with the same width.
J
Jorge Aparicio 已提交
1638
    fn as_unsigned_mut<'a>(&'a mut self) -> &'a mut [U];
J
Julian Orth 已提交
1639
    /// Converts the slice to a mutable slice of signed integers with the same width.
J
Jorge Aparicio 已提交
1640
    fn as_signed_mut<'a>(&'a mut self) -> &'a mut [S];
J
Julian Orth 已提交
1641 1642 1643 1644 1645
}

macro_rules! impl_immut_int_slice {
    ($u:ty, $s:ty, $t:ty) => {
        #[experimental]
J
Jorge Aparicio 已提交
1646
        impl ImmutableIntSlice<$u, $s> for [$t] {
J
Julian Orth 已提交
1647
            #[inline]
J
Jorge Aparicio 已提交
1648
            fn as_unsigned(&self) -> &[$u] { unsafe { transmute(self) } }
J
Julian Orth 已提交
1649
            #[inline]
J
Jorge Aparicio 已提交
1650
            fn as_signed(&self) -> &[$s] { unsafe { transmute(self) } }
J
Julian Orth 已提交
1651 1652 1653 1654 1655 1656
        }
    }
}
macro_rules! impl_mut_int_slice {
    ($u:ty, $s:ty, $t:ty) => {
        #[experimental]
J
Jorge Aparicio 已提交
1657
        impl MutableIntSlice<$u, $s> for [$t] {
J
Julian Orth 已提交
1658
            #[inline]
J
Jorge Aparicio 已提交
1659
            fn as_unsigned_mut(&mut self) -> &mut [$u] { unsafe { transmute(self) } }
J
Julian Orth 已提交
1660
            #[inline]
J
Jorge Aparicio 已提交
1661
            fn as_signed_mut(&mut self) -> &mut [$s] { unsafe { transmute(self) } }
J
Julian Orth 已提交
1662 1663 1664 1665 1666 1667
        }
    }
}

macro_rules! impl_int_slice {
    ($u:ty, $s:ty) => {
J
Jorge Aparicio 已提交
1668 1669 1670 1671
        impl_immut_int_slice!($u, $s, $u)
        impl_immut_int_slice!($u, $s, $s)
        impl_mut_int_slice!($u, $s, $u)
        impl_mut_int_slice!($u, $s, $s)
J
Julian Orth 已提交
1672 1673 1674 1675 1676 1677 1678 1679
    }
}

impl_int_slice!(u8,   i8)
impl_int_slice!(u16,  i16)
impl_int_slice!(u32,  i32)
impl_int_slice!(u64,  i64)
impl_int_slice!(uint, int)