Skip to content

Commit f6bd083

Browse files
authored
Minor improvements to Vec (#415)
1 parent 360a768 commit f6bd083

File tree

6 files changed

+59
-64
lines changed

6 files changed

+59
-64
lines changed

src/vec/vec-drain.md

+9-11
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ impl<T> IntoIterator for Vec<T> {
9393
mem::forget(self);
9494
9595
IntoIter {
96-
iter: iter,
96+
iter,
9797
_buf: buf,
9898
}
9999
}
@@ -135,18 +135,16 @@ impl<'a, T> Drop for Drain<'a, T> {
135135
136136
impl<T> Vec<T> {
137137
pub fn drain(&mut self) -> Drain<T> {
138-
unsafe {
139-
let iter = RawValIter::new(&self);
138+
let iter = unsafe { RawValIter::new(&self) };
140139
141-
// this is a mem::forget safety thing. If Drain is forgotten, we just
142-
// leak the whole Vec's contents. Also we need to do this *eventually*
143-
// anyway, so why not do it now?
144-
self.len = 0;
140+
// this is a mem::forget safety thing. If Drain is forgotten, we just
141+
// leak the whole Vec's contents. Also we need to do this *eventually*
142+
// anyway, so why not do it now?
143+
self.len = 0;
145144
146-
Drain {
147-
iter: iter,
148-
vec: PhantomData,
149-
}
145+
Drain {
146+
iter,
147+
vec: PhantomData,
150148
}
151149
}
152150
}

src/vec/vec-final.md

+22-21
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ impl<T> Vec<T> {
127127

128128
pub fn insert(&mut self, index: usize, elem: T) {
129129
assert!(index <= self.len, "index out of bounds");
130-
if self.cap() == self.len {
130+
if self.len == self.cap() {
131131
self.buf.grow();
132132
}
133133

@@ -138,14 +138,17 @@ impl<T> Vec<T> {
138138
self.len - index,
139139
);
140140
ptr::write(self.ptr().add(index), elem);
141-
self.len += 1;
142141
}
142+
143+
self.len += 1;
143144
}
144145

145146
pub fn remove(&mut self, index: usize) -> T {
146147
assert!(index < self.len, "index out of bounds");
148+
149+
self.len -= 1;
150+
147151
unsafe {
148-
self.len -= 1;
149152
let result = ptr::read(self.ptr().add(index));
150153
ptr::copy(
151154
self.ptr().add(index + 1),
@@ -157,18 +160,16 @@ impl<T> Vec<T> {
157160
}
158161

159162
pub fn drain(&mut self) -> Drain<T> {
160-
unsafe {
161-
let iter = RawValIter::new(&self);
163+
let iter = unsafe { RawValIter::new(&self) };
162164

163-
// this is a mem::forget safety thing. If Drain is forgotten, we just
164-
// leak the whole Vec's contents. Also we need to do this *eventually*
165-
// anyway, so why not do it now?
166-
self.len = 0;
165+
// this is a mem::forget safety thing. If Drain is forgotten, we just
166+
// leak the whole Vec's contents. Also we need to do this *eventually*
167+
// anyway, so why not do it now?
168+
self.len = 0;
167169

168-
Drain {
169-
iter: iter,
170-
vec: PhantomData,
171-
}
170+
Drain {
171+
iter,
172+
vec: PhantomData,
172173
}
173174
}
174175
}
@@ -197,15 +198,15 @@ impl<T> IntoIterator for Vec<T> {
197198
type Item = T;
198199
type IntoIter = IntoIter<T>;
199200
fn into_iter(self) -> IntoIter<T> {
200-
unsafe {
201-
let iter = RawValIter::new(&self);
202-
let buf = ptr::read(&self.buf);
203-
mem::forget(self);
201+
let (iter, buf) = unsafe {
202+
(RawValIter::new(&self), ptr::read(&self.buf))
203+
};
204204

205-
IntoIter {
206-
iter: iter,
207-
_buf: buf,
208-
}
205+
mem::forget(self);
206+
207+
IntoIter {
208+
iter,
209+
_buf: buf,
209210
}
210211
}
211212
}

src/vec/vec-insert-remove.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub fn insert(&mut self, index: usize, elem: T) {
1818
// Note: `<=` because it's valid to insert after everything
1919
// which would be equivalent to push.
2020
assert!(index <= self.len, "index out of bounds");
21-
if self.cap == self.len { self.grow(); }
21+
if self.len == self.cap { self.grow(); }
2222
2323
unsafe {
2424
// ptr::copy(src, dest, len): "copy from src to dest len elems"
@@ -28,8 +28,9 @@ pub fn insert(&mut self, index: usize, elem: T) {
2828
self.len - index,
2929
);
3030
ptr::write(self.ptr.as_ptr().add(index), elem);
31-
self.len += 1;
3231
}
32+
33+
self.len += 1;
3334
}
3435
```
3536

src/vec/vec-into-iter.md

+10-12
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,16 @@ impl<T> IntoIterator for Vec<T> {
6868
let cap = vec.cap;
6969
let len = vec.len;
7070
71-
unsafe {
72-
IntoIter {
73-
buf: ptr,
74-
cap: cap,
75-
start: ptr.as_ptr(),
76-
end: if cap == 0 {
77-
// can't offset off this pointer, it's not allocated!
78-
ptr.as_ptr()
79-
} else {
80-
ptr.as_ptr().add(len)
81-
},
82-
}
71+
IntoIter {
72+
buf: ptr,
73+
cap,
74+
start: ptr.as_ptr(),
75+
end: if cap == 0 {
76+
// can't offset off this pointer, it's not allocated!
77+
ptr.as_ptr()
78+
} else {
79+
unsafe { ptr.as_ptr().add(len) }
80+
},
8381
}
8482
}
8583
}

src/vec/vec-layout.md

-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ we get the same results as using `Unique<T>`:
4040

4141
```rust
4242
use std::ptr::NonNull;
43-
use std::marker::PhantomData;
4443

4544
pub struct Vec<T> {
4645
ptr: NonNull<T>,

src/vec/vec-raw.md

+15-17
Original file line numberDiff line numberDiff line change
@@ -131,23 +131,21 @@ impl<T> IntoIterator for Vec<T> {
131131
type Item = T;
132132
type IntoIter = IntoIter<T>;
133133
fn into_iter(self) -> IntoIter<T> {
134-
unsafe {
135-
// need to use ptr::read to unsafely move the buf out since it's
136-
// not Copy, and Vec implements Drop (so we can't destructure it).
137-
let buf = ptr::read(&self.buf);
138-
let len = self.len;
139-
mem::forget(self);
140-
141-
IntoIter {
142-
start: buf.ptr.as_ptr(),
143-
end: if buf.cap == 0 {
144-
// can't offset off of a pointer unless it's part of an allocation
145-
buf.ptr.as_ptr()
146-
} else {
147-
buf.ptr.as_ptr().add(len)
148-
},
149-
_buf: buf,
150-
}
134+
// need to use ptr::read to unsafely move the buf out since it's
135+
// not Copy, and Vec implements Drop (so we can't destructure it).
136+
let buf = unsafe { ptr::read(&self.buf) };
137+
let len = self.len;
138+
mem::forget(self);
139+
140+
IntoIter {
141+
start: buf.ptr.as_ptr(),
142+
end: if buf.cap == 0 {
143+
// can't offset off of a pointer unless it's part of an allocation
144+
buf.ptr.as_ptr()
145+
} else {
146+
unsafe { buf.ptr.as_ptr().add(len) }
147+
},
148+
_buf: buf,
151149
}
152150
}
153151
}

0 commit comments

Comments
 (0)