]> git.lizzy.rs Git - rust.git/blob - src/libcore/slice.rs
Auto merge of #31606 - Ms2ger:ClosureKind, r=eddyb
[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 trait SplitIter: DoubleEndedIterator {
912     /// Mark the underlying iterator as complete, extracting the remaining
913     /// portion of the slice.
914     fn finish(&mut self) -> Option<Self::Item>;
915 }
916
917 /// An iterator over subslices separated by elements that match a predicate
918 /// function.
919 #[stable(feature = "rust1", since = "1.0.0")]
920 pub struct Split<'a, T:'a, P> where P: FnMut(&T) -> bool {
921     v: &'a [T],
922     pred: P,
923     finished: bool
924 }
925
926 // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
927 #[stable(feature = "rust1", since = "1.0.0")]
928 impl<'a, T, P> Clone for Split<'a, T, P> where P: Clone + FnMut(&T) -> bool {
929     fn clone(&self) -> Split<'a, T, P> {
930         Split {
931             v: self.v,
932             pred: self.pred.clone(),
933             finished: self.finished,
934         }
935     }
936 }
937
938 #[stable(feature = "rust1", since = "1.0.0")]
939 impl<'a, T, P> Iterator for Split<'a, T, P> where P: FnMut(&T) -> bool {
940     type Item = &'a [T];
941
942     #[inline]
943     fn next(&mut self) -> Option<&'a [T]> {
944         if self.finished { return None; }
945
946         match self.v.iter().position(|x| (self.pred)(x)) {
947             None => self.finish(),
948             Some(idx) => {
949                 let ret = Some(&self.v[..idx]);
950                 self.v = &self.v[idx + 1..];
951                 ret
952             }
953         }
954     }
955
956     #[inline]
957     fn size_hint(&self) -> (usize, Option<usize>) {
958         if self.finished {
959             (0, Some(0))
960         } else {
961             (1, Some(self.v.len() + 1))
962         }
963     }
964 }
965
966 #[stable(feature = "rust1", since = "1.0.0")]
967 impl<'a, T, P> DoubleEndedIterator for Split<'a, T, P> where P: FnMut(&T) -> bool {
968     #[inline]
969     fn next_back(&mut self) -> Option<&'a [T]> {
970         if self.finished { return None; }
971
972         match self.v.iter().rposition(|x| (self.pred)(x)) {
973             None => self.finish(),
974             Some(idx) => {
975                 let ret = Some(&self.v[idx + 1..]);
976                 self.v = &self.v[..idx];
977                 ret
978             }
979         }
980     }
981 }
982
983 impl<'a, T, P> SplitIter for Split<'a, T, P> where P: FnMut(&T) -> bool {
984     #[inline]
985     fn finish(&mut self) -> Option<&'a [T]> {
986         if self.finished { None } else { self.finished = true; Some(self.v) }
987     }
988 }
989
990 /// An iterator over the subslices of the vector which are separated
991 /// by elements that match `pred`.
992 #[stable(feature = "rust1", since = "1.0.0")]
993 pub struct SplitMut<'a, T:'a, P> where P: FnMut(&T) -> bool {
994     v: &'a mut [T],
995     pred: P,
996     finished: bool
997 }
998
999 impl<'a, T, P> SplitIter for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
1000     #[inline]
1001     fn finish(&mut self) -> Option<&'a mut [T]> {
1002         if self.finished {
1003             None
1004         } else {
1005             self.finished = true;
1006             Some(mem::replace(&mut self.v, &mut []))
1007         }
1008     }
1009 }
1010
1011 #[stable(feature = "rust1", since = "1.0.0")]
1012 impl<'a, T, P> Iterator for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
1013     type Item = &'a mut [T];
1014
1015     #[inline]
1016     fn next(&mut self) -> Option<&'a mut [T]> {
1017         if self.finished { return None; }
1018
1019         let idx_opt = { // work around borrowck limitations
1020             let pred = &mut self.pred;
1021             self.v.iter().position(|x| (*pred)(x))
1022         };
1023         match idx_opt {
1024             None => self.finish(),
1025             Some(idx) => {
1026                 let tmp = mem::replace(&mut self.v, &mut []);
1027                 let (head, tail) = tmp.split_at_mut(idx);
1028                 self.v = &mut tail[1..];
1029                 Some(head)
1030             }
1031         }
1032     }
1033
1034     #[inline]
1035     fn size_hint(&self) -> (usize, Option<usize>) {
1036         if self.finished {
1037             (0, Some(0))
1038         } else {
1039             // if the predicate doesn't match anything, we yield one slice
1040             // if it matches every element, we yield len+1 empty slices.
1041             (1, Some(self.v.len() + 1))
1042         }
1043     }
1044 }
1045
1046 #[stable(feature = "rust1", since = "1.0.0")]
1047 impl<'a, T, P> DoubleEndedIterator for SplitMut<'a, T, P> where
1048     P: FnMut(&T) -> bool,
1049 {
1050     #[inline]
1051     fn next_back(&mut self) -> Option<&'a mut [T]> {
1052         if self.finished { return None; }
1053
1054         let idx_opt = { // work around borrowck limitations
1055             let pred = &mut self.pred;
1056             self.v.iter().rposition(|x| (*pred)(x))
1057         };
1058         match idx_opt {
1059             None => self.finish(),
1060             Some(idx) => {
1061                 let tmp = mem::replace(&mut self.v, &mut []);
1062                 let (head, tail) = tmp.split_at_mut(idx);
1063                 self.v = head;
1064                 Some(&mut tail[1..])
1065             }
1066         }
1067     }
1068 }
1069
1070 /// An private iterator over subslices separated by elements that
1071 /// match a predicate function, splitting at most a fixed number of
1072 /// times.
1073 struct GenericSplitN<I> {
1074     iter: I,
1075     count: usize,
1076     invert: bool
1077 }
1078
1079 impl<T, I: SplitIter<Item=T>> Iterator for GenericSplitN<I> {
1080     type Item = T;
1081
1082     #[inline]
1083     fn next(&mut self) -> Option<T> {
1084         match self.count {
1085             0 => None,
1086             1 => { self.count -= 1; self.iter.finish() }
1087             _ => {
1088                 self.count -= 1;
1089                 if self.invert {self.iter.next_back()} else {self.iter.next()}
1090             }
1091         }
1092     }
1093
1094     #[inline]
1095     fn size_hint(&self) -> (usize, Option<usize>) {
1096         let (lower, upper_opt) = self.iter.size_hint();
1097         (lower, upper_opt.map(|upper| cmp::min(self.count, upper)))
1098     }
1099 }
1100
1101 /// An iterator over subslices separated by elements that match a predicate
1102 /// function, limited to a given number of splits.
1103 #[stable(feature = "rust1", since = "1.0.0")]
1104 pub struct SplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
1105     inner: GenericSplitN<Split<'a, T, P>>
1106 }
1107
1108 /// An iterator over subslices separated by elements that match a
1109 /// predicate function, limited to a given number of splits, starting
1110 /// from the end of the slice.
1111 #[stable(feature = "rust1", since = "1.0.0")]
1112 pub struct RSplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
1113     inner: GenericSplitN<Split<'a, T, P>>
1114 }
1115
1116 /// An iterator over subslices separated by elements that match a predicate
1117 /// function, limited to a given number of splits.
1118 #[stable(feature = "rust1", since = "1.0.0")]
1119 pub struct SplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
1120     inner: GenericSplitN<SplitMut<'a, T, P>>
1121 }
1122
1123 /// An iterator over subslices separated by elements that match a
1124 /// predicate function, limited to a given number of splits, starting
1125 /// from the end of the slice.
1126 #[stable(feature = "rust1", since = "1.0.0")]
1127 pub struct RSplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
1128     inner: GenericSplitN<SplitMut<'a, T, P>>
1129 }
1130
1131 macro_rules! forward_iterator {
1132     ($name:ident: $elem:ident, $iter_of:ty) => {
1133         #[stable(feature = "rust1", since = "1.0.0")]
1134         impl<'a, $elem, P> Iterator for $name<'a, $elem, P> where
1135             P: FnMut(&T) -> bool
1136         {
1137             type Item = $iter_of;
1138
1139             #[inline]
1140             fn next(&mut self) -> Option<$iter_of> {
1141                 self.inner.next()
1142             }
1143
1144             #[inline]
1145             fn size_hint(&self) -> (usize, Option<usize>) {
1146                 self.inner.size_hint()
1147             }
1148         }
1149     }
1150 }
1151
1152 forward_iterator! { SplitN: T, &'a [T] }
1153 forward_iterator! { RSplitN: T, &'a [T] }
1154 forward_iterator! { SplitNMut: T, &'a mut [T] }
1155 forward_iterator! { RSplitNMut: T, &'a mut [T] }
1156
1157 /// An iterator over overlapping subslices of length `size`.
1158 #[stable(feature = "rust1", since = "1.0.0")]
1159 pub struct Windows<'a, T:'a> {
1160     v: &'a [T],
1161     size: usize
1162 }
1163
1164 // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
1165 #[stable(feature = "rust1", since = "1.0.0")]
1166 impl<'a, T> Clone for Windows<'a, T> {
1167     fn clone(&self) -> Windows<'a, T> {
1168         Windows {
1169             v: self.v,
1170             size: self.size,
1171         }
1172     }
1173 }
1174
1175 #[stable(feature = "rust1", since = "1.0.0")]
1176 impl<'a, T> Iterator for Windows<'a, T> {
1177     type Item = &'a [T];
1178
1179     #[inline]
1180     fn next(&mut self) -> Option<&'a [T]> {
1181         if self.size > self.v.len() {
1182             None
1183         } else {
1184             let ret = Some(&self.v[..self.size]);
1185             self.v = &self.v[1..];
1186             ret
1187         }
1188     }
1189
1190     #[inline]
1191     fn size_hint(&self) -> (usize, Option<usize>) {
1192         if self.size > self.v.len() {
1193             (0, Some(0))
1194         } else {
1195             let size = self.v.len() - self.size + 1;
1196             (size, Some(size))
1197         }
1198     }
1199
1200     #[inline]
1201     fn count(self) -> usize {
1202         self.size_hint().0
1203     }
1204
1205     #[inline]
1206     fn nth(&mut self, n: usize) -> Option<Self::Item> {
1207         let (end, overflow) = self.size.overflowing_add(n);
1208         if end > self.v.len() || overflow {
1209             self.v = &[];
1210             None
1211         } else {
1212             let nth = &self.v[n..end];
1213             self.v = &self.v[n+1..];
1214             Some(nth)
1215         }
1216     }
1217
1218     #[inline]
1219     fn last(self) -> Option<Self::Item> {
1220         if self.size > self.v.len() {
1221             None
1222         } else {
1223             let start = self.v.len() - self.size;
1224             Some(&self.v[start..])
1225         }
1226     }
1227 }
1228
1229 #[stable(feature = "rust1", since = "1.0.0")]
1230 impl<'a, T> DoubleEndedIterator for Windows<'a, T> {
1231     #[inline]
1232     fn next_back(&mut self) -> Option<&'a [T]> {
1233         if self.size > self.v.len() {
1234             None
1235         } else {
1236             let ret = Some(&self.v[self.v.len()-self.size..]);
1237             self.v = &self.v[..self.v.len()-1];
1238             ret
1239         }
1240     }
1241 }
1242
1243 #[stable(feature = "rust1", since = "1.0.0")]
1244 impl<'a, T> ExactSizeIterator for Windows<'a, T> {}
1245
1246 /// An iterator over a slice in (non-overlapping) chunks (`size` elements at a
1247 /// time).
1248 ///
1249 /// When the slice len is not evenly divided by the chunk size, the last slice
1250 /// of the iteration will be the remainder.
1251 #[stable(feature = "rust1", since = "1.0.0")]
1252 pub struct Chunks<'a, T:'a> {
1253     v: &'a [T],
1254     size: usize
1255 }
1256
1257 // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
1258 #[stable(feature = "rust1", since = "1.0.0")]
1259 impl<'a, T> Clone for Chunks<'a, T> {
1260     fn clone(&self) -> Chunks<'a, T> {
1261         Chunks {
1262             v: self.v,
1263             size: self.size,
1264         }
1265     }
1266 }
1267
1268 #[stable(feature = "rust1", since = "1.0.0")]
1269 impl<'a, T> Iterator for Chunks<'a, T> {
1270     type Item = &'a [T];
1271
1272     #[inline]
1273     fn next(&mut self) -> Option<&'a [T]> {
1274         if self.v.is_empty() {
1275             None
1276         } else {
1277             let chunksz = cmp::min(self.v.len(), self.size);
1278             let (fst, snd) = self.v.split_at(chunksz);
1279             self.v = snd;
1280             Some(fst)
1281         }
1282     }
1283
1284     #[inline]
1285     fn size_hint(&self) -> (usize, Option<usize>) {
1286         if self.v.is_empty() {
1287             (0, Some(0))
1288         } else {
1289             let n = self.v.len() / self.size;
1290             let rem = self.v.len() % self.size;
1291             let n = if rem > 0 { n+1 } else { n };
1292             (n, Some(n))
1293         }
1294     }
1295
1296     #[inline]
1297     fn count(self) -> usize {
1298         self.size_hint().0
1299     }
1300
1301     #[inline]
1302     fn nth(&mut self, n: usize) -> Option<Self::Item> {
1303         let (start, overflow) = n.overflowing_mul(self.size);
1304         if start >= self.v.len() || overflow {
1305             self.v = &[];
1306             None
1307         } else {
1308             let end = match start.checked_add(self.size) {
1309                 Some(sum) => cmp::min(self.v.len(), sum),
1310                 None => self.v.len(),
1311             };
1312             let nth = &self.v[start..end];
1313             self.v = &self.v[end..];
1314             Some(nth)
1315         }
1316     }
1317
1318     #[inline]
1319     fn last(self) -> Option<Self::Item> {
1320         if self.v.is_empty() {
1321             None
1322         } else {
1323             let start = (self.v.len() - 1) / self.size * self.size;
1324             Some(&self.v[start..])
1325         }
1326     }
1327 }
1328
1329 #[stable(feature = "rust1", since = "1.0.0")]
1330 impl<'a, T> DoubleEndedIterator for Chunks<'a, T> {
1331     #[inline]
1332     fn next_back(&mut self) -> Option<&'a [T]> {
1333         if self.v.is_empty() {
1334             None
1335         } else {
1336             let remainder = self.v.len() % self.size;
1337             let chunksz = if remainder != 0 { remainder } else { self.size };
1338             let (fst, snd) = self.v.split_at(self.v.len() - chunksz);
1339             self.v = fst;
1340             Some(snd)
1341         }
1342     }
1343 }
1344
1345 #[stable(feature = "rust1", since = "1.0.0")]
1346 impl<'a, T> ExactSizeIterator for Chunks<'a, T> {}
1347
1348 /// An iterator over a slice in (non-overlapping) mutable chunks (`size`
1349 /// elements at a time). When the slice len is not evenly divided by the chunk
1350 /// size, the last slice of the iteration will be the remainder.
1351 #[stable(feature = "rust1", since = "1.0.0")]
1352 pub struct ChunksMut<'a, T:'a> {
1353     v: &'a mut [T],
1354     chunk_size: usize
1355 }
1356
1357 #[stable(feature = "rust1", since = "1.0.0")]
1358 impl<'a, T> Iterator for ChunksMut<'a, T> {
1359     type Item = &'a mut [T];
1360
1361     #[inline]
1362     fn next(&mut self) -> Option<&'a mut [T]> {
1363         if self.v.is_empty() {
1364             None
1365         } else {
1366             let sz = cmp::min(self.v.len(), self.chunk_size);
1367             let tmp = mem::replace(&mut self.v, &mut []);
1368             let (head, tail) = tmp.split_at_mut(sz);
1369             self.v = tail;
1370             Some(head)
1371         }
1372     }
1373
1374     #[inline]
1375     fn size_hint(&self) -> (usize, Option<usize>) {
1376         if self.v.is_empty() {
1377             (0, Some(0))
1378         } else {
1379             let n = self.v.len() / self.chunk_size;
1380             let rem = self.v.len() % self.chunk_size;
1381             let n = if rem > 0 { n + 1 } else { n };
1382             (n, Some(n))
1383         }
1384     }
1385
1386     #[inline]
1387     fn count(self) -> usize {
1388         self.size_hint().0
1389     }
1390
1391     #[inline]
1392     fn nth(&mut self, n: usize) -> Option<&'a mut [T]> {
1393         let (start, overflow) = n.overflowing_mul(self.chunk_size);
1394         if start >= self.v.len() || overflow {
1395             self.v = &mut [];
1396             None
1397         } else {
1398             let end = match start.checked_add(self.chunk_size) {
1399                 Some(sum) => cmp::min(self.v.len(), sum),
1400                 None => self.v.len(),
1401             };
1402             let tmp = mem::replace(&mut self.v, &mut []);
1403             let (head, tail) = tmp.split_at_mut(end);
1404             let (_, nth) =  head.split_at_mut(start);
1405             self.v = tail;
1406             Some(nth)
1407         }
1408     }
1409
1410     #[inline]
1411     fn last(self) -> Option<Self::Item> {
1412         if self.v.is_empty() {
1413             None
1414         } else {
1415             let start = (self.v.len() - 1) / self.chunk_size * self.chunk_size;
1416             Some(&mut self.v[start..])
1417         }
1418     }
1419 }
1420
1421 #[stable(feature = "rust1", since = "1.0.0")]
1422 impl<'a, T> DoubleEndedIterator for ChunksMut<'a, T> {
1423     #[inline]
1424     fn next_back(&mut self) -> Option<&'a mut [T]> {
1425         if self.v.is_empty() {
1426             None
1427         } else {
1428             let remainder = self.v.len() % self.chunk_size;
1429             let sz = if remainder != 0 { remainder } else { self.chunk_size };
1430             let tmp = mem::replace(&mut self.v, &mut []);
1431             let tmp_len = tmp.len();
1432             let (head, tail) = tmp.split_at_mut(tmp_len - sz);
1433             self.v = head;
1434             Some(tail)
1435         }
1436     }
1437 }
1438
1439 #[stable(feature = "rust1", since = "1.0.0")]
1440 impl<'a, T> ExactSizeIterator for ChunksMut<'a, T> {}
1441
1442 //
1443 // Free functions
1444 //
1445
1446 /// Forms a slice from a pointer and a length.
1447 ///
1448 /// The `len` argument is the number of **elements**, not the number of bytes.
1449 ///
1450 /// # Safety
1451 ///
1452 /// This function is unsafe as there is no guarantee that the given pointer is
1453 /// valid for `len` elements, nor whether the lifetime inferred is a suitable
1454 /// lifetime for the returned slice.
1455 ///
1456 /// `p` must be non-null, even for zero-length slices.
1457 ///
1458 /// # Caveat
1459 ///
1460 /// The lifetime for the returned slice is inferred from its usage. To
1461 /// prevent accidental misuse, it's suggested to tie the lifetime to whichever
1462 /// source lifetime is safe in the context, such as by providing a helper
1463 /// function taking the lifetime of a host value for the slice, or by explicit
1464 /// annotation.
1465 ///
1466 /// # Examples
1467 ///
1468 /// ```
1469 /// use std::slice;
1470 ///
1471 /// // manifest a slice out of thin air!
1472 /// let ptr = 0x1234 as *const usize;
1473 /// let amt = 10;
1474 /// unsafe {
1475 ///     let slice = slice::from_raw_parts(ptr, amt);
1476 /// }
1477 /// ```
1478 #[inline]
1479 #[stable(feature = "rust1", since = "1.0.0")]
1480 pub unsafe fn from_raw_parts<'a, T>(p: *const T, len: usize) -> &'a [T] {
1481     mem::transmute(RawSlice { data: p, len: len })
1482 }
1483
1484 /// Performs the same functionality as `from_raw_parts`, except that a mutable
1485 /// slice is returned.
1486 ///
1487 /// This function is unsafe for the same reasons as `from_raw_parts`, as well
1488 /// as not being able to provide a non-aliasing guarantee of the returned
1489 /// mutable slice.
1490 #[inline]
1491 #[stable(feature = "rust1", since = "1.0.0")]
1492 pub unsafe fn from_raw_parts_mut<'a, T>(p: *mut T, len: usize) -> &'a mut [T] {
1493     mem::transmute(RawSlice { data: p, len: len })
1494 }
1495
1496 //
1497 // Submodules
1498 //
1499
1500 /// Operations on `[u8]`.
1501 #[unstable(feature = "slice_bytes", reason = "needs review",
1502            issue = "27740")]
1503 #[rustc_deprecated(reason = "unidiomatic functions not pulling their weight",
1504                    since = "1.6.0")]
1505 #[allow(deprecated)]
1506 pub mod bytes {
1507     use ptr;
1508     use slice::SliceExt;
1509
1510     /// A trait for operations on mutable `[u8]`s.
1511     pub trait MutableByteVector {
1512         /// Sets all bytes of the receiver to the given value.
1513         fn set_memory(&mut self, value: u8);
1514     }
1515
1516     impl MutableByteVector for [u8] {
1517         #[inline]
1518         fn set_memory(&mut self, value: u8) {
1519             unsafe { ptr::write_bytes(self.as_mut_ptr(), value, self.len()) };
1520         }
1521     }
1522
1523     /// Copies data from `src` to `dst`
1524     ///
1525     /// Panics if the length of `dst` is less than the length of `src`.
1526     #[inline]
1527     pub fn copy_memory(src: &[u8], dst: &mut [u8]) {
1528         let len_src = src.len();
1529         assert!(dst.len() >= len_src);
1530         // `dst` is unaliasable, so we know statically it doesn't overlap
1531         // with `src`.
1532         unsafe {
1533             ptr::copy_nonoverlapping(src.as_ptr(),
1534                                      dst.as_mut_ptr(),
1535                                      len_src);
1536         }
1537     }
1538 }
1539
1540
1541
1542 //
1543 // Boilerplate traits
1544 //
1545
1546 #[stable(feature = "rust1", since = "1.0.0")]
1547 impl<A, B> PartialEq<[B]> for [A] where A: PartialEq<B> {
1548     fn eq(&self, other: &[B]) -> bool {
1549         if self.len() != other.len() {
1550             return false;
1551         }
1552
1553         for i in 0..self.len() {
1554             if !self[i].eq(&other[i]) {
1555                 return false;
1556             }
1557         }
1558
1559         true
1560     }
1561     fn ne(&self, other: &[B]) -> bool {
1562         if self.len() != other.len() {
1563             return true;
1564         }
1565
1566         for i in 0..self.len() {
1567             if self[i].ne(&other[i]) {
1568                 return true;
1569             }
1570         }
1571
1572         false
1573     }
1574 }
1575
1576 #[stable(feature = "rust1", since = "1.0.0")]
1577 impl<T: Eq> Eq for [T] {}
1578
1579 #[stable(feature = "rust1", since = "1.0.0")]
1580 impl<T: Ord> Ord for [T] {
1581     fn cmp(&self, other: &[T]) -> Ordering {
1582         let l = cmp::min(self.len(), other.len());
1583
1584         // Slice to the loop iteration range to enable bound check
1585         // elimination in the compiler
1586         let lhs = &self[..l];
1587         let rhs = &other[..l];
1588
1589         for i in 0..l {
1590             match lhs[i].cmp(&rhs[i]) {
1591                 Ordering::Equal => (),
1592                 non_eq => return non_eq,
1593             }
1594         }
1595
1596         self.len().cmp(&other.len())
1597     }
1598 }
1599
1600 #[stable(feature = "rust1", since = "1.0.0")]
1601 impl<T: PartialOrd> PartialOrd for [T] {
1602     fn partial_cmp(&self, other: &[T]) -> Option<Ordering> {
1603         let l = cmp::min(self.len(), other.len());
1604
1605         // Slice to the loop iteration range to enable bound check
1606         // elimination in the compiler
1607         let lhs = &self[..l];
1608         let rhs = &other[..l];
1609
1610         for i in 0..l {
1611             match lhs[i].partial_cmp(&rhs[i]) {
1612                 Some(Ordering::Equal) => (),
1613                 non_eq => return non_eq,
1614             }
1615         }
1616
1617         self.len().partial_cmp(&other.len())
1618     }
1619 }