Skip to content

Commit bf222c8

Browse files
committed
libstd: Add some methods to Vec<T>.
1 parent 74bfa71 commit bf222c8

File tree

4 files changed

+66
-10
lines changed

4 files changed

+66
-10
lines changed

src/libstd/rt/local_heap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use rt::global_heap;
2121
use rt::local::Local;
2222
use rt::task::Task;
2323
use raw;
24-
use vec::ImmutableVector;
24+
use vec::{ImmutableVector, Vector};
2525
use vec_ng::Vec;
2626

2727
// This has no meaning with out rtdebug also turned on.

src/libstd/rt/logging.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use option::{Some, None, Option};
1616
use os;
1717
use rt::crate_map::{ModEntry, CrateMap, iter_crate_map, get_crate_map};
1818
use str::{Str, StrSlice};
19-
use vec::{ImmutableVector, MutableTotalOrdVector, OwnedVector};
19+
use vec::{ImmutableVector, MutableTotalOrdVector, OwnedVector, Vector};
2020
use vec_ng::Vec;
2121

2222
struct LogDirective<'a> {

src/libstd/str.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ use ptr::RawPtr;
101101
use from_str::FromStr;
102102
use vec;
103103
use vec::{OwnedVector, OwnedCloneableVector, ImmutableVector, MutableVector};
104+
use vec::{Vector};
104105
use vec_ng::Vec;
105106
use default::Default;
106107
use raw::Repr;

src/libstd/vec_ng.rs

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
#[doc(hidden)];
1313

1414
use cast::{forget, transmute};
15+
use cast;
1516
use clone::Clone;
16-
use cmp::{Ord, Eq, Ordering, TotalEq, TotalOrd};
17+
use cmp::{Eq, Equiv, Ord, Ordering, TotalEq, TotalOrd};
1718
use container::{Container, Mutable};
1819
use default::Default;
1920
use fmt;
@@ -30,7 +31,7 @@ use ptr;
3031
use rt::global_heap::{malloc_raw, realloc_raw};
3132
use raw::Slice;
3233
use vec::{ImmutableEqVector, ImmutableVector, Items, MutItems, MutableVector};
33-
use vec::{RevItems};
34+
use vec::{RevItems, Vector};
3435

3536
pub struct Vec<T> {
3637
priv len: uint,
@@ -184,6 +185,13 @@ impl<T: TotalOrd> TotalOrd for Vec<T> {
184185
}
185186
}
186187

188+
impl<'a,T:Eq,V:Vector<T>> Equiv<V> for Vec<T> {
189+
#[inline]
190+
fn equiv(&self, other: &V) -> bool {
191+
self.as_slice() == other.as_slice()
192+
}
193+
}
194+
187195
impl<T> Container for Vec<T> {
188196
#[inline]
189197
fn len(&self) -> uint {
@@ -280,12 +288,6 @@ impl<T> Vec<T> {
280288
self.len = len;
281289
}
282290

283-
#[inline]
284-
pub fn as_slice<'a>(&'a self) -> &'a [T] {
285-
let slice = Slice { data: self.ptr as *T, len: self.len };
286-
unsafe { transmute(slice) }
287-
}
288-
289291
#[inline]
290292
pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T] {
291293
let slice = Slice { data: self.ptr as *T, len: self.len };
@@ -455,6 +457,59 @@ impl<T> Mutable for Vec<T> {
455457
fn clear(&mut self) {
456458
self.truncate(0)
457459
}
460+
461+
#[inline]
462+
pub fn shift(&mut self) -> Option<T> {
463+
self.remove(0)
464+
}
465+
466+
#[inline]
467+
pub fn partition(self, f: |&T| -> bool) -> (Vec<T>, Vec<T>) {
468+
let mut lefts = Vec::new();
469+
let mut rights = Vec::new();
470+
471+
for elt in self.move_iter() {
472+
if f(&elt) {
473+
lefts.push(elt);
474+
} else {
475+
rights.push(elt);
476+
}
477+
}
478+
479+
(lefts, rights)
480+
}
481+
482+
pub fn remove(&mut self, i: uint) -> Option<T> {
483+
let len = self.len();
484+
if i < len {
485+
unsafe { // infallible
486+
// the place we are taking from.
487+
let ptr = self.as_mut_slice().as_mut_ptr().offset(i as int);
488+
// copy it out, unsafely having a copy of the value on
489+
// the stack and in the vector at the same time.
490+
let ret = Some(ptr::read(ptr as *T));
491+
492+
// Shift everything down to fill in that spot.
493+
ptr::copy_memory(ptr, &*ptr.offset(1), len - i - 1);
494+
self.set_len(len - 1);
495+
496+
ret
497+
}
498+
} else {
499+
None
500+
}
501+
}
502+
}
503+
504+
impl<T> Vector<T> for Vec<T> {
505+
/// Work with `self` as a slice.
506+
#[inline]
507+
fn as_slice<'a>(&'a self) -> &'a [T] {
508+
let slice = Slice { data: self.ptr as *T, len: self.len };
509+
unsafe {
510+
cast::transmute(slice)
511+
}
512+
}
458513
}
459514

460515
impl<T:Eq> Vec<T> {

0 commit comments

Comments
 (0)