]> git.lizzy.rs Git - rust.git/blob - src/libcollections/vec.rs
librustc: Don't try to perform the magical
[rust.git] / src / libcollections / vec.rs
1 // Copyright 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 //! An owned, growable vector.
12
13 use core::prelude::*;
14
15 use alloc::heap::{allocate, reallocate, deallocate};
16 use core::raw::Slice;
17 use core::cmp::max;
18 use core::default::Default;
19 use core::fmt;
20 use core::mem;
21 use core::num::{CheckedMul, CheckedAdd};
22 use core::num;
23 use core::ptr;
24 use core::uint;
25
26 use {Collection, Mutable};
27 use slice::{MutableOrdVector, MutableVectorAllocating, CloneableVector};
28 use slice::{Items, MutItems};
29
30 /// An owned, growable vector.
31 ///
32 /// # Examples
33 ///
34 /// ```rust
35 /// # use std::vec::Vec;
36 /// let mut vec = Vec::new();
37 /// vec.push(1i);
38 /// vec.push(2i);
39 ///
40 /// assert_eq!(vec.len(), 2);
41 /// assert_eq!(vec.get(0), &1);
42 ///
43 /// assert_eq!(vec.pop(), Some(2));
44 /// assert_eq!(vec.len(), 1);
45 /// ```
46 ///
47 /// The `vec!` macro is provided to make initialization more convenient:
48 ///
49 /// ```rust
50 /// let mut vec = vec!(1i, 2i, 3i);
51 /// vec.push(4);
52 /// assert_eq!(vec, vec!(1, 2, 3, 4));
53 /// ```
54 #[unsafe_no_drop_flag]
55 pub struct Vec<T> {
56     len: uint,
57     cap: uint,
58     ptr: *mut T
59 }
60
61 impl<T> Vec<T> {
62     /// Constructs a new, empty `Vec`.
63     ///
64     /// The vector will not allocate until elements are pushed onto it.
65     ///
66     /// # Example
67     ///
68     /// ```rust
69     /// # use std::vec::Vec;
70     /// let mut vec: Vec<int> = Vec::new();
71     /// ```
72     #[inline]
73     pub fn new() -> Vec<T> {
74         Vec { len: 0, cap: 0, ptr: 0 as *mut T }
75     }
76
77     /// Constructs a new, empty `Vec` with the specified capacity.
78     ///
79     /// The vector will be able to hold exactly `capacity` elements without
80     /// reallocating. If `capacity` is 0, the vector will not allocate.
81     ///
82     /// # Example
83     ///
84     /// ```rust
85     /// # use std::vec::Vec;
86     /// let vec: Vec<int> = Vec::with_capacity(10);
87     /// ```
88     #[inline]
89     pub fn with_capacity(capacity: uint) -> Vec<T> {
90         if mem::size_of::<T>() == 0 {
91             Vec { len: 0, cap: uint::MAX, ptr: 0 as *mut T }
92         } else if capacity == 0 {
93             Vec::new()
94         } else {
95             let size = capacity.checked_mul(&mem::size_of::<T>())
96                                .expect("capacity overflow");
97             let ptr = unsafe { allocate(size, mem::min_align_of::<T>()) };
98             Vec { len: 0, cap: capacity, ptr: ptr as *mut T }
99         }
100     }
101
102     /// Creates and initializes a `Vec`.
103     ///
104     /// Creates a `Vec` of size `length` and initializes the elements to the
105     /// value returned by the closure `op`.
106     ///
107     /// # Example
108     ///
109     /// ```rust
110     /// # use std::vec::Vec;
111     /// let vec = Vec::from_fn(3, |idx| idx * 2);
112     /// assert_eq!(vec, vec!(0, 2, 4));
113     /// ```
114     #[inline]
115     pub fn from_fn(length: uint, op: |uint| -> T) -> Vec<T> {
116         unsafe {
117             let mut xs = Vec::with_capacity(length);
118             while xs.len < length {
119                 let len = xs.len;
120                 ptr::write(xs.as_mut_slice().unsafe_mut_ref(len), op(len));
121                 xs.len += 1;
122             }
123             xs
124         }
125     }
126
127     /// Create a `Vec<T>` directly from the raw constituents.
128     ///
129     /// This is highly unsafe:
130     ///
131     /// - if `ptr` is null, then `length` and `capacity` should be 0
132     /// - `ptr` must point to an allocation of size `capacity`
133     /// - there must be `length` valid instances of type `T` at the
134     ///   beginning of that allocation
135     /// - `ptr` must be allocated by the default `Vec` allocator
136     pub unsafe fn from_raw_parts(length: uint, capacity: uint,
137                                  ptr: *mut T) -> Vec<T> {
138         Vec { len: length, cap: capacity, ptr: ptr }
139     }
140
141     /// Consumes the `Vec`, partitioning it based on a predicate.
142     ///
143     /// Partitions the `Vec` into two `Vec`s `(A,B)`, where all elements of `A`
144     /// satisfy `f` and all elements of `B` do not. The order of elements is
145     /// preserved.
146     ///
147     /// # Example
148     ///
149     /// ```rust
150     /// let vec = vec!(1i, 2i, 3i, 4i);
151     /// let (even, odd) = vec.partition(|&n| n % 2 == 0);
152     /// assert_eq!(even, vec!(2, 4));
153     /// assert_eq!(odd, vec!(1, 3));
154     /// ```
155     #[inline]
156     pub fn partition(self, f: |&T| -> bool) -> (Vec<T>, Vec<T>) {
157         let mut lefts  = Vec::new();
158         let mut rights = Vec::new();
159
160         for elt in self.move_iter() {
161             if f(&elt) {
162                 lefts.push(elt);
163             } else {
164                 rights.push(elt);
165             }
166         }
167
168         (lefts, rights)
169     }
170 }
171
172 impl<T: Clone> Vec<T> {
173     /// Iterates over the `second` vector, copying each element and appending it to
174     /// the `first`. Afterwards, the `first` is then returned for use again.
175     ///
176     /// # Example
177     ///
178     /// ```rust
179     /// let vec = vec!(1i, 2i);
180     /// let vec = vec.append([3i, 4i]);
181     /// assert_eq!(vec, vec!(1, 2, 3, 4));
182     /// ```
183     #[inline]
184     pub fn append(mut self, second: &[T]) -> Vec<T> {
185         self.push_all(second);
186         self
187     }
188
189     /// Constructs a `Vec` by cloning elements of a slice.
190     ///
191     /// # Example
192     ///
193     /// ```rust
194     /// # use std::vec::Vec;
195     /// let slice = [1i, 2, 3];
196     /// let vec = Vec::from_slice(slice);
197     /// ```
198     #[inline]
199     pub fn from_slice(values: &[T]) -> Vec<T> {
200         values.iter().map(|x| x.clone()).collect()
201     }
202
203     /// Constructs a `Vec` with copies of a value.
204     ///
205     /// Creates a `Vec` with `length` copies of `value`.
206     ///
207     /// # Example
208     /// ```rust
209     /// # use std::vec::Vec;
210     /// let vec = Vec::from_elem(3, "hi");
211     /// println!("{}", vec); // prints [hi, hi, hi]
212     /// ```
213     #[inline]
214     pub fn from_elem(length: uint, value: T) -> Vec<T> {
215         unsafe {
216             let mut xs = Vec::with_capacity(length);
217             while xs.len < length {
218                 let len = xs.len;
219                 ptr::write(xs.as_mut_slice().unsafe_mut_ref(len),
220                            value.clone());
221                 xs.len += 1;
222             }
223             xs
224         }
225     }
226
227     /// Appends all elements in a slice to the `Vec`.
228     ///
229     /// Iterates over the slice `other`, clones each element, and then appends
230     /// it to this `Vec`. The `other` vector is traversed in-order.
231     ///
232     /// # Example
233     ///
234     /// ```rust
235     /// let mut vec = vec!(1i);
236     /// vec.push_all([2i, 3, 4]);
237     /// assert_eq!(vec, vec!(1, 2, 3, 4));
238     /// ```
239     #[inline]
240     pub fn push_all(&mut self, other: &[T]) {
241         self.extend(other.iter().map(|e| e.clone()));
242     }
243
244     /// Grows the `Vec` in-place.
245     ///
246     /// Adds `n` copies of `value` to the `Vec`.
247     ///
248     /// # Example
249     ///
250     /// ```rust
251     /// let mut vec = vec!("hello");
252     /// vec.grow(2, &("world"));
253     /// assert_eq!(vec, vec!("hello", "world", "world"));
254     /// ```
255     pub fn grow(&mut self, n: uint, value: &T) {
256         let new_len = self.len() + n;
257         self.reserve(new_len);
258         let mut i: uint = 0u;
259
260         while i < n {
261             self.push((*value).clone());
262             i += 1u;
263         }
264     }
265
266     /// Sets the value of a vector element at a given index, growing the vector
267     /// as needed.
268     ///
269     /// Sets the element at position `index` to `value`. If `index` is past the
270     /// end of the vector, expands the vector by replicating `initval` to fill
271     /// the intervening space.
272     ///
273     /// # Example
274     ///
275     /// ```rust
276     /// let mut vec = vec!("a", "b", "c");
277     /// vec.grow_set(1, &("fill"), "d");
278     /// vec.grow_set(4, &("fill"), "e");
279     /// assert_eq!(vec, vec!("a", "d", "c", "fill", "e"));
280     /// ```
281     pub fn grow_set(&mut self, index: uint, initval: &T, value: T) {
282         let l = self.len();
283         if index >= l {
284             self.grow(index - l + 1u, initval);
285         }
286         *self.get_mut(index) = value;
287     }
288
289     /// Partitions a vector based on a predicate.
290     ///
291     /// Clones the elements of the vector, partitioning them into two `Vec`s
292     /// `(A,B)`, where all elements of `A` satisfy `f` and all elements of `B`
293     /// do not. The order of elements is preserved.
294     ///
295     /// # Example
296     ///
297     /// ```rust
298     /// let vec = vec!(1i, 2, 3, 4);
299     /// let (even, odd) = vec.partitioned(|&n| n % 2 == 0);
300     /// assert_eq!(even, vec!(2i, 4));
301     /// assert_eq!(odd, vec!(1i, 3));
302     /// ```
303     pub fn partitioned(&self, f: |&T| -> bool) -> (Vec<T>, Vec<T>) {
304         let mut lefts = Vec::new();
305         let mut rights = Vec::new();
306
307         for elt in self.iter() {
308             if f(elt) {
309                 lefts.push(elt.clone());
310             } else {
311                 rights.push(elt.clone());
312             }
313         }
314
315         (lefts, rights)
316     }
317 }
318
319 #[unstable]
320 impl<T:Clone> Clone for Vec<T> {
321     fn clone(&self) -> Vec<T> {
322         let len = self.len;
323         let mut vector = Vec::with_capacity(len);
324         // Unsafe code so this can be optimised to a memcpy (or something
325         // similarly fast) when T is Copy. LLVM is easily confused, so any
326         // extra operations during the loop can prevent this optimisation
327         {
328             let this_slice = self.as_slice();
329             while vector.len < len {
330                 unsafe {
331                     let len = vector.len;
332                     ptr::write(
333                         vector.as_mut_slice().unsafe_mut_ref(len),
334                         this_slice.unsafe_ref(len).clone());
335                 }
336                 vector.len += 1;
337             }
338         }
339         vector
340     }
341
342     fn clone_from(&mut self, other: &Vec<T>) {
343         // drop anything in self that will not be overwritten
344         if self.len() > other.len() {
345             self.truncate(other.len())
346         }
347
348         // reuse the contained values' allocations/resources.
349         for (place, thing) in self.mut_iter().zip(other.iter()) {
350             place.clone_from(thing)
351         }
352
353         // self.len <= other.len due to the truncate above, so the
354         // slice here is always in-bounds.
355         let len = self.len();
356         self.extend(other.slice_from(len).iter().map(|x| x.clone()));
357     }
358 }
359
360 impl<T> FromIterator<T> for Vec<T> {
361     #[inline]
362     fn from_iter<I:Iterator<T>>(mut iterator: I) -> Vec<T> {
363         let (lower, _) = iterator.size_hint();
364         let mut vector = Vec::with_capacity(lower);
365         for element in iterator {
366             vector.push(element)
367         }
368         vector
369     }
370 }
371
372 impl<T> Extendable<T> for Vec<T> {
373     #[inline]
374     fn extend<I: Iterator<T>>(&mut self, mut iterator: I) {
375         let (lower, _) = iterator.size_hint();
376         self.reserve_additional(lower);
377         for element in iterator {
378             self.push(element)
379         }
380     }
381 }
382
383 impl<T: PartialEq> PartialEq for Vec<T> {
384     #[inline]
385     fn eq(&self, other: &Vec<T>) -> bool {
386         self.as_slice() == other.as_slice()
387     }
388 }
389
390 impl<T: PartialOrd> PartialOrd for Vec<T> {
391     #[inline]
392     fn lt(&self, other: &Vec<T>) -> bool {
393         self.as_slice() < other.as_slice()
394     }
395 }
396
397 impl<T: Eq> Eq for Vec<T> {}
398
399 impl<T: PartialEq, V: Vector<T>> Equiv<V> for Vec<T> {
400     #[inline]
401     fn equiv(&self, other: &V) -> bool { self.as_slice() == other.as_slice() }
402 }
403
404 impl<T: Ord> Ord for Vec<T> {
405     #[inline]
406     fn cmp(&self, other: &Vec<T>) -> Ordering {
407         self.as_slice().cmp(&other.as_slice())
408     }
409 }
410
411 impl<T> Collection for Vec<T> {
412     #[inline]
413     fn len(&self) -> uint {
414         self.len
415     }
416 }
417
418 impl<T: Clone> CloneableVector<T> for Vec<T> {
419     fn to_owned(&self) -> Vec<T> { self.clone() }
420     fn into_owned(self) -> Vec<T> { self }
421 }
422
423 // FIXME: #13996: need a way to mark the return value as `noalias`
424 #[inline(never)]
425 unsafe fn alloc_or_realloc<T>(ptr: *mut T, size: uint, old_size: uint) -> *mut T {
426     if old_size == 0 {
427         allocate(size, mem::min_align_of::<T>()) as *mut T
428     } else {
429         reallocate(ptr as *mut u8, size,
430                    mem::min_align_of::<T>(), old_size) as *mut T
431     }
432 }
433
434 #[inline]
435 unsafe fn dealloc<T>(ptr: *mut T, len: uint) {
436     if mem::size_of::<T>() != 0 {
437         deallocate(ptr as *mut u8,
438                    len * mem::size_of::<T>(),
439                    mem::min_align_of::<T>())
440     }
441 }
442
443 impl<T> Vec<T> {
444     /// Returns the number of elements the vector can hold without
445     /// reallocating.
446     ///
447     /// # Example
448     ///
449     /// ```rust
450     /// # use std::vec::Vec;
451     /// let vec: Vec<int> = Vec::with_capacity(10);
452     /// assert_eq!(vec.capacity(), 10);
453     /// ```
454     #[inline]
455     pub fn capacity(&self) -> uint {
456         self.cap
457     }
458
459      /// Reserves capacity for at least `n` additional elements in the given
460      /// vector.
461      ///
462      /// # Failure
463      ///
464      /// Fails if the new capacity overflows `uint`.
465      ///
466      /// # Example
467      ///
468      /// ```rust
469      /// # use std::vec::Vec;
470      /// let mut vec: Vec<int> = vec!(1i);
471      /// vec.reserve_additional(10);
472      /// assert!(vec.capacity() >= 11);
473      /// ```
474     pub fn reserve_additional(&mut self, extra: uint) {
475         if self.cap - self.len < extra {
476             match self.len.checked_add(&extra) {
477                 None => fail!("Vec::reserve_additional: `uint` overflow"),
478                 Some(new_cap) => self.reserve(new_cap)
479             }
480         }
481     }
482
483     /// Reserves capacity for at least `n` elements in the given vector.
484     ///
485     /// This function will over-allocate in order to amortize the allocation
486     /// costs in scenarios where the caller may need to repeatedly reserve
487     /// additional space.
488     ///
489     /// If the capacity for `self` is already equal to or greater than the
490     /// requested capacity, then no action is taken.
491     ///
492     /// # Example
493     ///
494     /// ```rust
495     /// let mut vec = vec!(1i, 2, 3);
496     /// vec.reserve(10);
497     /// assert!(vec.capacity() >= 10);
498     /// ```
499     pub fn reserve(&mut self, capacity: uint) {
500         if capacity >= self.len {
501             self.reserve_exact(num::next_power_of_two(capacity))
502         }
503     }
504
505     /// Reserves capacity for exactly `capacity` elements in the given vector.
506     ///
507     /// If the capacity for `self` is already equal to or greater than the
508     /// requested capacity, then no action is taken.
509     ///
510     /// # Example
511     ///
512     /// ```rust
513     /// # use std::vec::Vec;
514     /// let mut vec: Vec<int> = Vec::with_capacity(10);
515     /// vec.reserve_exact(11);
516     /// assert_eq!(vec.capacity(), 11);
517     /// ```
518     pub fn reserve_exact(&mut self, capacity: uint) {
519         if mem::size_of::<T>() == 0 { return }
520
521         if capacity > self.cap {
522             let size = capacity.checked_mul(&mem::size_of::<T>())
523                                .expect("capacity overflow");
524             unsafe {
525                 self.ptr = alloc_or_realloc(self.ptr, size,
526                                             self.cap * mem::size_of::<T>());
527             }
528             self.cap = capacity;
529         }
530     }
531
532     /// Shrink the capacity of the vector as much as possible
533     ///
534     /// # Example
535     ///
536     /// ```rust
537     /// let mut vec = vec!(1i, 2, 3);
538     /// vec.shrink_to_fit();
539     /// ```
540     pub fn shrink_to_fit(&mut self) {
541         if mem::size_of::<T>() == 0 { return }
542
543         if self.len == 0 {
544             if self.cap != 0 {
545                 unsafe {
546                     dealloc(self.ptr, self.cap)
547                 }
548                 self.cap = 0;
549             }
550         } else {
551             unsafe {
552                 // Overflow check is unnecessary as the vector is already at
553                 // least this large.
554                 self.ptr = reallocate(self.ptr as *mut u8,
555                                       self.len * mem::size_of::<T>(),
556                                       mem::min_align_of::<T>(),
557                                       self.cap * mem::size_of::<T>()) as *mut T;
558             }
559             self.cap = self.len;
560         }
561     }
562
563     /// Remove the last element from a vector and return it, or `None` if it is
564     /// empty.
565     ///
566     /// # Example
567     ///
568     /// ```rust
569     /// let mut vec = vec!(1i, 2, 3);
570     /// assert_eq!(vec.pop(), Some(3));
571     /// assert_eq!(vec, vec!(1, 2));
572     /// ```
573     #[inline]
574     pub fn pop(&mut self) -> Option<T> {
575         if self.len == 0 {
576             None
577         } else {
578             unsafe {
579                 self.len -= 1;
580                 Some(ptr::read(self.as_slice().unsafe_ref(self.len())))
581             }
582         }
583     }
584
585     /// Append an element to a vector.
586     ///
587     /// # Failure
588     ///
589     /// Fails if the number of elements in the vector overflows a `uint`.
590     ///
591     /// # Example
592     ///
593     /// ```rust
594     /// let mut vec = vec!(1i, 2);
595     /// vec.push(3);
596     /// assert_eq!(vec, vec!(1, 2, 3));
597     /// ```
598     #[inline]
599     pub fn push(&mut self, value: T) {
600         if mem::size_of::<T>() == 0 {
601             // zero-size types consume no memory, so we can't rely on the address space running out
602             self.len = self.len.checked_add(&1).expect("length overflow");
603             unsafe { mem::forget(value); }
604             return
605         }
606         if self.len == self.cap {
607             let old_size = self.cap * mem::size_of::<T>();
608             let size = max(old_size, 2 * mem::size_of::<T>()) * 2;
609             if old_size > size { fail!("capacity overflow") }
610             unsafe {
611                 self.ptr = alloc_or_realloc(self.ptr, size,
612                                             self.cap * mem::size_of::<T>());
613             }
614             self.cap = max(self.cap, 2) * 2;
615         }
616
617         unsafe {
618             let end = (self.ptr as *T).offset(self.len as int) as *mut T;
619             ptr::write(&mut *end, value);
620             self.len += 1;
621         }
622     }
623
624     /// Appends one element to the vector provided. The vector itself is then
625     /// returned for use again.
626     ///
627     /// # Example
628     ///
629     /// ```rust
630     /// let vec = vec!(1i, 2);
631     /// let vec = vec.append_one(3);
632     /// assert_eq!(vec, vec!(1, 2, 3));
633     /// ```
634     #[inline]
635     pub fn append_one(mut self, x: T) -> Vec<T> {
636         self.push(x);
637         self
638     }
639
640     /// Shorten a vector, dropping excess elements.
641     ///
642     /// If `len` is greater than the vector's current length, this has no
643     /// effect.
644     ///
645     /// # Example
646     ///
647     /// ```rust
648     /// let mut vec = vec!(1i, 2, 3, 4);
649     /// vec.truncate(2);
650     /// assert_eq!(vec, vec!(1, 2));
651     /// ```
652     pub fn truncate(&mut self, len: uint) {
653         unsafe {
654             // drop any extra elements
655             while len < self.len {
656                 // decrement len before the read(), so a failure on Drop doesn't
657                 // re-drop the just-failed value.
658                 self.len -= 1;
659                 ptr::read(self.as_slice().unsafe_ref(self.len));
660             }
661         }
662     }
663
664     /// Work with `self` as a mutable slice.
665     ///
666     /// # Example
667     ///
668     /// ```rust
669     /// fn foo(slice: &mut [int]) {}
670     ///
671     /// let mut vec = vec!(1i, 2);
672     /// foo(vec.as_mut_slice());
673     /// ```
674     #[inline]
675     pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T] {
676         unsafe {
677             mem::transmute(Slice { data: self.as_mut_ptr() as *T, len: self.len })
678         }
679     }
680
681     /// Creates a consuming iterator, that is, one that moves each
682     /// value out of the vector (from start to end). The vector cannot
683     /// be used after calling this.
684     ///
685     /// # Example
686     ///
687     /// ```rust
688     /// let v = vec!("a".to_string(), "b".to_string());
689     /// for s in v.move_iter() {
690     ///     // s has type String, not &String
691     ///     println!("{}", s);
692     /// }
693     /// ```
694     #[inline]
695     pub fn move_iter(self) -> MoveItems<T> {
696         unsafe {
697             let iter = mem::transmute(self.as_slice().iter());
698             let ptr = self.ptr;
699             let cap = self.cap;
700             mem::forget(self);
701             MoveItems { allocation: ptr, cap: cap, iter: iter }
702         }
703     }
704
705
706     /// Sets the length of a vector.
707     ///
708     /// This will explicitly set the size of the vector, without actually
709     /// modifying its buffers, so it is up to the caller to ensure that the
710     /// vector is actually the specified size.
711     #[inline]
712     pub unsafe fn set_len(&mut self, len: uint) {
713         self.len = len;
714     }
715
716     /// Returns a reference to the value at index `index`.
717     ///
718     /// # Failure
719     ///
720     /// Fails if `index` is out of bounds
721     ///
722     /// # Example
723     ///
724     /// ```rust
725     /// let vec = vec!(1i, 2, 3);
726     /// assert!(vec.get(1) == &2);
727     /// ```
728     #[inline]
729     pub fn get<'a>(&'a self, index: uint) -> &'a T {
730         &self.as_slice()[index]
731     }
732
733     /// Returns a mutable reference to the value at index `index`.
734     ///
735     /// # Failure
736     ///
737     /// Fails if `index` is out of bounds
738     ///
739     /// # Example
740     ///
741     /// ```rust
742     /// let mut vec = vec!(1i, 2, 3);
743     /// *vec.get_mut(1) = 4;
744     /// assert_eq!(vec, vec!(1i, 4, 3));
745     /// ```
746     #[inline]
747     pub fn get_mut<'a>(&'a mut self, index: uint) -> &'a mut T {
748         &mut self.as_mut_slice()[index]
749     }
750
751     /// Returns an iterator over references to the elements of the vector in
752     /// order.
753     ///
754     /// # Example
755     ///
756     /// ```rust
757     /// let vec = vec!(1i, 2, 3);
758     /// for num in vec.iter() {
759     ///     println!("{}", *num);
760     /// }
761     /// ```
762     #[inline]
763     pub fn iter<'a>(&'a self) -> Items<'a,T> {
764         self.as_slice().iter()
765     }
766
767
768     /// Returns an iterator over mutable references to the elements of the
769     /// vector in order.
770     ///
771     /// # Example
772     ///
773     /// ```rust
774     /// let mut vec = vec!(1i, 2, 3);
775     /// for num in vec.mut_iter() {
776     ///     *num = 0;
777     /// }
778     /// ```
779     #[inline]
780     pub fn mut_iter<'a>(&'a mut self) -> MutItems<'a,T> {
781         self.as_mut_slice().mut_iter()
782     }
783
784     /// Sort the vector, in place, using `compare` to compare elements.
785     ///
786     /// This sort is `O(n log n)` worst-case and stable, but allocates
787     /// approximately `2 * n`, where `n` is the length of `self`.
788     ///
789     /// # Example
790     ///
791     /// ```rust
792     /// let mut v = vec!(5i, 4, 1, 3, 2);
793     /// v.sort_by(|a, b| a.cmp(b));
794     /// assert_eq!(v, vec!(1i, 2, 3, 4, 5));
795     ///
796     /// // reverse sorting
797     /// v.sort_by(|a, b| b.cmp(a));
798     /// assert_eq!(v, vec!(5i, 4, 3, 2, 1));
799     /// ```
800     #[inline]
801     pub fn sort_by(&mut self, compare: |&T, &T| -> Ordering) {
802         self.as_mut_slice().sort_by(compare)
803     }
804
805     /// Returns a slice of self spanning the interval [`start`, `end`).
806     ///
807     /// # Failure
808     ///
809     /// Fails when the slice (or part of it) is outside the bounds of self, or when
810     /// `start` > `end`.
811     ///
812     /// # Example
813     ///
814     /// ```rust
815     /// let vec = vec!(1i, 2, 3, 4);
816     /// assert!(vec.slice(0, 2) == [1, 2]);
817     /// ```
818     #[inline]
819     pub fn slice<'a>(&'a self, start: uint, end: uint) -> &'a [T] {
820         self.as_slice().slice(start, end)
821     }
822
823     /// Returns a slice containing all but the first element of the vector.
824     ///
825     /// # Failure
826     ///
827     /// Fails when the vector is empty.
828     ///
829     /// # Example
830     ///
831     /// ```rust
832     /// let vec = vec!(1i, 2, 3);
833     /// assert!(vec.tail() == [2, 3]);
834     /// ```
835     #[inline]
836     pub fn tail<'a>(&'a self) -> &'a [T] {
837         self.as_slice().tail()
838     }
839
840     /// Returns all but the first `n' elements of a vector.
841     ///
842     /// # Failure
843     ///
844     /// Fails when there are fewer than `n` elements in the vector.
845     ///
846     /// # Example
847     ///
848     /// ```rust
849     /// let vec = vec!(1i, 2, 3, 4);
850     /// assert!(vec.tailn(2) == [3, 4]);
851     /// ```
852     #[inline]
853     pub fn tailn<'a>(&'a self, n: uint) -> &'a [T] {
854         self.as_slice().tailn(n)
855     }
856
857     /// Returns a reference to the last element of a vector, or `None` if it is
858     /// empty.
859     ///
860     /// # Example
861     ///
862     /// ```rust
863     /// let vec = vec!(1i, 2, 3);
864     /// assert!(vec.last() == Some(&3));
865     /// ```
866     #[inline]
867     pub fn last<'a>(&'a self) -> Option<&'a T> {
868         self.as_slice().last()
869     }
870
871     /// Returns a mutable reference to the last element of a vector, or `None`
872     /// if it is empty.
873     ///
874     /// # Example
875     ///
876     /// ```rust
877     /// let mut vec = vec!(1i, 2, 3);
878     /// *vec.mut_last().unwrap() = 4;
879     /// assert_eq!(vec, vec!(1i, 2, 4));
880     /// ```
881     #[inline]
882     pub fn mut_last<'a>(&'a mut self) -> Option<&'a mut T> {
883         self.as_mut_slice().mut_last()
884     }
885
886     /// Remove an element from anywhere in the vector and return it, replacing
887     /// it with the last element. This does not preserve ordering, but is O(1).
888     ///
889     /// Returns `None` if `index` is out of bounds.
890     ///
891     /// # Example
892     /// ```rust
893     /// let mut v = vec!("foo".to_string(), "bar".to_string(),
894     ///                  "baz".to_string(), "qux".to_string());
895     ///
896     /// assert_eq!(v.swap_remove(1), Some("bar".to_string()));
897     /// assert_eq!(v, vec!("foo".to_string(), "qux".to_string(), "baz".to_string()));
898     ///
899     /// assert_eq!(v.swap_remove(0), Some("foo".to_string()));
900     /// assert_eq!(v, vec!("baz".to_string(), "qux".to_string()));
901     ///
902     /// assert_eq!(v.swap_remove(2), None);
903     /// ```
904     #[inline]
905     pub fn swap_remove(&mut self, index: uint) -> Option<T> {
906         let length = self.len();
907         if index < length - 1 {
908             self.as_mut_slice().swap(index, length - 1);
909         } else if index >= length {
910             return None
911         }
912         self.pop()
913     }
914
915     /// Prepend an element to the vector.
916     ///
917     /// # Warning
918     ///
919     /// This is an O(n) operation as it requires copying every element in the
920     /// vector.
921     ///
922     /// # Example
923     ///
924     /// ```rust
925     /// let mut vec = vec!(1i, 2, 3);
926     /// vec.unshift(4);
927     /// assert_eq!(vec, vec!(4, 1, 2, 3));
928     /// ```
929     #[inline]
930     pub fn unshift(&mut self, element: T) {
931         self.insert(0, element)
932     }
933
934     /// Removes the first element from a vector and returns it, or `None` if
935     /// the vector is empty.
936     ///
937     /// # Warning
938     ///
939     /// This is an O(n) operation as it requires copying every element in the
940     /// vector.
941     ///
942     /// # Example
943     ///
944     /// ```rust
945     /// let mut vec = vec!(1i, 2, 3);
946     /// assert!(vec.shift() == Some(1));
947     /// assert_eq!(vec, vec!(2, 3));
948     /// ```
949     #[inline]
950     pub fn shift(&mut self) -> Option<T> {
951         self.remove(0)
952     }
953
954     /// Insert an element at position `index` within the vector, shifting all
955     /// elements after position i one position to the right.
956     ///
957     /// # Failure
958     ///
959     /// Fails if `index` is out of bounds of the vector.
960     ///
961     /// # Example
962     ///
963     /// ```rust
964     /// let mut vec = vec!(1i, 2, 3);
965     /// vec.insert(1, 4);
966     /// assert_eq!(vec, vec!(1, 4, 2, 3));
967     /// ```
968     pub fn insert(&mut self, index: uint, element: T) {
969         let len = self.len();
970         assert!(index <= len);
971         // space for the new element
972         self.reserve(len + 1);
973
974         unsafe { // infallible
975             // The spot to put the new value
976             {
977                 let p = self.as_mut_ptr().offset(index as int);
978                 // Shift everything over to make space. (Duplicating the
979                 // `index`th element into two consecutive places.)
980                 ptr::copy_memory(p.offset(1), &*p, len - index);
981                 // Write it in, overwriting the first copy of the `index`th
982                 // element.
983                 ptr::write(&mut *p, element);
984             }
985             self.set_len(len + 1);
986         }
987     }
988
989     /// Remove and return the element at position `index` within the vector,
990     /// shifting all elements after position `index` one position to the left.
991     /// Returns `None` if `i` is out of bounds.
992     ///
993     /// # Example
994     ///
995     /// ```rust
996     /// let mut v = vec!(1i, 2, 3);
997     /// assert_eq!(v.remove(1), Some(2));
998     /// assert_eq!(v, vec!(1, 3));
999     ///
1000     /// assert_eq!(v.remove(4), None);
1001     /// // v is unchanged:
1002     /// assert_eq!(v, vec!(1, 3));
1003     /// ```
1004     pub fn remove(&mut self, index: uint) -> Option<T> {
1005         let len = self.len();
1006         if index < len {
1007             unsafe { // infallible
1008                 let ret;
1009                 {
1010                     // the place we are taking from.
1011                     let ptr = self.as_mut_ptr().offset(index as int);
1012                     // copy it out, unsafely having a copy of the value on
1013                     // the stack and in the vector at the same time.
1014                     ret = Some(ptr::read(ptr as *T));
1015
1016                     // Shift everything down to fill in that spot.
1017                     ptr::copy_memory(ptr, &*ptr.offset(1), len - index - 1);
1018                 }
1019                 self.set_len(len - 1);
1020                 ret
1021             }
1022         } else {
1023             None
1024         }
1025     }
1026
1027     /// Takes ownership of the vector `other`, moving all elements into
1028     /// the current vector. This does not copy any elements, and it is
1029     /// illegal to use the `other` vector after calling this method
1030     /// (because it is moved here).
1031     ///
1032     /// # Example
1033     ///
1034     /// ```rust
1035     /// let mut vec = vec!(box 1i);
1036     /// vec.push_all_move(vec!(box 2, box 3, box 4));
1037     /// assert_eq!(vec, vec!(box 1, box 2, box 3, box 4));
1038     /// ```
1039     #[inline]
1040     pub fn push_all_move(&mut self, other: Vec<T>) {
1041         self.extend(other.move_iter());
1042     }
1043
1044     /// Returns a mutable slice of `self` between `start` and `end`.
1045     ///
1046     /// # Failure
1047     ///
1048     /// Fails when `start` or `end` point outside the bounds of `self`, or when
1049     /// `start` > `end`.
1050     ///
1051     /// # Example
1052     ///
1053     /// ```rust
1054     /// let mut vec = vec!(1i, 2, 3, 4);
1055     /// assert!(vec.mut_slice(0, 2) == [1, 2]);
1056     /// ```
1057     #[inline]
1058     pub fn mut_slice<'a>(&'a mut self, start: uint, end: uint)
1059                          -> &'a mut [T] {
1060         self.as_mut_slice().mut_slice(start, end)
1061     }
1062
1063     /// Returns a mutable slice of self from `start` to the end of the vec.
1064     ///
1065     /// # Failure
1066     ///
1067     /// Fails when `start` points outside the bounds of self.
1068     ///
1069     /// # Example
1070     ///
1071     /// ```rust
1072     /// let mut vec = vec!(1i, 2, 3, 4);
1073     /// assert!(vec.mut_slice_from(2) == [3, 4]);
1074     /// ```
1075     #[inline]
1076     pub fn mut_slice_from<'a>(&'a mut self, start: uint) -> &'a mut [T] {
1077         self.as_mut_slice().mut_slice_from(start)
1078     }
1079
1080     /// Returns a mutable slice of self from the start of the vec to `end`.
1081     ///
1082     /// # Failure
1083     ///
1084     /// Fails when `end` points outside the bounds of self.
1085     ///
1086     /// # Example
1087     ///
1088     /// ```rust
1089     /// let mut vec = vec!(1i, 2, 3, 4);
1090     /// assert!(vec.mut_slice_to(2) == [1, 2]);
1091     /// ```
1092     #[inline]
1093     pub fn mut_slice_to<'a>(&'a mut self, end: uint) -> &'a mut [T] {
1094         self.as_mut_slice().mut_slice_to(end)
1095     }
1096
1097     /// Returns a pair of mutable slices that divides the vec at an index.
1098     ///
1099     /// The first will contain all indices from `[0, mid)` (excluding
1100     /// the index `mid` itself) and the second will contain all
1101     /// indices from `[mid, len)` (excluding the index `len` itself).
1102     ///
1103     /// # Failure
1104     ///
1105     /// Fails if `mid > len`.
1106     ///
1107     /// # Example
1108     ///
1109     /// ```rust
1110     /// let mut vec = vec!(1i, 2, 3, 4, 5, 6);
1111     ///
1112     /// // scoped to restrict the lifetime of the borrows
1113     /// {
1114     ///    let (left, right) = vec.mut_split_at(0);
1115     ///    assert!(left == &mut []);
1116     ///    assert!(right == &mut [1, 2, 3, 4, 5, 6]);
1117     /// }
1118     ///
1119     /// {
1120     ///     let (left, right) = vec.mut_split_at(2);
1121     ///     assert!(left == &mut [1, 2]);
1122     ///     assert!(right == &mut [3, 4, 5, 6]);
1123     /// }
1124     ///
1125     /// {
1126     ///     let (left, right) = vec.mut_split_at(6);
1127     ///     assert!(left == &mut [1, 2, 3, 4, 5, 6]);
1128     ///     assert!(right == &mut []);
1129     /// }
1130     /// ```
1131     #[inline]
1132     pub fn mut_split_at<'a>(&'a mut self, mid: uint) -> (&'a mut [T], &'a mut [T]) {
1133         self.as_mut_slice().mut_split_at(mid)
1134     }
1135
1136     /// Reverse the order of elements in a vector, in place.
1137     ///
1138     /// # Example
1139     ///
1140     /// ```rust
1141     /// let mut v = vec!(1i, 2, 3);
1142     /// v.reverse();
1143     /// assert_eq!(v, vec!(3i, 2, 1));
1144     /// ```
1145     #[inline]
1146     pub fn reverse(&mut self) {
1147         self.as_mut_slice().reverse()
1148     }
1149
1150     /// Returns a slice of `self` from `start` to the end of the vec.
1151     ///
1152     /// # Failure
1153     ///
1154     /// Fails when `start` points outside the bounds of self.
1155     ///
1156     /// # Example
1157     ///
1158     /// ```rust
1159     /// let vec = vec!(1i, 2, 3);
1160     /// assert!(vec.slice_from(1) == [2, 3]);
1161     /// ```
1162     #[inline]
1163     pub fn slice_from<'a>(&'a self, start: uint) -> &'a [T] {
1164         self.as_slice().slice_from(start)
1165     }
1166
1167     /// Returns a slice of self from the start of the vec to `end`.
1168     ///
1169     /// # Failure
1170     ///
1171     /// Fails when `end` points outside the bounds of self.
1172     ///
1173     /// # Example
1174     ///
1175     /// ```rust
1176     /// let vec = vec!(1i, 2, 3);
1177     /// assert!(vec.slice_to(2) == [1, 2]);
1178     /// ```
1179     #[inline]
1180     pub fn slice_to<'a>(&'a self, end: uint) -> &'a [T] {
1181         self.as_slice().slice_to(end)
1182     }
1183
1184     /// Returns a slice containing all but the last element of the vector.
1185     ///
1186     /// # Failure
1187     ///
1188     /// Fails if the vector is empty
1189     #[inline]
1190     pub fn init<'a>(&'a self) -> &'a [T] {
1191         self.slice(0, self.len() - 1)
1192     }
1193
1194
1195     /// Returns an unsafe pointer to the vector's buffer.
1196     ///
1197     /// The caller must ensure that the vector outlives the pointer this
1198     /// function returns, or else it will end up pointing to garbage.
1199     ///
1200     /// Modifying the vector may cause its buffer to be reallocated, which
1201     /// would also make any pointers to it invalid.
1202     #[inline]
1203     pub fn as_ptr(&self) -> *T {
1204         // If we have a 0-sized vector, then the base pointer should not be NULL
1205         // because an iterator over the slice will attempt to yield the base
1206         // pointer as the first element in the vector, but this will end up
1207         // being Some(NULL) which is optimized to None.
1208         if mem::size_of::<T>() == 0 {
1209             1 as *T
1210         } else {
1211             self.ptr as *T
1212         }
1213     }
1214
1215     /// Returns a mutable unsafe pointer to the vector's buffer.
1216     ///
1217     /// The caller must ensure that the vector outlives the pointer this
1218     /// function returns, or else it will end up pointing to garbage.
1219     ///
1220     /// Modifying the vector may cause its buffer to be reallocated, which
1221     /// would also make any pointers to it invalid.
1222     #[inline]
1223     pub fn as_mut_ptr(&mut self) -> *mut T {
1224         // see above for the 0-size check
1225         if mem::size_of::<T>() == 0 {
1226             1 as *mut T
1227         } else {
1228             self.ptr
1229         }
1230     }
1231
1232     /// Retains only the elements specified by the predicate.
1233     ///
1234     /// In other words, remove all elements `e` such that `f(&e)` returns false.
1235     /// This method operates in place and preserves the order the retained elements.
1236     ///
1237     /// # Example
1238     ///
1239     /// ```rust
1240     /// let mut vec = vec!(1i, 2, 3, 4);
1241     /// vec.retain(|x| x%2 == 0);
1242     /// assert_eq!(vec, vec!(2, 4));
1243     /// ```
1244     pub fn retain(&mut self, f: |&T| -> bool) {
1245         let len = self.len();
1246         let mut del = 0u;
1247         {
1248             let v = self.as_mut_slice();
1249
1250             for i in range(0u, len) {
1251                 if !f(&v[i]) {
1252                     del += 1;
1253                 } else if del > 0 {
1254                     v.swap(i-del, i);
1255                 }
1256             }
1257         }
1258         if del > 0 {
1259             self.truncate(len - del);
1260         }
1261     }
1262
1263     /// Expands a vector in place, initializing the new elements to the result of a function.
1264     ///
1265     /// The vector is grown by `n` elements. The i-th new element are initialized to the value
1266     /// returned by `f(i)` where `i` is in the range [0, n).
1267     ///
1268     /// # Example
1269     ///
1270     /// ```rust
1271     /// let mut vec = vec!(0u, 1);
1272     /// vec.grow_fn(3, |i| i);
1273     /// assert_eq!(vec, vec!(0, 1, 0, 1, 2));
1274     /// ```
1275     pub fn grow_fn(&mut self, n: uint, f: |uint| -> T) {
1276         self.reserve_additional(n);
1277         for i in range(0u, n) {
1278             self.push(f(i));
1279         }
1280     }
1281 }
1282
1283 impl<T:Ord> Vec<T> {
1284     /// Sorts the vector in place.
1285     ///
1286     /// This sort is `O(n log n)` worst-case and stable, but allocates
1287     /// approximately `2 * n`, where `n` is the length of `self`.
1288     ///
1289     /// # Example
1290     ///
1291     /// ```rust
1292     /// let mut vec = vec!(3i, 1, 2);
1293     /// vec.sort();
1294     /// assert_eq!(vec, vec!(1, 2, 3));
1295     /// ```
1296     pub fn sort(&mut self) {
1297         self.as_mut_slice().sort()
1298     }
1299 }
1300
1301 impl<T> Mutable for Vec<T> {
1302     #[inline]
1303     fn clear(&mut self) {
1304         self.truncate(0)
1305     }
1306 }
1307
1308 impl<T:PartialEq> Vec<T> {
1309     /// Return true if a vector contains an element with the given value
1310     ///
1311     /// # Example
1312     ///
1313     /// ```rust
1314     /// let vec = vec!(1i, 2, 3);
1315     /// assert!(vec.contains(&1));
1316     /// ```
1317     #[inline]
1318     pub fn contains(&self, x: &T) -> bool {
1319         self.as_slice().contains(x)
1320     }
1321
1322     /// Remove consecutive repeated elements in the vector.
1323     ///
1324     /// If the vector is sorted, this removes all duplicates.
1325     ///
1326     /// # Example
1327     ///
1328     /// ```rust
1329     /// let mut vec = vec!(1i, 2, 2, 3, 2);
1330     /// vec.dedup();
1331     /// assert_eq!(vec, vec!(1i, 2, 3, 2));
1332     /// ```
1333     pub fn dedup(&mut self) {
1334         unsafe {
1335             // Although we have a mutable reference to `self`, we cannot make
1336             // *arbitrary* changes. The `PartialEq` comparisons could fail, so we
1337             // must ensure that the vector is in a valid state at all time.
1338             //
1339             // The way that we handle this is by using swaps; we iterate
1340             // over all the elements, swapping as we go so that at the end
1341             // the elements we wish to keep are in the front, and those we
1342             // wish to reject are at the back. We can then truncate the
1343             // vector. This operation is still O(n).
1344             //
1345             // Example: We start in this state, where `r` represents "next
1346             // read" and `w` represents "next_write`.
1347             //
1348             //           r
1349             //     +---+---+---+---+---+---+
1350             //     | 0 | 1 | 1 | 2 | 3 | 3 |
1351             //     +---+---+---+---+---+---+
1352             //           w
1353             //
1354             // Comparing self[r] against self[w-1], this is not a duplicate, so
1355             // we swap self[r] and self[w] (no effect as r==w) and then increment both
1356             // r and w, leaving us with:
1357             //
1358             //               r
1359             //     +---+---+---+---+---+---+
1360             //     | 0 | 1 | 1 | 2 | 3 | 3 |
1361             //     +---+---+---+---+---+---+
1362             //               w
1363             //
1364             // Comparing self[r] against self[w-1], this value is a duplicate,
1365             // so we increment `r` but leave everything else unchanged:
1366             //
1367             //                   r
1368             //     +---+---+---+---+---+---+
1369             //     | 0 | 1 | 1 | 2 | 3 | 3 |
1370             //     +---+---+---+---+---+---+
1371             //               w
1372             //
1373             // Comparing self[r] against self[w-1], this is not a duplicate,
1374             // so swap self[r] and self[w] and advance r and w:
1375             //
1376             //                       r
1377             //     +---+---+---+---+---+---+
1378             //     | 0 | 1 | 2 | 1 | 3 | 3 |
1379             //     +---+---+---+---+---+---+
1380             //                   w
1381             //
1382             // Not a duplicate, repeat:
1383             //
1384             //                           r
1385             //     +---+---+---+---+---+---+
1386             //     | 0 | 1 | 2 | 3 | 1 | 3 |
1387             //     +---+---+---+---+---+---+
1388             //                       w
1389             //
1390             // Duplicate, advance r. End of vec. Truncate to w.
1391
1392             let ln = self.len();
1393             if ln < 1 { return; }
1394
1395             // Avoid bounds checks by using unsafe pointers.
1396             let p = self.as_mut_slice().as_mut_ptr();
1397             let mut r = 1;
1398             let mut w = 1;
1399
1400             while r < ln {
1401                 let p_r = p.offset(r as int);
1402                 let p_wm1 = p.offset((w - 1) as int);
1403                 if *p_r != *p_wm1 {
1404                     if r != w {
1405                         let p_w = p_wm1.offset(1);
1406                         mem::swap(&mut *p_r, &mut *p_w);
1407                     }
1408                     w += 1;
1409                 }
1410                 r += 1;
1411             }
1412
1413             self.truncate(w);
1414         }
1415     }
1416 }
1417
1418 impl<T> Vector<T> for Vec<T> {
1419     /// Work with `self` as a slice.
1420     ///
1421     /// # Example
1422     ///
1423     /// ```rust
1424     /// fn foo(slice: &[int]) {}
1425     ///
1426     /// let vec = vec!(1i, 2);
1427     /// foo(vec.as_slice());
1428     /// ```
1429     #[inline]
1430     fn as_slice<'a>(&'a self) -> &'a [T] {
1431         unsafe { mem::transmute(Slice { data: self.as_ptr(), len: self.len }) }
1432     }
1433 }
1434
1435 impl<T: Clone, V: Vector<T>> Add<V, Vec<T>> for Vec<T> {
1436     #[inline]
1437     fn add(&self, rhs: &V) -> Vec<T> {
1438         let mut res = Vec::with_capacity(self.len() + rhs.as_slice().len());
1439         res.push_all(self.as_slice());
1440         res.push_all(rhs.as_slice());
1441         res
1442     }
1443 }
1444
1445 #[unsafe_destructor]
1446 impl<T> Drop for Vec<T> {
1447     fn drop(&mut self) {
1448         // This is (and should always remain) a no-op if the fields are
1449         // zeroed (when moving out, because of #[unsafe_no_drop_flag]).
1450         if self.cap != 0 {
1451             unsafe {
1452                 for x in self.as_mut_slice().iter() {
1453                     ptr::read(x);
1454                 }
1455                 dealloc(self.ptr, self.cap)
1456             }
1457         }
1458     }
1459 }
1460
1461 impl<T> Default for Vec<T> {
1462     fn default() -> Vec<T> {
1463         Vec::new()
1464     }
1465 }
1466
1467 impl<T:fmt::Show> fmt::Show for Vec<T> {
1468     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1469         self.as_slice().fmt(f)
1470     }
1471 }
1472
1473 /// An iterator that moves out of a vector.
1474 pub struct MoveItems<T> {
1475     allocation: *mut T, // the block of memory allocated for the vector
1476     cap: uint, // the capacity of the vector
1477     iter: Items<'static, T>
1478 }
1479
1480 impl<T> Iterator<T> for MoveItems<T> {
1481     #[inline]
1482     fn next(&mut self) -> Option<T> {
1483         unsafe {
1484             self.iter.next().map(|x| ptr::read(x))
1485         }
1486     }
1487
1488     #[inline]
1489     fn size_hint(&self) -> (uint, Option<uint>) {
1490         self.iter.size_hint()
1491     }
1492 }
1493
1494 impl<T> DoubleEndedIterator<T> for MoveItems<T> {
1495     #[inline]
1496     fn next_back(&mut self) -> Option<T> {
1497         unsafe {
1498             self.iter.next_back().map(|x| ptr::read(x))
1499         }
1500     }
1501 }
1502
1503 #[unsafe_destructor]
1504 impl<T> Drop for MoveItems<T> {
1505     fn drop(&mut self) {
1506         // destroy the remaining elements
1507         if self.cap != 0 {
1508             for _x in *self {}
1509             unsafe {
1510                 dealloc(self.allocation, self.cap);
1511             }
1512         }
1513     }
1514 }
1515
1516 /**
1517  * Convert an iterator of pairs into a pair of vectors.
1518  *
1519  * Returns a tuple containing two vectors where the i-th element of the first
1520  * vector contains the first element of the i-th tuple of the input iterator,
1521  * and the i-th element of the second vector contains the second element
1522  * of the i-th tuple of the input iterator.
1523  */
1524 pub fn unzip<T, U, V: Iterator<(T, U)>>(mut iter: V) -> (Vec<T>, Vec<U>) {
1525     let (lo, _) = iter.size_hint();
1526     let mut ts = Vec::with_capacity(lo);
1527     let mut us = Vec::with_capacity(lo);
1528     for (t, u) in iter {
1529         ts.push(t);
1530         us.push(u);
1531     }
1532     (ts, us)
1533 }
1534
1535 /// Unsafe operations
1536 pub mod raw {
1537     use super::Vec;
1538     use core::ptr;
1539
1540     /// Constructs a vector from an unsafe pointer to a buffer.
1541     ///
1542     /// The elements of the buffer are copied into the vector without cloning,
1543     /// as if `ptr::read()` were called on them.
1544     #[inline]
1545     pub unsafe fn from_buf<T>(ptr: *T, elts: uint) -> Vec<T> {
1546         let mut dst = Vec::with_capacity(elts);
1547         dst.set_len(elts);
1548         ptr::copy_nonoverlapping_memory(dst.as_mut_ptr(), ptr, elts);
1549         dst
1550     }
1551 }
1552
1553
1554 #[cfg(test)]
1555 mod tests {
1556     extern crate test;
1557
1558     use std::prelude::*;
1559     use std::mem::size_of;
1560     use test::Bencher;
1561     use super::{unzip, raw, Vec};
1562
1563     #[test]
1564     fn test_small_vec_struct() {
1565         assert!(size_of::<Vec<u8>>() == size_of::<uint>() * 3);
1566     }
1567
1568     #[test]
1569     fn test_double_drop() {
1570         struct TwoVec<T> {
1571             x: Vec<T>,
1572             y: Vec<T>
1573         }
1574
1575         struct DropCounter<'a> {
1576             count: &'a mut int
1577         }
1578
1579         #[unsafe_destructor]
1580         impl<'a> Drop for DropCounter<'a> {
1581             fn drop(&mut self) {
1582                 *self.count += 1;
1583             }
1584         }
1585
1586         let mut count_x @ mut count_y = 0;
1587         {
1588             let mut tv = TwoVec {
1589                 x: Vec::new(),
1590                 y: Vec::new()
1591             };
1592             tv.x.push(DropCounter {count: &mut count_x});
1593             tv.y.push(DropCounter {count: &mut count_y});
1594
1595             // If Vec had a drop flag, here is where it would be zeroed.
1596             // Instead, it should rely on its internal state to prevent
1597             // doing anything significant when dropped multiple times.
1598             drop(tv.x);
1599
1600             // Here tv goes out of scope, tv.y should be dropped, but not tv.x.
1601         }
1602
1603         assert_eq!(count_x, 1);
1604         assert_eq!(count_y, 1);
1605     }
1606
1607     #[test]
1608     fn test_reserve_additional() {
1609         let mut v = Vec::new();
1610         assert_eq!(v.capacity(), 0);
1611
1612         v.reserve_additional(2);
1613         assert!(v.capacity() >= 2);
1614
1615         for i in range(0i, 16) {
1616             v.push(i);
1617         }
1618
1619         assert!(v.capacity() >= 16);
1620         v.reserve_additional(16);
1621         assert!(v.capacity() >= 32);
1622
1623         v.push(16);
1624
1625         v.reserve_additional(16);
1626         assert!(v.capacity() >= 33)
1627     }
1628
1629     #[test]
1630     fn test_extend() {
1631         let mut v = Vec::new();
1632         let mut w = Vec::new();
1633
1634         v.extend(range(0i, 3));
1635         for i in range(0i, 3) { w.push(i) }
1636
1637         assert_eq!(v, w);
1638
1639         v.extend(range(3i, 10));
1640         for i in range(3i, 10) { w.push(i) }
1641
1642         assert_eq!(v, w);
1643     }
1644
1645     #[test]
1646     fn test_mut_slice_from() {
1647         let mut values = Vec::from_slice([1u8,2,3,4,5]);
1648         {
1649             let slice = values.mut_slice_from(2);
1650             assert!(slice == [3, 4, 5]);
1651             for p in slice.mut_iter() {
1652                 *p += 2;
1653             }
1654         }
1655
1656         assert!(values.as_slice() == [1, 2, 5, 6, 7]);
1657     }
1658
1659     #[test]
1660     fn test_mut_slice_to() {
1661         let mut values = Vec::from_slice([1u8,2,3,4,5]);
1662         {
1663             let slice = values.mut_slice_to(2);
1664             assert!(slice == [1, 2]);
1665             for p in slice.mut_iter() {
1666                 *p += 1;
1667             }
1668         }
1669
1670         assert!(values.as_slice() == [2, 3, 3, 4, 5]);
1671     }
1672
1673     #[test]
1674     fn test_mut_split_at() {
1675         let mut values = Vec::from_slice([1u8,2,3,4,5]);
1676         {
1677             let (left, right) = values.mut_split_at(2);
1678             assert!(left.slice(0, left.len()) == [1, 2]);
1679             for p in left.mut_iter() {
1680                 *p += 1;
1681             }
1682
1683             assert!(right.slice(0, right.len()) == [3, 4, 5]);
1684             for p in right.mut_iter() {
1685                 *p += 2;
1686             }
1687         }
1688
1689         assert!(values == Vec::from_slice([2u8, 3, 5, 6, 7]));
1690     }
1691
1692     #[test]
1693     fn test_clone() {
1694         let v: Vec<int> = vec!();
1695         let w = vec!(1i, 2, 3);
1696
1697         assert_eq!(v, v.clone());
1698
1699         let z = w.clone();
1700         assert_eq!(w, z);
1701         // they should be disjoint in memory.
1702         assert!(w.as_ptr() != z.as_ptr())
1703     }
1704
1705     #[test]
1706     fn test_clone_from() {
1707         let mut v = vec!();
1708         let three = vec!(box 1i, box 2, box 3);
1709         let two = vec!(box 4i, box 5);
1710         // zero, long
1711         v.clone_from(&three);
1712         assert_eq!(v, three);
1713
1714         // equal
1715         v.clone_from(&three);
1716         assert_eq!(v, three);
1717
1718         // long, short
1719         v.clone_from(&two);
1720         assert_eq!(v, two);
1721
1722         // short, long
1723         v.clone_from(&three);
1724         assert_eq!(v, three)
1725     }
1726
1727     #[test]
1728     fn test_grow_fn() {
1729         let mut v = Vec::from_slice([0u, 1]);
1730         v.grow_fn(3, |i| i);
1731         assert!(v == Vec::from_slice([0u, 1, 0, 1, 2]));
1732     }
1733
1734     #[test]
1735     fn test_retain() {
1736         let mut vec = Vec::from_slice([1u, 2, 3, 4]);
1737         vec.retain(|x| x%2 == 0);
1738         assert!(vec == Vec::from_slice([2u, 4]));
1739     }
1740
1741     #[test]
1742     fn zero_sized_values() {
1743         let mut v = Vec::new();
1744         assert_eq!(v.len(), 0);
1745         v.push(());
1746         assert_eq!(v.len(), 1);
1747         v.push(());
1748         assert_eq!(v.len(), 2);
1749         assert_eq!(v.pop(), Some(()));
1750         assert_eq!(v.pop(), Some(()));
1751         assert_eq!(v.pop(), None);
1752
1753         assert_eq!(v.iter().count(), 0);
1754         v.push(());
1755         assert_eq!(v.iter().count(), 1);
1756         v.push(());
1757         assert_eq!(v.iter().count(), 2);
1758
1759         for &() in v.iter() {}
1760
1761         assert_eq!(v.mut_iter().count(), 2);
1762         v.push(());
1763         assert_eq!(v.mut_iter().count(), 3);
1764         v.push(());
1765         assert_eq!(v.mut_iter().count(), 4);
1766
1767         for &() in v.mut_iter() {}
1768         unsafe { v.set_len(0); }
1769         assert_eq!(v.mut_iter().count(), 0);
1770     }
1771
1772     #[test]
1773     fn test_partition() {
1774         assert_eq!(vec![].partition(|x: &int| *x < 3), (vec![], vec![]));
1775         assert_eq!(vec![1i, 2, 3].partition(|x: &int| *x < 4), (vec![1, 2, 3], vec![]));
1776         assert_eq!(vec![1i, 2, 3].partition(|x: &int| *x < 2), (vec![1], vec![2, 3]));
1777         assert_eq!(vec![1i, 2, 3].partition(|x: &int| *x < 0), (vec![], vec![1, 2, 3]));
1778     }
1779
1780     #[test]
1781     fn test_partitioned() {
1782         assert_eq!(vec![].partitioned(|x: &int| *x < 3), (vec![], vec![]))
1783         assert_eq!(vec![1i, 2, 3].partitioned(|x: &int| *x < 4), (vec![1, 2, 3], vec![]));
1784         assert_eq!(vec![1i, 2, 3].partitioned(|x: &int| *x < 2), (vec![1], vec![2, 3]));
1785         assert_eq!(vec![1i, 2, 3].partitioned(|x: &int| *x < 0), (vec![], vec![1, 2, 3]));
1786     }
1787
1788     #[test]
1789     fn test_zip_unzip() {
1790         let z1 = vec![(1i, 4i), (2, 5), (3, 6)];
1791
1792         let (left, right) = unzip(z1.iter().map(|&x| x));
1793
1794         let (left, right) = (left.as_slice(), right.as_slice());
1795         assert_eq!((1, 4), (left[0], right[0]));
1796         assert_eq!((2, 5), (left[1], right[1]));
1797         assert_eq!((3, 6), (left[2], right[2]));
1798     }
1799
1800     #[test]
1801     fn test_unsafe_ptrs() {
1802         unsafe {
1803             // Test on-stack copy-from-buf.
1804             let a = [1i, 2, 3];
1805             let ptr = a.as_ptr();
1806             let b = raw::from_buf(ptr, 3u);
1807             assert_eq!(b, vec![1, 2, 3]);
1808
1809             // Test on-heap copy-from-buf.
1810             let c = vec![1i, 2, 3, 4, 5];
1811             let ptr = c.as_ptr();
1812             let d = raw::from_buf(ptr, 5u);
1813             assert_eq!(d, vec![1, 2, 3, 4, 5]);
1814         }
1815     }
1816
1817     #[test]
1818     fn test_vec_truncate_drop() {
1819         static mut drops: uint = 0;
1820         struct Elem(int);
1821         impl Drop for Elem {
1822             fn drop(&mut self) {
1823                 unsafe { drops += 1; }
1824             }
1825         }
1826
1827         let mut v = vec![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
1828         assert_eq!(unsafe { drops }, 0);
1829         v.truncate(3);
1830         assert_eq!(unsafe { drops }, 2);
1831         v.truncate(0);
1832         assert_eq!(unsafe { drops }, 5);
1833     }
1834
1835     #[test]
1836     #[should_fail]
1837     fn test_vec_truncate_fail() {
1838         struct BadElem(int);
1839         impl Drop for BadElem {
1840             fn drop(&mut self) {
1841                 let BadElem(ref mut x) = *self;
1842                 if *x == 0xbadbeef {
1843                     fail!("BadElem failure: 0xbadbeef")
1844                 }
1845             }
1846         }
1847
1848         let mut v = vec![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
1849         v.truncate(0);
1850     }
1851
1852     #[bench]
1853     fn bench_new(b: &mut Bencher) {
1854         b.iter(|| {
1855             let v: Vec<int> = Vec::new();
1856             assert_eq!(v.capacity(), 0);
1857             assert!(v.as_slice() == []);
1858         })
1859     }
1860
1861     #[bench]
1862     fn bench_with_capacity_0(b: &mut Bencher) {
1863         b.iter(|| {
1864             let v: Vec<int> = Vec::with_capacity(0);
1865             assert_eq!(v.capacity(), 0);
1866             assert!(v.as_slice() == []);
1867         })
1868     }
1869
1870
1871     #[bench]
1872     fn bench_with_capacity_5(b: &mut Bencher) {
1873         b.iter(|| {
1874             let v: Vec<int> = Vec::with_capacity(5);
1875             assert_eq!(v.capacity(), 5);
1876             assert!(v.as_slice() == []);
1877         })
1878     }
1879
1880     #[bench]
1881     fn bench_with_capacity_100(b: &mut Bencher) {
1882         b.iter(|| {
1883             let v: Vec<int> = Vec::with_capacity(100);
1884             assert_eq!(v.capacity(), 100);
1885             assert!(v.as_slice() == []);
1886         })
1887     }
1888
1889     #[bench]
1890     fn bench_from_fn_0(b: &mut Bencher) {
1891         b.iter(|| {
1892             let v: Vec<int> = Vec::from_fn(0, |_| 5);
1893             assert!(v.as_slice() == []);
1894         })
1895     }
1896
1897     #[bench]
1898     fn bench_from_fn_5(b: &mut Bencher) {
1899         b.iter(|| {
1900             let v: Vec<int> = Vec::from_fn(5, |_| 5);
1901             assert!(v.as_slice() == [5, 5, 5, 5, 5]);
1902         })
1903     }
1904
1905     #[bench]
1906     fn bench_from_slice_0(b: &mut Bencher) {
1907         b.iter(|| {
1908             let v: Vec<int> = Vec::from_slice([]);
1909             assert!(v.as_slice() == []);
1910         })
1911     }
1912
1913     #[bench]
1914     fn bench_from_slice_5(b: &mut Bencher) {
1915         b.iter(|| {
1916             let v: Vec<int> = Vec::from_slice([1i, 2, 3, 4, 5]);
1917             assert!(v.as_slice() == [1, 2, 3, 4, 5]);
1918         })
1919     }
1920
1921     #[bench]
1922     fn bench_from_iter_0(b: &mut Bencher) {
1923         b.iter(|| {
1924             let v0: Vec<int> = vec!();
1925             let v1: Vec<int> = FromIterator::from_iter(v0.move_iter());
1926             assert!(v1.as_slice() == []);
1927         })
1928     }
1929
1930     #[bench]
1931     fn bench_from_iter_5(b: &mut Bencher) {
1932         b.iter(|| {
1933             let v0: Vec<int> = vec!(1, 2, 3, 4, 5);
1934             let v1: Vec<int> = FromIterator::from_iter(v0.move_iter());
1935             assert!(v1.as_slice() == [1, 2, 3, 4, 5]);
1936         })
1937     }
1938
1939     #[bench]
1940     fn bench_extend_0(b: &mut Bencher) {
1941         b.iter(|| {
1942             let v0: Vec<int> = vec!();
1943             let mut v1: Vec<int> = vec!(1, 2, 3, 4, 5);
1944             v1.extend(v0.move_iter());
1945             assert!(v1.as_slice() == [1, 2, 3, 4, 5]);
1946         })
1947     }
1948
1949     #[bench]
1950     fn bench_extend_5(b: &mut Bencher) {
1951         b.iter(|| {
1952             let v0: Vec<int> = vec!(1, 2, 3, 4, 5);
1953             let mut v1: Vec<int> = vec!(1, 2, 3, 4, 5);
1954             v1.extend(v0.move_iter());
1955             assert!(v1.as_slice() == [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]);
1956         })
1957     }
1958 }