|
|
@ -127,7 +127,7 @@ impl<T> Vec<T> {
|
|
|
|
|
|
|
|
|
|
|
|
pub fn insert(&mut self, index: usize, elem: T) {
|
|
|
|
pub fn insert(&mut self, index: usize, elem: T) {
|
|
|
|
assert!(index <= self.len, "index out of bounds");
|
|
|
|
assert!(index <= self.len, "index out of bounds");
|
|
|
|
if self.cap() == self.len {
|
|
|
|
if self.len == self.cap() {
|
|
|
|
self.buf.grow();
|
|
|
|
self.buf.grow();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -138,14 +138,17 @@ impl<T> Vec<T> {
|
|
|
|
self.len - index,
|
|
|
|
self.len - index,
|
|
|
|
);
|
|
|
|
);
|
|
|
|
ptr::write(self.ptr().add(index), elem);
|
|
|
|
ptr::write(self.ptr().add(index), elem);
|
|
|
|
self.len += 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.len += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn remove(&mut self, index: usize) -> T {
|
|
|
|
pub fn remove(&mut self, index: usize) -> T {
|
|
|
|
assert!(index < self.len, "index out of bounds");
|
|
|
|
assert!(index < self.len, "index out of bounds");
|
|
|
|
unsafe {
|
|
|
|
|
|
|
|
self.len -= 1;
|
|
|
|
self.len -= 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsafe {
|
|
|
|
let result = ptr::read(self.ptr().add(index));
|
|
|
|
let result = ptr::read(self.ptr().add(index));
|
|
|
|
ptr::copy(
|
|
|
|
ptr::copy(
|
|
|
|
self.ptr().add(index + 1),
|
|
|
|
self.ptr().add(index + 1),
|
|
|
@ -157,8 +160,7 @@ impl<T> Vec<T> {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn drain(&mut self) -> Drain<T> {
|
|
|
|
pub fn drain(&mut self) -> Drain<T> {
|
|
|
|
unsafe {
|
|
|
|
let iter = unsafe { RawValIter::new(&self) };
|
|
|
|
let iter = RawValIter::new(&self);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// this is a mem::forget safety thing. If Drain is forgotten, we just
|
|
|
|
// this is a mem::forget safety thing. If Drain is forgotten, we just
|
|
|
|
// leak the whole Vec's contents. Also we need to do this *eventually*
|
|
|
|
// leak the whole Vec's contents. Also we need to do this *eventually*
|
|
|
@ -166,12 +168,11 @@ impl<T> Vec<T> {
|
|
|
|
self.len = 0;
|
|
|
|
self.len = 0;
|
|
|
|
|
|
|
|
|
|
|
|
Drain {
|
|
|
|
Drain {
|
|
|
|
iter: iter,
|
|
|
|
iter,
|
|
|
|
vec: PhantomData,
|
|
|
|
vec: PhantomData,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl<T> Drop for Vec<T> {
|
|
|
|
impl<T> Drop for Vec<T> {
|
|
|
|
fn drop(&mut self) {
|
|
|
|
fn drop(&mut self) {
|
|
|
@ -197,18 +198,18 @@ impl<T> IntoIterator for Vec<T> {
|
|
|
|
type Item = T;
|
|
|
|
type Item = T;
|
|
|
|
type IntoIter = IntoIter<T>;
|
|
|
|
type IntoIter = IntoIter<T>;
|
|
|
|
fn into_iter(self) -> IntoIter<T> {
|
|
|
|
fn into_iter(self) -> IntoIter<T> {
|
|
|
|
unsafe {
|
|
|
|
let (iter, buf) = unsafe {
|
|
|
|
let iter = RawValIter::new(&self);
|
|
|
|
(RawValIter::new(&self), ptr::read(&self.buf))
|
|
|
|
let buf = ptr::read(&self.buf);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
mem::forget(self);
|
|
|
|
mem::forget(self);
|
|
|
|
|
|
|
|
|
|
|
|
IntoIter {
|
|
|
|
IntoIter {
|
|
|
|
iter: iter,
|
|
|
|
iter,
|
|
|
|
_buf: buf,
|
|
|
|
_buf: buf,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct RawValIter<T> {
|
|
|
|
struct RawValIter<T> {
|
|
|
|
start: *const T,
|
|
|
|
start: *const T,
|
|
|
|