]> git.lizzy.rs Git - rust.git/blob - src/libcore/slice.rs
Auto merge of #32133 - alexcrichton:linkchecker, r=brson
[rust.git] / src / libcore / slice.rs
1 // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 //! Slice management and manipulation
12 //!
13 //! For more details `std::slice`.
14
15 #![stable(feature = "rust1", since = "1.0.0")]
16
17 // How this module is organized.
18 //
19 // The library infrastructure for slices is fairly messy. There's
20 // a lot of stuff defined here. Let's keep it clean.
21 //
22 // Since slices don't support inherent methods; all operations
23 // on them are defined on traits, which are then reexported from
24 // the prelude for convenience. So there are a lot of traits here.
25 //
26 // The layout of this file is thus:
27 //
28 // * Slice-specific 'extension' traits and their implementations. This
29 //   is where most of the slice API resides.
30 // * Implementations of a few common traits with important slice ops.
31 // * Definitions of a bunch of iterators.
32 // * Free functions.
33 // * The `raw` and `bytes` submodules.
34 // * Boilerplate trait implementations.
35
36 use clone::Clone;
37 use cmp::{Ordering, PartialEq, PartialOrd, Eq, Ord};
38 use cmp::Ordering::{Less, Equal, Greater};
39 use cmp;
40 use default::Default;
41 use intrinsics::assume;
42 use iter::*;
43 use ops::{FnMut, self, Index};
44 use ops::RangeFull;
45 use option::Option;
46 use option::Option::{None, Some};
47 use result::Result;
48 use result::Result::{Ok, Err};
49 use ptr;
50 use mem;
51 use marker::{Copy, Send, Sync, self};
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
57 //
58 // Extension traits
59 //
60
61 /// Extension methods for slices.
62 #[unstable(feature = "core_slice_ext",
63            reason = "stable interface provided by `impl [T]` in later crates",
64            issue = "27701")]
65 #[allow(missing_docs)] // documented elsewhere
66 pub trait SliceExt {
67     type Item;
68
69     #[stable(feature = "core", since = "1.6.0")]
70     fn split_at(&self, mid: usize) -> (&[Self::Item], &[Self::Item]);
71     #[stable(feature = "core", since = "1.6.0")]
72     fn iter(&self) -> Iter<Self::Item>;
73     #[stable(feature = "core", since = "1.6.0")]
74     fn split<P>(&self, pred: P) -> Split<Self::Item, P>
75                     where P: FnMut(&Self::Item) -> bool;
76     #[stable(feature = "core", since = "1.6.0")]
77     fn splitn<P>(&self, n: usize, pred: P) -> SplitN<Self::Item, P>
78                      where P: FnMut(&Self::Item) -> bool;
79     #[stable(feature = "core", since = "1.6.0")]
80     fn rsplitn<P>(&self,  n: usize, pred: P) -> RSplitN<Self::Item, P>
81                       where P: FnMut(&Self::Item) -> bool;
82     #[stable(feature = "core", since = "1.6.0")]
83     fn windows(&self, size: usize) -> Windows<Self::Item>;
84     #[stable(feature = "core", since = "1.6.0")]
85     fn chunks(&self, size: usize) -> Chunks<Self::Item>;
86     #[stable(feature = "core", since = "1.6.0")]
87     fn get(&self, index: usize) -> Option<&Self::Item>;
88     #[stable(feature = "core", since = "1.6.0")]
89     fn first(&self) -> Option<&Self::Item>;
90     #[stable(feature = "core", since = "1.6.0")]
91     fn split_first(&self) -> Option<(&Self::Item, &[Self::Item])>;
92     #[stable(feature = "core", since = "1.6.0")]
93     fn split_last(&self) -> Option<(&Self::Item, &[Self::Item])>;
94     #[stable(feature = "core", since = "1.6.0")]
95     fn last(&self) -> Option<&Self::Item>;
96     #[stable(feature = "core", since = "1.6.0")]
97     unsafe fn get_unchecked(&self, index: usize) -> &Self::Item;
98     #[stable(feature = "core", since = "1.6.0")]
99     fn as_ptr(&self) -> *const Self::Item;
100     #[stable(feature = "core", since = "1.6.0")]
101     fn binary_search(&self, x: &Self::Item) -> Result<usize, usize>
102         where Self::Item: Ord;
103     #[stable(feature = "core", since = "1.6.0")]
104     fn binary_search_by<F>(&self, f: F) -> Result<usize, usize>
105         where F: FnMut(&Self::Item) -> Ordering;
106     #[stable(feature = "core", since = "1.6.0")]
107     fn len(&self) -> usize;
108     #[stable(feature = "core", since = "1.6.0")]
109     fn is_empty(&self) -> bool { self.len() == 0 }
110     #[stable(feature = "core", since = "1.6.0")]
111     fn get_mut(&mut self, index: usize) -> Option<&mut Self::Item>;
112     #[stable(feature = "core", since = "1.6.0")]
113     fn iter_mut(&mut self) -> IterMut<Self::Item>;
114     #[stable(feature = "core", since = "1.6.0")]
115     fn first_mut(&mut self) -> Option<&mut Self::Item>;
116     #[stable(feature = "core", since = "1.6.0")]
117     fn split_first_mut(&mut self) -> Option<(&mut Self::Item, &mut [Self::Item])>;
118     #[stable(feature = "core", since = "1.6.0")]
119     fn split_last_mut(&mut self) -> Option<(&mut Self::Item, &mut [Self::Item])>;
120     #[stable(feature = "core", since = "1.6.0")]
121     fn last_mut(&mut self) -> Option<&mut Self::Item>;
122     #[stable(feature = "core", since = "1.6.0")]
123     fn split_mut<P>(&mut self, pred: P) -> SplitMut<Self::Item, P>
124                         where P: FnMut(&Self::Item) -> bool;
125     #[stable(feature = "core", since = "1.6.0")]
126     fn splitn_mut<P>(&mut self, n: usize, pred: P) -> SplitNMut<Self::Item, P>
127                      where P: FnMut(&Self::Item) -> bool;
128     #[stable(feature = "core", since = "1.6.0")]
129     fn rsplitn_mut<P>(&mut self,  n: usize, pred: P) -> RSplitNMut<Self::Item, P>
130                       where P: FnMut(&Self::Item) -> bool;
131     #[stable(feature = "core", since = "1.6.0")]
132     fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<Self::Item>;
133     #[stable(feature = "core", since = "1.6.0")]
134     fn swap(&mut self, a: usize, b: usize);
135     #[stable(feature = "core", since = "1.6.0")]
136     fn split_at_mut(&mut self, mid: usize) -> (&mut [Self::Item], &mut [Self::Item]);
137     #[stable(feature = "core", since = "1.6.0")]
138     fn reverse(&mut self);
139     #[stable(feature = "core", since = "1.6.0")]
140     unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut Self::Item;
141     #[stable(feature = "core", since = "1.6.0")]
142     fn as_mut_ptr(&mut self) -> *mut Self::Item;
143
144     #[stable(feature = "core", since = "1.6.0")]
145     fn contains(&self, x: &Self::Item) -> bool where Self::Item: PartialEq;
146
147     #[stable(feature = "core", since = "1.6.0")]
148     fn starts_with(&self, needle: &[Self::Item]) -> bool where Self::Item: PartialEq;
149
150     #[stable(feature = "core", since = "1.6.0")]
151     fn ends_with(&self, needle: &[Self::Item]) -> bool where Self::Item: PartialEq;
152
153     #[stable(feature = "clone_from_slice", since = "1.7.0")]
154     fn clone_from_slice(&mut self, &[Self::Item]) where Self::Item: Clone;
155     #[unstable(feature = "copy_from_slice", issue = "31755")]
156     fn copy_from_slice(&mut self, src: &[Self::Item]) where Self::Item: Copy;
157 }
158
159 // Use macros to be generic over const/mut
160 macro_rules! slice_offset {
161     ($ptr:expr, $by:expr) => {{
162         let ptr = $ptr;
163         if size_from_ptr(ptr) == 0 {
164             ::intrinsics::arith_offset(ptr as *mut i8, $by) as *mut _
165         } else {
166             ptr.offset($by)
167         }
168     }};
169 }
170
171 macro_rules! slice_ref {
172     ($ptr:expr) => {{
173         let ptr = $ptr;
174         if size_from_ptr(ptr) == 0 {
175             // Use a non-null pointer value
176             &mut *(1 as *mut _)
177         } else {
178             mem::transmute(ptr)
179         }
180     }};
181 }
182
183 #[unstable(feature = "core_slice_ext",
184            reason = "stable interface provided by `impl [T]` in later crates",
185            issue = "27701")]
186 impl<T> SliceExt for [T] {
187     type Item = T;
188
189     #[inline]
190     fn split_at(&self, mid: usize) -> (&[T], &[T]) {
191         (&self[..mid], &self[mid..])
192     }
193
194     #[inline]
195     fn iter(&self) -> Iter<T> {
196         unsafe {
197             let p = if mem::size_of::<T>() == 0 {
198                 1 as *const _
199             } else {
200                 let p = self.as_ptr();
201                 assume(!p.is_null());
202                 p
203             };
204
205             Iter {
206                 ptr: p,
207                 end: slice_offset!(p, self.len() as isize),
208                 _marker: marker::PhantomData
209             }
210         }
211     }
212
213     #[inline]
214     fn split<P>(&self, pred: P) -> Split<T, P> where P: FnMut(&T) -> bool {
215         Split {
216             v: self,
217             pred: pred,
218             finished: false
219         }
220     }
221
222     #[inline]
223     fn splitn<P>(&self, n: usize, pred: P) -> SplitN<T, P> where
224         P: FnMut(&T) -> bool,
225     {
226         SplitN {
227             inner: GenericSplitN {
228                 iter: self.split(pred),
229                 count: n,
230                 invert: false
231             }
232         }
233     }
234
235     #[inline]
236     fn rsplitn<P>(&self, n: usize, pred: P) -> RSplitN<T, P> where
237         P: FnMut(&T) -> bool,
238     {
239         RSplitN {
240             inner: GenericSplitN {
241                 iter: self.split(pred),
242                 count: n,
243                 invert: true
244             }
245         }
246     }
247
248     #[inline]
249     fn windows(&self, size: usize) -> Windows<T> {
250         assert!(size != 0);
251         Windows { v: self, size: size }
252     }
253
254     #[inline]
255     fn chunks(&self, size: usize) -> Chunks<T> {
256         assert!(size != 0);
257         Chunks { v: self, size: size }
258     }
259
260     #[inline]
261     fn get(&self, index: usize) -> Option<&T> {
262         if index < self.len() { Some(&self[index]) } else { None }
263     }
264
265     #[inline]
266     fn first(&self) -> Option<&T> {
267         if self.is_empty() { None } else { Some(&self[0]) }
268     }
269
270     #[inline]
271     fn split_first(&self) -> Option<(&T, &[T])> {
272         if self.is_empty() { None } else { Some((&self[0], &self[1..])) }
273     }
274
275     #[inline]
276     fn split_last(&self) -> Option<(&T, &[T])> {
277         let len = self.len();
278         if len == 0 { None } else { Some((&self[len - 1], &self[..(len - 1)])) }
279     }
280
281     #[inline]
282     fn last(&self) -> Option<&T> {
283         if self.is_empty() { None } else { Some(&self[self.len() - 1]) }
284     }
285
286     #[inline]
287     unsafe fn get_unchecked(&self, index: usize) -> &T {
288         &*(self.as_ptr().offset(index as isize))
289     }
290
291     #[inline]
292     fn as_ptr(&self) -> *const T {
293         self as *const [T] as *const T
294     }
295
296     fn binary_search_by<F>(&self, mut f: F) -> Result<usize, usize> where
297         F: FnMut(&T) -> Ordering
298     {
299         let mut base = 0usize;
300         let mut s = self;
301
302         loop {
303             let (head, tail) = s.split_at(s.len() >> 1);
304             if tail.is_empty() {
305                 return Err(base)
306             }
307             match f(&tail[0]) {
308                 Less => {
309                     base += head.len() + 1;
310                     s = &tail[1..];
311                 }
312                 Greater => s = head,
313                 Equal => return Ok(base + head.len()),
314             }
315         }
316     }
317
318     #[inline]
319     fn len(&self) -> usize { self.repr().len }
320
321     #[inline]
322     fn get_mut(&mut self, index: usize) -> Option<&mut T> {
323         if index < self.len() { Some(&mut self[index]) } else { None }
324     }
325
326     #[inline]
327     fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T]) {
328         let len = self.len();
329         let ptr = self.as_mut_ptr();
330
331         unsafe {
332             assert!(mid <= len);
333
334             (from_raw_parts_mut(ptr, mid),
335              from_raw_parts_mut(ptr.offset(mid as isize), len - mid))
336         }
337     }
338
339     #[inline]
340     fn iter_mut(&mut self) -> IterMut<T> {
341         unsafe {
342             let p = if mem::size_of::<T>() == 0 {
343                 1 as *mut _
344             } else {
345                 let p = self.as_mut_ptr();
346                 assume(!p.is_null());
347                 p
348             };
349
350             IterMut {
351                 ptr: p,
352                 end: slice_offset!(p, self.len() as isize),
353                 _marker: marker::PhantomData
354             }
355         }
356     }
357
358     #[inline]
359     fn last_mut(&mut self) -> Option<&mut T> {
360         let len = self.len();
361         if len == 0 { return None; }
362         Some(&mut self[len - 1])
363     }
364
365     #[inline]
366     fn first_mut(&mut self) -> Option<&mut T> {
367         if self.is_empty() { None } else { Some(&mut self[0]) }
368     }
369
370     #[inline]
371     fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])> {
372         if self.is_empty() { None } else {
373             let split = self.split_at_mut(1);
374             Some((&mut split.0[0], split.1))
375         }
376     }
377
378     #[inline]
379     fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])> {
380         let len = self.len();
381         if len == 0 { None } else {
382             let split = self.split_at_mut(len - 1);
383             Some((&mut split.1[0], split.0))
384         }
385     }
386
387     #[inline]
388     fn split_mut<P>(&mut self, pred: P) -> SplitMut<T, P> where P: FnMut(&T) -> bool {
389         SplitMut { v: self, pred: pred, finished: false }
390     }
391
392     #[inline]
393     fn splitn_mut<P>(&mut self, n: usize, pred: P) -> SplitNMut<T, P> where
394         P: FnMut(&T) -> bool
395     {
396         SplitNMut {
397             inner: GenericSplitN {
398                 iter: self.split_mut(pred),
399                 count: n,
400                 invert: false
401             }
402         }
403     }
404
405     #[inline]
406     fn rsplitn_mut<P>(&mut self, n: usize, pred: P) -> RSplitNMut<T, P> where
407         P: FnMut(&T) -> bool,
408     {
409         RSplitNMut {
410             inner: GenericSplitN {
411                 iter: self.split_mut(pred),
412                 count: n,
413                 invert: true
414             }
415         }
416    }
417
418     #[inline]
419     fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<T> {
420         assert!(chunk_size > 0);
421         ChunksMut { v: self, chunk_size: chunk_size }
422     }
423
424     #[inline]
425     fn swap(&mut self, a: usize, b: usize) {
426         unsafe {
427             // Can't take two mutable loans from one vector, so instead just cast
428             // them to their raw pointers to do the swap
429             let pa: *mut T = &mut self[a];
430             let pb: *mut T = &mut self[b];
431             ptr::swap(pa, pb);
432         }
433     }
434
435     fn reverse(&mut self) {
436         let mut i: usize = 0;
437         let ln = self.len();
438         while i < ln / 2 {
439             // Unsafe swap to avoid the bounds check in safe swap.
440             unsafe {
441                 let pa: *mut T = self.get_unchecked_mut(i);
442                 let pb: *mut T = self.get_unchecked_mut(ln - i - 1);
443                 ptr::swap(pa, pb);
444             }
445             i += 1;
446         }
447     }
448
449     #[inline]
450     unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
451         &mut *self.as_mut_ptr().offset(index as isize)
452     }
453
454     #[inline]
455     fn as_mut_ptr(&mut self) -> *mut T {
456         self as *mut [T] as *mut T
457     }
458
459     #[inline]
460     fn contains(&self, x: &T) -> bool where T: PartialEq {
461         self.iter().any(|elt| *x == *elt)
462     }
463
464     #[inline]
465     fn starts_with(&self, needle: &[T]) -> bool where T: PartialEq {
466         let n = needle.len();
467         self.len() >= n && needle == &self[..n]
468     }
469
470     #[inline]
471     fn ends_with(&self, needle: &[T]) -> bool where T: PartialEq {
472         let (m, n) = (self.len(), needle.len());
473         m >= n && needle == &self[m-n..]
474     }
475
476     fn binary_search(&self, x: &T) -> Result<usize, usize> where T: Ord {
477         self.binary_search_by(|p| p.cmp(x))
478     }
479
480     #[inline]
481     fn clone_from_slice(&mut self, src: &[T]) where T: Clone {
482         assert!(self.len() == src.len(),
483                 "destination and source slices have different lengths");
484         // NOTE: We need to explicitly slice them to the same length
485         // for bounds checking to be elided, and the optimizer will
486         // generate memcpy for simple cases (for example T = u8).
487         let len = self.len();
488         let src = &src[..len];
489         for i in 0..len {
490             self[i].clone_from(&src[i]);
491         }
492     }
493
494     #[inline]
495     fn copy_from_slice(&mut self, src: &[T]) where T: Copy {
496         assert!(self.len() == src.len(),
497                 "destination and source slices have different lengths");
498         unsafe {
499             ptr::copy_nonoverlapping(
500                 src.as_ptr(), self.as_mut_ptr(), self.len());
501         }
502     }
503 }
504
505 #[stable(feature = "rust1", since = "1.0.0")]
506 impl<T> ops::Index<usize> for [T] {
507     type Output = T;
508
509     fn index(&self, index: usize) -> &T {
510         assert!(index < self.len());
511         unsafe { self.get_unchecked(index) }
512     }
513 }
514
515 #[stable(feature = "rust1", since = "1.0.0")]
516 impl<T> ops::IndexMut<usize> for [T] {
517     #[inline]
518     fn index_mut(&mut self, index: usize) -> &mut T {
519         assert!(index < self.len());
520         unsafe { self.get_unchecked_mut(index) }
521     }
522 }
523
524 #[inline(never)]
525 #[cold]
526 fn slice_index_len_fail(index: usize, len: usize) -> ! {
527     panic!("index {} out of range for slice of length {}", index, len);
528 }
529
530 #[inline(never)]
531 #[cold]
532 fn slice_index_order_fail(index: usize, end: usize) -> ! {
533     panic!("slice index starts at {} but ends at {}", index, end);
534 }
535
536 // FIXME implement indexing with inclusive ranges
537
538 #[stable(feature = "rust1", since = "1.0.0")]
539 impl<T> ops::Index<ops::Range<usize>> for [T] {
540     type Output = [T];
541
542     #[inline]
543     fn index(&self, index: ops::Range<usize>) -> &[T] {
544         if index.start > index.end {
545             slice_index_order_fail(index.start, index.end);
546         } else if index.end > self.len() {
547             slice_index_len_fail(index.end, self.len());
548         }
549         unsafe {
550             from_raw_parts (
551                 self.as_ptr().offset(index.start as isize),
552                 index.end - index.start
553             )
554         }
555     }
556 }
557 #[stable(feature = "rust1", since = "1.0.0")]
558 impl<T> ops::Index<ops::RangeTo<usize>> for [T] {
559     type Output = [T];
560
561     #[inline]
562     fn index(&self, index: ops::RangeTo<usize>) -> &[T] {
563         self.index(0 .. index.end)
564     }
565 }
566 #[stable(feature = "rust1", since = "1.0.0")]
567 impl<T> ops::Index<ops::RangeFrom<usize>> for [T] {
568     type Output = [T];
569
570     #[inline]
571     fn index(&self, index: ops::RangeFrom<usize>) -> &[T] {
572         self.index(index.start .. self.len())
573     }
574 }
575 #[stable(feature = "rust1", since = "1.0.0")]
576 impl<T> ops::Index<RangeFull> for [T] {
577     type Output = [T];
578
579     #[inline]
580     fn index(&self, _index: RangeFull) -> &[T] {
581         self
582     }
583 }
584
585 #[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")]
586 impl<T> ops::Index<ops::RangeInclusive<usize>> for [T] {
587     type Output = [T];
588
589     #[inline]
590     fn index(&self, index: ops::RangeInclusive<usize>) -> &[T] {
591         match index {
592             ops::RangeInclusive::Empty { .. } => &[],
593             ops::RangeInclusive::NonEmpty { end, .. } if end == usize::max_value() =>
594                 panic!("attempted to index slice up to maximum usize"),
595             ops::RangeInclusive::NonEmpty { start, end } =>
596                 self.index(start .. end+1)
597         }
598     }
599 }
600 #[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")]
601 impl<T> ops::Index<ops::RangeToInclusive<usize>> for [T] {
602     type Output = [T];
603
604     #[inline]
605     fn index(&self, index: ops::RangeToInclusive<usize>) -> &[T] {
606         // SNAP 4d3eebf change this to `0...index.end`
607         self.index(ops::RangeInclusive::NonEmpty { start: 0, end: index.end })
608     }
609 }
610
611 #[stable(feature = "rust1", since = "1.0.0")]
612 impl<T> ops::IndexMut<ops::Range<usize>> for [T] {
613     #[inline]
614     fn index_mut(&mut self, index: ops::Range<usize>) -> &mut [T] {
615         if index.start > index.end {
616             slice_index_order_fail(index.start, index.end);
617         } else if index.end > self.len() {
618             slice_index_len_fail(index.end, self.len());
619         }
620         unsafe {
621             from_raw_parts_mut(
622                 self.as_mut_ptr().offset(index.start as isize),
623                 index.end - index.start
624             )
625         }
626     }
627 }
628 #[stable(feature = "rust1", since = "1.0.0")]
629 impl<T> ops::IndexMut<ops::RangeTo<usize>> for [T] {
630     #[inline]
631     fn index_mut(&mut self, index: ops::RangeTo<usize>) -> &mut [T] {
632         self.index_mut(0 .. index.end)
633     }
634 }
635 #[stable(feature = "rust1", since = "1.0.0")]
636 impl<T> ops::IndexMut<ops::RangeFrom<usize>> for [T] {
637     #[inline]
638     fn index_mut(&mut self, index: ops::RangeFrom<usize>) -> &mut [T] {
639         let len = self.len();
640         self.index_mut(index.start .. len)
641     }
642 }
643 #[stable(feature = "rust1", since = "1.0.0")]
644 impl<T> ops::IndexMut<RangeFull> for [T] {
645     #[inline]
646     fn index_mut(&mut self, _index: RangeFull) -> &mut [T] {
647         self
648     }
649 }
650
651 #[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")]
652 impl<T> ops::IndexMut<ops::RangeInclusive<usize>> for [T] {
653     #[inline]
654     fn index_mut(&mut self, index: ops::RangeInclusive<usize>) -> &mut [T] {
655         match index {
656             ops::RangeInclusive::Empty { .. } => &mut [],
657             ops::RangeInclusive::NonEmpty { end, .. } if end == usize::max_value() =>
658                 panic!("attempted to index slice up to maximum usize"),
659             ops::RangeInclusive::NonEmpty { start, end } =>
660                 self.index_mut(start .. end+1)
661         }
662     }
663 }
664 #[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")]
665 impl<T> ops::IndexMut<ops::RangeToInclusive<usize>> for [T] {
666     #[inline]
667     fn index_mut(&mut self, index: ops::RangeToInclusive<usize>) -> &mut [T] {
668         // SNAP 4d3eebf change this to `0...index.end`
669         self.index_mut(ops::RangeInclusive::NonEmpty { start: 0, end: index.end })
670     }
671 }
672
673 ////////////////////////////////////////////////////////////////////////////////
674 // Common traits
675 ////////////////////////////////////////////////////////////////////////////////
676
677 #[stable(feature = "rust1", since = "1.0.0")]
678 impl<'a, T> Default for &'a [T] {
679     fn default() -> &'a [T] { &[] }
680 }
681
682 #[stable(feature = "mut_slice_default", since = "1.5.0")]
683 impl<'a, T> Default for &'a mut [T] {
684     fn default() -> &'a mut [T] { &mut [] }
685 }
686
687 //
688 // Iterators
689 //
690
691 #[stable(feature = "rust1", since = "1.0.0")]
692 impl<'a, T> IntoIterator for &'a [T] {
693     type Item = &'a T;
694     type IntoIter = Iter<'a, T>;
695
696     fn into_iter(self) -> Iter<'a, T> {
697         self.iter()
698     }
699 }
700
701 #[stable(feature = "rust1", since = "1.0.0")]
702 impl<'a, T> IntoIterator for &'a mut [T] {
703     type Item = &'a mut T;
704     type IntoIter = IterMut<'a, T>;
705
706     fn into_iter(self) -> IterMut<'a, T> {
707         self.iter_mut()
708     }
709 }
710
711 #[inline(always)]
712 fn size_from_ptr<T>(_: *const T) -> usize {
713     mem::size_of::<T>()
714 }
715
716 // The shared definition of the `Iter` and `IterMut` iterators
717 macro_rules! iterator {
718     (struct $name:ident -> $ptr:ty, $elem:ty) => {
719         #[stable(feature = "rust1", since = "1.0.0")]
720         impl<'a, T> Iterator for $name<'a, T> {
721             type Item = $elem;
722
723             #[inline]
724             fn next(&mut self) -> Option<$elem> {
725                 // could be implemented with slices, but this avoids bounds checks
726                 unsafe {
727                     if mem::size_of::<T>() != 0 {
728                         assume(!self.ptr.is_null());
729                         assume(!self.end.is_null());
730                     }
731                     if self.ptr == self.end {
732                         None
733                     } else {
734                         let old = self.ptr;
735                         self.ptr = slice_offset!(self.ptr, 1);
736                         Some(slice_ref!(old))
737                     }
738                 }
739             }
740
741             #[inline]
742             fn size_hint(&self) -> (usize, Option<usize>) {
743                 let diff = (self.end as usize).wrapping_sub(self.ptr as usize);
744                 let size = mem::size_of::<T>();
745                 let exact = diff / (if size == 0 {1} else {size});
746                 (exact, Some(exact))
747             }
748
749             #[inline]
750             fn count(self) -> usize {
751                 self.size_hint().0
752             }
753
754             #[inline]
755             fn nth(&mut self, n: usize) -> Option<$elem> {
756                 // Call helper method. Can't put the definition here because mut versus const.
757                 self.iter_nth(n)
758             }
759
760             #[inline]
761             fn last(mut self) -> Option<$elem> {
762                 self.next_back()
763             }
764         }
765
766         #[stable(feature = "rust1", since = "1.0.0")]
767         impl<'a, T> DoubleEndedIterator for $name<'a, T> {
768             #[inline]
769             fn next_back(&mut self) -> Option<$elem> {
770                 // could be implemented with slices, but this avoids bounds checks
771                 unsafe {
772                     if mem::size_of::<T>() != 0 {
773                         assume(!self.ptr.is_null());
774                         assume(!self.end.is_null());
775                     }
776                     if self.end == self.ptr {
777                         None
778                     } else {
779                         self.end = slice_offset!(self.end, -1);
780                         Some(slice_ref!(self.end))
781                     }
782                 }
783             }
784         }
785     }
786 }
787
788 macro_rules! make_slice {
789     ($start: expr, $end: expr) => {{
790         let start = $start;
791         let diff = ($end as usize).wrapping_sub(start as usize);
792         if size_from_ptr(start) == 0 {
793             // use a non-null pointer value
794             unsafe { from_raw_parts(1 as *const _, diff) }
795         } else {
796             let len = diff / size_from_ptr(start);
797             unsafe { from_raw_parts(start, len) }
798         }
799     }}
800 }
801
802 macro_rules! make_mut_slice {
803     ($start: expr, $end: expr) => {{
804         let start = $start;
805         let diff = ($end as usize).wrapping_sub(start as usize);
806         if size_from_ptr(start) == 0 {
807             // use a non-null pointer value
808             unsafe { from_raw_parts_mut(1 as *mut _, diff) }
809         } else {
810             let len = diff / size_from_ptr(start);
811             unsafe { from_raw_parts_mut(start, len) }
812         }
813     }}
814 }
815
816 /// Immutable slice iterator
817 #[stable(feature = "rust1", since = "1.0.0")]
818 pub struct Iter<'a, T: 'a> {
819     ptr: *const T,
820     end: *const T,
821     _marker: marker::PhantomData<&'a T>,
822 }
823
824 #[stable(feature = "rust1", since = "1.0.0")]
825 unsafe impl<'a, T: Sync> Sync for Iter<'a, T> {}
826 #[stable(feature = "rust1", since = "1.0.0")]
827 unsafe impl<'a, T: Sync> Send for Iter<'a, T> {}
828
829 impl<'a, T> Iter<'a, T> {
830     /// View the underlying data as a subslice of the original data.
831     ///
832     /// This has the same lifetime as the original slice, and so the
833     /// iterator can continue to be used while this exists.
834     #[stable(feature = "iter_to_slice", since = "1.4.0")]
835     pub fn as_slice(&self) -> &'a [T] {
836         make_slice!(self.ptr, self.end)
837     }
838
839     // Helper function for Iter::nth
840     fn iter_nth(&mut self, n: usize) -> Option<&'a T> {
841         match self.as_slice().get(n) {
842             Some(elem_ref) => unsafe {
843                 self.ptr = slice_offset!(self.ptr, (n as isize).wrapping_add(1));
844                 Some(elem_ref)
845             },
846             None => {
847                 self.ptr = self.end;
848                 None
849             }
850         }
851     }
852 }
853
854 iterator!{struct Iter -> *const T, &'a T}
855
856 #[stable(feature = "rust1", since = "1.0.0")]
857 impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
858
859 #[stable(feature = "rust1", since = "1.0.0")]
860 impl<'a, T> Clone for Iter<'a, T> {
861     fn clone(&self) -> Iter<'a, T> { Iter { ptr: self.ptr, end: self.end, _marker: self._marker } }
862 }
863
864 /// Mutable slice iterator.
865 #[stable(feature = "rust1", since = "1.0.0")]
866 pub struct IterMut<'a, T: 'a> {
867     ptr: *mut T,
868     end: *mut T,
869     _marker: marker::PhantomData<&'a mut T>,
870 }
871
872 #[stable(feature = "rust1", since = "1.0.0")]
873 unsafe impl<'a, T: Sync> Sync for IterMut<'a, T> {}
874 #[stable(feature = "rust1", since = "1.0.0")]
875 unsafe impl<'a, T: Send> Send for IterMut<'a, T> {}
876
877 impl<'a, T> IterMut<'a, T> {
878     /// View the underlying data as a subslice of the original data.
879     ///
880     /// To avoid creating `&mut` references that alias, this is forced
881     /// to consume the iterator. Consider using the `Slice` and
882     /// `SliceMut` implementations for obtaining slices with more
883     /// restricted lifetimes that do not consume the iterator.
884     #[stable(feature = "iter_to_slice", since = "1.4.0")]
885     pub fn into_slice(self) -> &'a mut [T] {
886         make_mut_slice!(self.ptr, self.end)
887     }
888
889     // Helper function for IterMut::nth
890     fn iter_nth(&mut self, n: usize) -> Option<&'a mut T> {
891         match make_mut_slice!(self.ptr, self.end).get_mut(n) {
892             Some(elem_ref) => unsafe {
893                 self.ptr = slice_offset!(self.ptr, (n as isize).wrapping_add(1));
894                 Some(elem_ref)
895             },
896             None => {
897                 self.ptr = self.end;
898                 None
899             }
900         }
901     }
902 }
903
904 iterator!{struct IterMut -> *mut T, &'a mut T}
905
906 #[stable(feature = "rust1", since = "1.0.0")]
907 impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
908
909 /// An internal abstraction over the splitting iterators, so that
910 /// splitn, splitn_mut etc can be implemented once.
911 #[doc(hidden)]
912 trait SplitIter: DoubleEndedIterator {
913     /// Mark the underlying iterator as complete, extracting the remaining
914     /// portion of the slice.
915     fn finish(&mut self) -> Option<Self::Item>;
916 }
917
918 /// An iterator over subslices separated by elements that match a predicate
919 /// function.
920 #[stable(feature = "rust1", since = "1.0.0")]
921 pub struct Split<'a, T:'a, P> where P: FnMut(&T) -> bool {
922     v: &'a [T],
923     pred: P,
924     finished: bool
925 }
926
927 // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
928 #[stable(feature = "rust1", since = "1.0.0")]
929 impl<'a, T, P> Clone for Split<'a, T, P> where P: Clone + FnMut(&T) -> bool {
930     fn clone(&self) -> Split<'a, T, P> {
931         Split {
932             v: self.v,
933             pred: self.pred.clone(),
934             finished: self.finished,
935         }
936     }
937 }
938
939 #[stable(feature = "rust1", since = "1.0.0")]
940 impl<'a, T, P> Iterator for Split<'a, T, P> where P: FnMut(&T) -> bool {
941     type Item = &'a [T];
942
943     #[inline]
944     fn next(&mut self) -> Option<&'a [T]> {
945         if self.finished { return None; }
946
947         match self.v.iter().position(|x| (self.pred)(x)) {
948             None => self.finish(),
949             Some(idx) => {
950                 let ret = Some(&self.v[..idx]);
951                 self.v = &self.v[idx + 1..];
952                 ret
953             }
954         }
955     }
956
957     #[inline]
958     fn size_hint(&self) -> (usize, Option<usize>) {
959         if self.finished {
960             (0, Some(0))
961         } else {
962             (1, Some(self.v.len() + 1))
963         }
964     }
965 }
966
967 #[stable(feature = "rust1", since = "1.0.0")]
968 impl<'a, T, P> DoubleEndedIterator for Split<'a, T, P> where P: FnMut(&T) -> bool {
969     #[inline]
970     fn next_back(&mut self) -> Option<&'a [T]> {
971         if self.finished { return None; }
972
973         match self.v.iter().rposition(|x| (self.pred)(x)) {
974             None => self.finish(),
975             Some(idx) => {
976                 let ret = Some(&self.v[idx + 1..]);
977                 self.v = &self.v[..idx];
978                 ret
979             }
980         }
981     }
982 }
983
984 impl<'a, T, P> SplitIter for Split<'a, T, P> where P: FnMut(&T) -> bool {
985     #[inline]
986     fn finish(&mut self) -> Option<&'a [T]> {
987         if self.finished { None } else { self.finished = true; Some(self.v) }
988     }
989 }
990
991 /// An iterator over the subslices of the vector which are separated
992 /// by elements that match `pred`.
993 #[stable(feature = "rust1", since = "1.0.0")]
994 pub struct SplitMut<'a, T:'a, P> where P: FnMut(&T) -> bool {
995     v: &'a mut [T],
996     pred: P,
997     finished: bool
998 }
999
1000 impl<'a, T, P> SplitIter for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
1001     #[inline]
1002     fn finish(&mut self) -> Option<&'a mut [T]> {
1003         if self.finished {
1004             None
1005         } else {
1006             self.finished = true;
1007             Some(mem::replace(&mut self.v, &mut []))
1008         }
1009     }
1010 }
1011
1012 #[stable(feature = "rust1", since = "1.0.0")]
1013 impl<'a, T, P> Iterator for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
1014     type Item = &'a mut [T];
1015
1016     #[inline]
1017     fn next(&mut self) -> Option<&'a mut [T]> {
1018         if self.finished { return None; }
1019
1020         let idx_opt = { // work around borrowck limitations
1021             let pred = &mut self.pred;
1022             self.v.iter().position(|x| (*pred)(x))
1023         };
1024         match idx_opt {
1025             None => self.finish(),
1026             Some(idx) => {
1027                 let tmp = mem::replace(&mut self.v, &mut []);
1028                 let (head, tail) = tmp.split_at_mut(idx);
1029                 self.v = &mut tail[1..];
1030                 Some(head)
1031             }
1032         }
1033     }
1034
1035     #[inline]
1036     fn size_hint(&self) -> (usize, Option<usize>) {
1037         if self.finished {
1038             (0, Some(0))
1039         } else {
1040             // if the predicate doesn't match anything, we yield one slice
1041             // if it matches every element, we yield len+1 empty slices.
1042             (1, Some(self.v.len() + 1))
1043         }
1044     }
1045 }
1046
1047 #[stable(feature = "rust1", since = "1.0.0")]
1048 impl<'a, T, P> DoubleEndedIterator for SplitMut<'a, T, P> where
1049     P: FnMut(&T) -> bool,
1050 {
1051     #[inline]
1052     fn next_back(&mut self) -> Option<&'a mut [T]> {
1053         if self.finished { return None; }
1054
1055         let idx_opt = { // work around borrowck limitations
1056             let pred = &mut self.pred;
1057             self.v.iter().rposition(|x| (*pred)(x))
1058         };
1059         match idx_opt {
1060             None => self.finish(),
1061             Some(idx) => {
1062                 let tmp = mem::replace(&mut self.v, &mut []);
1063                 let (head, tail) = tmp.split_at_mut(idx);
1064                 self.v = head;
1065                 Some(&mut tail[1..])
1066             }
1067         }
1068     }
1069 }
1070
1071 /// An private iterator over subslices separated by elements that
1072 /// match a predicate function, splitting at most a fixed number of
1073 /// times.
1074 struct GenericSplitN<I> {
1075     iter: I,
1076     count: usize,
1077     invert: bool
1078 }
1079
1080 impl<T, I: SplitIter<Item=T>> Iterator for GenericSplitN<I> {
1081     type Item = T;
1082
1083     #[inline]
1084     fn next(&mut self) -> Option<T> {
1085         match self.count {
1086             0 => None,
1087             1 => { self.count -= 1; self.iter.finish() }
1088             _ => {
1089                 self.count -= 1;
1090                 if self.invert {self.iter.next_back()} else {self.iter.next()}
1091             }
1092         }
1093     }
1094
1095     #[inline]
1096     fn size_hint(&self) -> (usize, Option<usize>) {
1097         let (lower, upper_opt) = self.iter.size_hint();
1098         (lower, upper_opt.map(|upper| cmp::min(self.count, upper)))
1099     }
1100 }
1101
1102 /// An iterator over subslices separated by elements that match a predicate
1103 /// function, limited to a given number of splits.
1104 #[stable(feature = "rust1", since = "1.0.0")]
1105 pub struct SplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
1106     inner: GenericSplitN<Split<'a, T, P>>
1107 }
1108
1109 /// An iterator over subslices separated by elements that match a
1110 /// predicate function, limited to a given number of splits, starting
1111 /// from the end of the slice.
1112 #[stable(feature = "rust1", since = "1.0.0")]
1113 pub struct RSplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
1114     inner: GenericSplitN<Split<'a, T, P>>
1115 }
1116
1117 /// An iterator over subslices separated by elements that match a predicate
1118 /// function, limited to a given number of splits.
1119 #[stable(feature = "rust1", since = "1.0.0")]
1120 pub struct SplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
1121     inner: GenericSplitN<SplitMut<'a, T, P>>
1122 }
1123
1124 /// An iterator over subslices separated by elements that match a
1125 /// predicate function, limited to a given number of splits, starting
1126 /// from the end of the slice.
1127 #[stable(feature = "rust1", since = "1.0.0")]
1128 pub struct RSplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
1129     inner: GenericSplitN<SplitMut<'a, T, P>>
1130 }
1131
1132 macro_rules! forward_iterator {
1133     ($name:ident: $elem:ident, $iter_of:ty) => {
1134         #[stable(feature = "rust1", since = "1.0.0")]
1135         impl<'a, $elem, P> Iterator for $name<'a, $elem, P> where
1136             P: FnMut(&T) -> bool
1137         {
1138             type Item = $iter_of;
1139
1140             #[inline]
1141             fn next(&mut self) -> Option<$iter_of> {
1142                 self.inner.next()
1143             }
1144
1145             #[inline]
1146             fn size_hint(&self) -> (usize, Option<usize>) {
1147                 self.inner.size_hint()
1148             }
1149         }
1150     }
1151 }
1152
1153 forward_iterator! { SplitN: T, &'a [T] }
1154 forward_iterator! { RSplitN: T, &'a [T] }
1155 forward_iterator! { SplitNMut: T, &'a mut [T] }
1156 forward_iterator! { RSplitNMut: T, &'a mut [T] }
1157
1158 /// An iterator over overlapping subslices of length `size`.
1159 #[stable(feature = "rust1", since = "1.0.0")]
1160 pub struct Windows<'a, T:'a> {
1161     v: &'a [T],
1162     size: usize
1163 }
1164
1165 // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
1166 #[stable(feature = "rust1", since = "1.0.0")]
1167 impl<'a, T> Clone for Windows<'a, T> {
1168     fn clone(&self) -> Windows<'a, T> {
1169         Windows {
1170             v: self.v,
1171             size: self.size,
1172         }
1173     }
1174 }
1175
1176 #[stable(feature = "rust1", since = "1.0.0")]
1177 impl<'a, T> Iterator for Windows<'a, T> {
1178     type Item = &'a [T];
1179
1180     #[inline]
1181     fn next(&mut self) -> Option<&'a [T]> {
1182         if self.size > self.v.len() {
1183             None
1184         } else {
1185             let ret = Some(&self.v[..self.size]);
1186             self.v = &self.v[1..];
1187             ret
1188         }
1189     }
1190
1191     #[inline]
1192     fn size_hint(&self) -> (usize, Option<usize>) {
1193         if self.size > self.v.len() {
1194             (0, Some(0))
1195         } else {
1196             let size = self.v.len() - self.size + 1;
1197             (size, Some(size))
1198         }
1199     }
1200
1201     #[inline]
1202     fn count(self) -> usize {
1203         self.size_hint().0
1204     }
1205
1206     #[inline]
1207     fn nth(&mut self, n: usize) -> Option<Self::Item> {
1208         let (end, overflow) = self.size.overflowing_add(n);
1209         if end > self.v.len() || overflow {
1210             self.v = &[];
1211             None
1212         } else {
1213             let nth = &self.v[n..end];
1214             self.v = &self.v[n+1..];
1215             Some(nth)
1216         }
1217     }
1218
1219     #[inline]
1220     fn last(self) -> Option<Self::Item> {
1221         if self.size > self.v.len() {
1222             None
1223         } else {
1224             let start = self.v.len() - self.size;
1225             Some(&self.v[start..])
1226         }
1227     }
1228 }
1229
1230 #[stable(feature = "rust1", since = "1.0.0")]
1231 impl<'a, T> DoubleEndedIterator for Windows<'a, T> {
1232     #[inline]
1233     fn next_back(&mut self) -> Option<&'a [T]> {
1234         if self.size > self.v.len() {
1235             None
1236         } else {
1237             let ret = Some(&self.v[self.v.len()-self.size..]);
1238             self.v = &self.v[..self.v.len()-1];
1239             ret
1240         }
1241     }
1242 }
1243
1244 #[stable(feature = "rust1", since = "1.0.0")]
1245 impl<'a, T> ExactSizeIterator for Windows<'a, T> {}
1246
1247 /// An iterator over a slice in (non-overlapping) chunks (`size` elements at a
1248 /// time).
1249 ///
1250 /// When the slice len is not evenly divided by the chunk size, the last slice
1251 /// of the iteration will be the remainder.
1252 #[stable(feature = "rust1", since = "1.0.0")]
1253 pub struct Chunks<'a, T:'a> {
1254     v: &'a [T],
1255     size: usize
1256 }
1257
1258 // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
1259 #[stable(feature = "rust1", since = "1.0.0")]
1260 impl<'a, T> Clone for Chunks<'a, T> {
1261     fn clone(&self) -> Chunks<'a, T> {
1262         Chunks {
1263             v: self.v,
1264             size: self.size,
1265         }
1266     }
1267 }
1268
1269 #[stable(feature = "rust1", since = "1.0.0")]
1270 impl<'a, T> Iterator for Chunks<'a, T> {
1271     type Item = &'a [T];
1272
1273     #[inline]
1274     fn next(&mut self) -> Option<&'a [T]> {
1275         if self.v.is_empty() {
1276             None
1277         } else {
1278             let chunksz = cmp::min(self.v.len(), self.size);
1279             let (fst, snd) = self.v.split_at(chunksz);
1280             self.v = snd;
1281             Some(fst)
1282         }
1283     }
1284
1285     #[inline]
1286     fn size_hint(&self) -> (usize, Option<usize>) {
1287         if self.v.is_empty() {
1288             (0, Some(0))
1289         } else {
1290             let n = self.v.len() / self.size;
1291             let rem = self.v.len() % self.size;
1292             let n = if rem > 0 { n+1 } else { n };
1293             (n, Some(n))
1294         }
1295     }
1296
1297     #[inline]
1298     fn count(self) -> usize {
1299         self.size_hint().0
1300     }
1301
1302     #[inline]
1303     fn nth(&mut self, n: usize) -> Option<Self::Item> {
1304         let (start, overflow) = n.overflowing_mul(self.size);
1305         if start >= self.v.len() || overflow {
1306             self.v = &[];
1307             None
1308         } else {
1309             let end = match start.checked_add(self.size) {
1310                 Some(sum) => cmp::min(self.v.len(), sum),
1311                 None => self.v.len(),
1312             };
1313             let nth = &self.v[start..end];
1314             self.v = &self.v[end..];
1315             Some(nth)
1316         }
1317     }
1318
1319     #[inline]
1320     fn last(self) -> Option<Self::Item> {
1321         if self.v.is_empty() {
1322             None
1323         } else {
1324             let start = (self.v.len() - 1) / self.size * self.size;
1325             Some(&self.v[start..])
1326         }
1327     }
1328 }
1329
1330 #[stable(feature = "rust1", since = "1.0.0")]
1331 impl<'a, T> DoubleEndedIterator for Chunks<'a, T> {
1332     #[inline]
1333     fn next_back(&mut self) -> Option<&'a [T]> {
1334         if self.v.is_empty() {
1335             None
1336         } else {
1337             let remainder = self.v.len() % self.size;
1338             let chunksz = if remainder != 0 { remainder } else { self.size };
1339             let (fst, snd) = self.v.split_at(self.v.len() - chunksz);
1340             self.v = fst;
1341             Some(snd)
1342         }
1343     }
1344 }
1345
1346 #[stable(feature = "rust1", since = "1.0.0")]
1347 impl<'a, T> ExactSizeIterator for Chunks<'a, T> {}
1348
1349 /// An iterator over a slice in (non-overlapping) mutable chunks (`size`
1350 /// elements at a time). When the slice len is not evenly divided by the chunk
1351 /// size, the last slice of the iteration will be the remainder.
1352 #[stable(feature = "rust1", since = "1.0.0")]
1353 pub struct ChunksMut<'a, T:'a> {
1354     v: &'a mut [T],
1355     chunk_size: usize
1356 }
1357
1358 #[stable(feature = "rust1", since = "1.0.0")]
1359 impl<'a, T> Iterator for ChunksMut<'a, T> {
1360     type Item = &'a mut [T];
1361
1362     #[inline]
1363     fn next(&mut self) -> Option<&'a mut [T]> {
1364         if self.v.is_empty() {
1365             None
1366         } else {
1367             let sz = cmp::min(self.v.len(), self.chunk_size);
1368             let tmp = mem::replace(&mut self.v, &mut []);
1369             let (head, tail) = tmp.split_at_mut(sz);
1370             self.v = tail;
1371             Some(head)
1372         }
1373     }
1374
1375     #[inline]
1376     fn size_hint(&self) -> (usize, Option<usize>) {
1377         if self.v.is_empty() {
1378             (0, Some(0))
1379         } else {
1380             let n = self.v.len() / self.chunk_size;
1381             let rem = self.v.len() % self.chunk_size;
1382             let n = if rem > 0 { n + 1 } else { n };
1383             (n, Some(n))
1384         }
1385     }
1386
1387     #[inline]
1388     fn count(self) -> usize {
1389         self.size_hint().0
1390     }
1391
1392     #[inline]
1393     fn nth(&mut self, n: usize) -> Option<&'a mut [T]> {
1394         let (start, overflow) = n.overflowing_mul(self.chunk_size);
1395         if start >= self.v.len() || overflow {
1396             self.v = &mut [];
1397             None
1398         } else {
1399             let end = match start.checked_add(self.chunk_size) {
1400                 Some(sum) => cmp::min(self.v.len(), sum),
1401                 None => self.v.len(),
1402             };
1403             let tmp = mem::replace(&mut self.v, &mut []);
1404             let (head, tail) = tmp.split_at_mut(end);
1405             let (_, nth) =  head.split_at_mut(start);
1406             self.v = tail;
1407             Some(nth)
1408         }
1409     }
1410
1411     #[inline]
1412     fn last(self) -> Option<Self::Item> {
1413         if self.v.is_empty() {
1414             None
1415         } else {
1416             let start = (self.v.len() - 1) / self.chunk_size * self.chunk_size;
1417             Some(&mut self.v[start..])
1418         }
1419     }
1420 }
1421
1422 #[stable(feature = "rust1", since = "1.0.0")]
1423 impl<'a, T> DoubleEndedIterator for ChunksMut<'a, T> {
1424     #[inline]
1425     fn next_back(&mut self) -> Option<&'a mut [T]> {
1426         if self.v.is_empty() {
1427             None
1428         } else {
1429             let remainder = self.v.len() % self.chunk_size;
1430             let sz = if remainder != 0 { remainder } else { self.chunk_size };
1431             let tmp = mem::replace(&mut self.v, &mut []);
1432             let tmp_len = tmp.len();
1433             let (head, tail) = tmp.split_at_mut(tmp_len - sz);
1434             self.v = head;
1435             Some(tail)
1436         }
1437     }
1438 }
1439
1440 #[stable(feature = "rust1", since = "1.0.0")]
1441 impl<'a, T> ExactSizeIterator for ChunksMut<'a, T> {}
1442
1443 //
1444 // Free functions
1445 //
1446
1447 /// Forms a slice from a pointer and a length.
1448 ///
1449 /// The `len` argument is the number of **elements**, not the number of bytes.
1450 ///
1451 /// # Safety
1452 ///
1453 /// This function is unsafe as there is no guarantee that the given pointer is
1454 /// valid for `len` elements, nor whether the lifetime inferred is a suitable
1455 /// lifetime for the returned slice.
1456 ///
1457 /// `p` must be non-null, even for zero-length slices.
1458 ///
1459 /// # Caveat
1460 ///
1461 /// The lifetime for the returned slice is inferred from its usage. To
1462 /// prevent accidental misuse, it's suggested to tie the lifetime to whichever
1463 /// source lifetime is safe in the context, such as by providing a helper
1464 /// function taking the lifetime of a host value for the slice, or by explicit
1465 /// annotation.
1466 ///
1467 /// # Examples
1468 ///
1469 /// ```
1470 /// use std::slice;
1471 ///
1472 /// // manifest a slice out of thin air!
1473 /// let ptr = 0x1234 as *const usize;
1474 /// let amt = 10;
1475 /// unsafe {
1476 ///     let slice = slice::from_raw_parts(ptr, amt);
1477 /// }
1478 /// ```
1479 #[inline]
1480 #[stable(feature = "rust1", since = "1.0.0")]
1481 pub unsafe fn from_raw_parts<'a, T>(p: *const T, len: usize) -> &'a [T] {
1482     mem::transmute(RawSlice { data: p, len: len })
1483 }
1484
1485 /// Performs the same functionality as `from_raw_parts`, except that a mutable
1486 /// slice is returned.
1487 ///
1488 /// This function is unsafe for the same reasons as `from_raw_parts`, as well
1489 /// as not being able to provide a non-aliasing guarantee of the returned
1490 /// mutable slice.
1491 #[inline]
1492 #[stable(feature = "rust1", since = "1.0.0")]
1493 pub unsafe fn from_raw_parts_mut<'a, T>(p: *mut T, len: usize) -> &'a mut [T] {
1494     mem::transmute(RawSlice { data: p, len: len })
1495 }
1496
1497 //
1498 // Submodules
1499 //
1500
1501 /// Operations on `[u8]`.
1502 #[unstable(feature = "slice_bytes", reason = "needs review",
1503            issue = "27740")]
1504 #[rustc_deprecated(reason = "unidiomatic functions not pulling their weight",
1505                    since = "1.6.0")]
1506 #[allow(deprecated)]
1507 pub mod bytes {
1508     use ptr;
1509     use slice::SliceExt;
1510
1511     /// A trait for operations on mutable `[u8]`s.
1512     pub trait MutableByteVector {
1513         /// Sets all bytes of the receiver to the given value.
1514         fn set_memory(&mut self, value: u8);
1515     }
1516
1517     impl MutableByteVector for [u8] {
1518         #[inline]
1519         fn set_memory(&mut self, value: u8) {
1520             unsafe { ptr::write_bytes(self.as_mut_ptr(), value, self.len()) };
1521         }
1522     }
1523
1524     /// Copies data from `src` to `dst`
1525     ///
1526     /// Panics if the length of `dst` is less than the length of `src`.
1527     #[inline]
1528     pub fn copy_memory(src: &[u8], dst: &mut [u8]) {
1529         let len_src = src.len();
1530         assert!(dst.len() >= len_src);
1531         // `dst` is unaliasable, so we know statically it doesn't overlap
1532         // with `src`.
1533         unsafe {
1534             ptr::copy_nonoverlapping(src.as_ptr(),
1535                                      dst.as_mut_ptr(),
1536                                      len_src);
1537         }
1538     }
1539 }
1540
1541
1542
1543 //
1544 // Boilerplate traits
1545 //
1546
1547 #[stable(feature = "rust1", since = "1.0.0")]
1548 impl<A, B> PartialEq<[B]> for [A] where A: PartialEq<B> {
1549     fn eq(&self, other: &[B]) -> bool {
1550         if self.len() != other.len() {
1551             return false;
1552         }
1553
1554         for i in 0..self.len() {
1555             if !self[i].eq(&other[i]) {
1556                 return false;
1557             }
1558         }
1559
1560         true
1561     }
1562     fn ne(&self, other: &[B]) -> bool {
1563         if self.len() != other.len() {
1564             return true;
1565         }
1566
1567         for i in 0..self.len() {
1568             if self[i].ne(&other[i]) {
1569                 return true;
1570             }
1571         }
1572
1573         false
1574     }
1575 }
1576
1577 #[stable(feature = "rust1", since = "1.0.0")]
1578 impl<T: Eq> Eq for [T] {}
1579
1580 #[stable(feature = "rust1", since = "1.0.0")]
1581 impl<T: Ord> Ord for [T] {
1582     fn cmp(&self, other: &[T]) -> Ordering {
1583         let l = cmp::min(self.len(), other.len());
1584
1585         // Slice to the loop iteration range to enable bound check
1586         // elimination in the compiler
1587         let lhs = &self[..l];
1588         let rhs = &other[..l];
1589
1590         for i in 0..l {
1591             match lhs[i].cmp(&rhs[i]) {
1592                 Ordering::Equal => (),
1593                 non_eq => return non_eq,
1594             }
1595         }
1596
1597         self.len().cmp(&other.len())
1598     }
1599 }
1600
1601 #[stable(feature = "rust1", since = "1.0.0")]
1602 impl<T: PartialOrd> PartialOrd for [T] {
1603     fn partial_cmp(&self, other: &[T]) -> Option<Ordering> {
1604         let l = cmp::min(self.len(), other.len());
1605
1606         // Slice to the loop iteration range to enable bound check
1607         // elimination in the compiler
1608         let lhs = &self[..l];
1609         let rhs = &other[..l];
1610
1611         for i in 0..l {
1612             match lhs[i].partial_cmp(&rhs[i]) {
1613                 Some(Ordering::Equal) => (),
1614                 non_eq => return non_eq,
1615             }
1616         }
1617
1618         self.len().partial_cmp(&other.len())
1619     }
1620 }