}
}
+ /// Returns a place for insertion at the back of the `Vec`.
+ ///
+ /// Using this method with placement syntax is equivalent to [`push`](#method.push),
+ /// but may be more efficient.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// #![feature(collection_placement)]
+ /// #![feature(placement_in_syntax)]
+ ///
+ /// let mut vec = vec![1, 2];
+ /// vec.place_back() <- 3;
+ /// vec.place_back() <- 4;
+ /// assert_eq!(&vec, &[1, 2, 3, 4]);
+ /// ```
+ #[unstable(feature = "collection_placement",
+ reason = "placement protocol is subject to change",
+ issue = "30172")]
+ pub fn place_back(&mut self) -> PlaceBack<T> {
+ PlaceBack { vec: self }
+ }
+
/// Removes the last element from a vector and returns it, or [`None`] if it
/// is empty.
///
pub fn extend_from_slice(&mut self, other: &[T]) {
self.spec_extend(other.iter())
}
-
- /// Returns a place for insertion at the back of the `Vec`.
- ///
- /// Using this method with placement syntax is equivalent to [`push`](#method.push),
- /// but may be more efficient.
- ///
- /// # Examples
- ///
- /// ```
- /// #![feature(collection_placement)]
- /// #![feature(placement_in_syntax)]
- ///
- /// let mut vec = vec![1, 2];
- /// vec.place_back() <- 3;
- /// vec.place_back() <- 4;
- /// assert_eq!(&vec, &[1, 2, 3, 4]);
- /// ```
- #[unstable(feature = "collection_placement",
- reason = "placement protocol is subject to change",
- issue = "30172")]
- pub fn place_back(&mut self) -> PlaceBack<T> {
- PlaceBack { vec: self }
- }
}
// Set the length of the vec when the `SetLenOnDrop` value goes out of scope.
/// # Examples
///
/// ```
- ///# #![feature(vec_remove_item)]
+ /// # #![feature(vec_remove_item)]
/// let mut vec = vec![1, 2, 3, 1];
///
/// vec.remove_item(&1);
}
fn clone_from(&mut self, other: &Vec<T>) {
- // drop anything in self that will not be overwritten
- self.truncate(other.len());
- let len = self.len();
-
- // reuse the contained values' allocations/resources.
- self.clone_from_slice(&other[..len]);
-
- // self.len <= other.len due to the truncate above, so the
- // slice here is always in-bounds.
- self.extend_from_slice(&other[len..]);
+ other.as_slice().clone_into(self);
}
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
- let diff = (self.end as usize) - (self.ptr as usize);
- let size = mem::size_of::<T>();
- let exact = diff /
- (if size == 0 {
- 1
- } else {
- size
- });
+ let exact = match self.ptr.offset_to(self.end) {
+ Some(x) => x as usize,
+ None => (self.end as usize).wrapping_sub(self.ptr as usize),
+ };
(exact, Some(exact))
}