Skip to content

Commit d36a8f3

Browse files
committed
collections: Move push/pop to MutableSeq
Implement for Vec, DList, RingBuf. Add MutableSeq to the prelude. Since the collections traits are in the prelude most consumers of these methods will continue to work without change. [breaking-change]
1 parent c080d26 commit d36a8f3

31 files changed

+142
-86
lines changed

src/liballoc/arc.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ impl<T: Share + Send> Drop for Weak<T> {
268268
#[allow(experimental)]
269269
mod tests {
270270
use std::clone::Clone;
271+
use std::collections::MutableSeq;
271272
use std::comm::channel;
272273
use std::mem::drop;
273274
use std::ops::Drop;

src/libcollections/bitv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ use core::slice;
7272
use core::uint;
7373
use std::hash;
7474

75-
use {Collection, Mutable, Set, MutableSet};
75+
use {Collection, Mutable, Set, MutableSet, MutableSeq};
7676
use vec::Vec;
7777

7878

src/libcollections/btree.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use alloc::boxed::Box;
2424
use core::fmt;
2525
use core::fmt::Show;
2626

27-
use Collection;
27+
use {Collection, MutableSeq};
2828
use vec::Vec;
2929

3030
#[allow(missing_doc)]

src/libcollections/dlist.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use core::iter;
3030
use core::mem;
3131
use core::ptr;
3232

33-
use {Collection, Mutable, Deque};
33+
use {Collection, Mutable, Deque, MutableSeq};
3434

3535
/// A doubly-linked list.
3636
pub struct DList<T> {
@@ -265,6 +265,11 @@ impl<T> Deque<T> for DList<T> {
265265
}
266266
}
267267

268+
impl<T> MutableSeq<T> for DList<T> {
269+
fn push(&mut self, elt: T) { self.push_back(elt) }
270+
fn pop(&mut self) -> Option<T> { self.pop_back() }
271+
}
272+
268273
impl<T> Default for DList<T> {
269274
#[inline]
270275
fn default() -> DList<T> { DList::new() }
@@ -719,7 +724,7 @@ mod tests {
719724
use test::Bencher;
720725
use test;
721726

722-
use Deque;
727+
use {Deque, MutableSeq};
723728
use super::{DList, Node, ListInsertion};
724729
use vec::Vec;
725730

src/libcollections/hash/sip.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,8 @@ mod tests {
281281
use super::super::{Hash, Writer};
282282
use super::{SipState, hash, hash_with_keys};
283283

284+
use MutableSeq;
285+
284286
// Hash just the bytes of the slice, without length prefix
285287
struct Bytes<'a>(&'a [u8]);
286288

src/libcollections/lib.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,11 @@ pub trait MutableSet<T>: Set<T> + Mutable {
325325
fn remove(&mut self, value: &T) -> bool;
326326
}
327327

328+
pub trait MutableSeq<T>: Mutable {
329+
fn push(&mut self, t: T);
330+
fn pop(&mut self) -> Option<T>;
331+
}
332+
328333
/// A double-ended sequence that allows querying, insertion and deletion at both
329334
/// ends.
330335
///
@@ -384,7 +389,7 @@ pub trait MutableSet<T>: Set<T> + Mutable {
384389
/// println!("{}", (f, b));
385390
/// }
386391
/// ```
387-
pub trait Deque<T> : Mutable {
392+
pub trait Deque<T> : MutableSeq<T> {
388393
/// Provide a reference to the front element, or `None` if the sequence is
389394
/// empty.
390395
///
@@ -535,4 +540,8 @@ mod std {
535540
pub use core::clone; // deriving(Clone)
536541
pub use core::cmp; // deriving(Eq, Ord, etc.)
537542
pub use hash; // deriving(Hash)
543+
544+
pub mod collections {
545+
pub use MutableSeq;
546+
}
538547
}

src/libcollections/macros.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,26 @@
1111
#![macro_escape]
1212

1313
/// Create a `std::vec::Vec` containing the arguments.
14+
#[cfg(not(test))]
1415
macro_rules! vec(
1516
($($e:expr),*) => ({
17+
#[allow(unused_imports)]
18+
use std::collections::MutableSeq;
19+
20+
// leading _ to allow empty construction without a warning.
21+
let mut _temp = ::vec::Vec::new();
22+
$(_temp.push($e);)*
23+
_temp
24+
});
25+
($($e:expr),+,) => (vec!($($e),+))
26+
)
27+
28+
#[cfg(test)]
29+
macro_rules! vec(
30+
($($e:expr),*) => ({
31+
#[allow(unused_imports)]
32+
use MutableSeq;
33+
1634
// leading _ to allow empty construction without a warning.
1735
let mut _temp = ::vec::Vec::new();
1836
$(_temp.push($e);)*

src/libcollections/priority_queue.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ use core::default::Default;
154154
use core::mem::{zeroed, replace, swap};
155155
use core::ptr;
156156

157-
use {Collection, Mutable};
157+
use {Collection, Mutable, MutableSeq};
158158
use slice;
159159
use vec::Vec;
160160

@@ -388,6 +388,7 @@ mod tests {
388388

389389
use priority_queue::PriorityQueue;
390390
use vec::Vec;
391+
use MutableSeq;
391392

392393
#[test]
393394
fn test_iterator() {

src/libcollections/ringbuf.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use core::default::Default;
2020
use core::fmt;
2121
use core::iter::RandomAccessIterator;
2222

23-
use {Deque, Collection, Mutable};
23+
use {Deque, Collection, Mutable, MutableSeq};
2424
use vec::Vec;
2525

2626
static INITIAL_CAPACITY: uint = 8u; // 2^3
@@ -114,6 +114,11 @@ impl<T> Deque<T> for RingBuf<T> {
114114
}
115115
}
116116

117+
impl<T> MutableSeq<T> for RingBuf<T> {
118+
fn push(&mut self, t: T) { self.push_back(t) }
119+
fn pop(&mut self) -> Option<T> { self.pop_back() }
120+
}
121+
117122
impl<T> Default for RingBuf<T> {
118123
#[inline]
119124
fn default() -> RingBuf<T> { RingBuf::new() }

src/libcollections/slice.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ use core::mem;
107107
use core::ptr;
108108
use core::iter::{range_step, MultiplicativeIterator};
109109

110-
use Collection;
110+
use {Collection, MutableSeq};
111111
use vec::Vec;
112112

113113
pub use core::slice::{ref_slice, mut_ref_slice, Splits, Windows};
@@ -731,7 +731,7 @@ mod tests {
731731
use std::rt;
732732
use slice::*;
733733

734-
use Mutable;
734+
use {Mutable, MutableSeq};
735735
use vec::Vec;
736736

737737
fn square(n: uint) -> uint { n * n }
@@ -2133,6 +2133,7 @@ mod bench {
21332133
use test::Bencher;
21342134

21352135
use vec::Vec;
2136+
use MutableSeq;
21362137

21372138
#[bench]
21382139
fn iterator(b: &mut Bencher) {

src/libcollections/str.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ use core::cmp;
7777
use core::iter::AdditiveIterator;
7878
use core::mem;
7979

80-
use Collection;
80+
use {Collection, MutableSeq};
8181
use hash;
8282
use string::String;
8383
use unicode;

src/libcollections/string.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use core::mem;
2020
use core::ptr;
2121
use core::raw::Slice;
2222

23-
use {Collection, Mutable};
23+
use {Collection, Mutable, MutableSeq};
2424
use hash;
2525
use str;
2626
use str::{CharRange, StrAllocating, MaybeOwned, Owned, Slice};

src/libcollections/treemap.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ use core::mem::{replace, swap};
4040
use core::ptr;
4141
use std::hash::{Writer, Hash};
4242

43-
use {Collection, Mutable, Set, MutableSet, MutableMap, Map};
43+
use {Collection, Mutable, Set, MutableSet, MutableMap, Map, MutableSeq};
4444
use vec::Vec;
4545

4646
// This is implemented as an AA tree, which is a simplified variation of
@@ -1127,7 +1127,7 @@ mod test_treemap {
11271127
use std::rand::Rng;
11281128
use std::rand;
11291129

1130-
use {Map, MutableMap, Mutable};
1130+
use {Map, MutableMap, Mutable, MutableSeq};
11311131
use super::{TreeMap, TreeNode};
11321132

11331133
#[test]

src/libcollections/vec.rs

Lines changed: 67 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use core::num;
2323
use core::ptr;
2424
use core::uint;
2525

26-
use {Collection, Mutable};
26+
use {Collection, Mutable, MutableSeq};
2727
use slice::{MutableOrdVector, MutableVectorAllocating, CloneableVector};
2828
use slice::{Items, MutItems};
2929

@@ -666,67 +666,6 @@ impl<T> Vec<T> {
666666
}
667667
}
668668

669-
/// Remove the last element from a vector and return it, or `None` if it is
670-
/// empty.
671-
///
672-
/// # Example
673-
///
674-
/// ```
675-
/// let mut vec = vec![1i, 2, 3];
676-
/// assert_eq!(vec.pop(), Some(3));
677-
/// assert_eq!(vec, vec![1, 2]);
678-
/// ```
679-
#[inline]
680-
pub fn pop(&mut self) -> Option<T> {
681-
if self.len == 0 {
682-
None
683-
} else {
684-
unsafe {
685-
self.len -= 1;
686-
Some(ptr::read(self.as_slice().unsafe_ref(self.len())))
687-
}
688-
}
689-
}
690-
691-
/// Append an element to a vector.
692-
///
693-
/// # Failure
694-
///
695-
/// Fails if the number of elements in the vector overflows a `uint`.
696-
///
697-
/// # Example
698-
///
699-
/// ```
700-
/// let mut vec = vec![1i, 2];
701-
/// vec.push(3);
702-
/// assert_eq!(vec, vec![1, 2, 3]);
703-
/// ```
704-
#[inline]
705-
pub fn push(&mut self, value: T) {
706-
if mem::size_of::<T>() == 0 {
707-
// zero-size types consume no memory, so we can't rely on the address space running out
708-
self.len = self.len.checked_add(&1).expect("length overflow");
709-
unsafe { mem::forget(value); }
710-
return
711-
}
712-
if self.len == self.cap {
713-
let old_size = self.cap * mem::size_of::<T>();
714-
let size = max(old_size, 2 * mem::size_of::<T>()) * 2;
715-
if old_size > size { fail!("capacity overflow") }
716-
unsafe {
717-
self.ptr = alloc_or_realloc(self.ptr, size,
718-
self.cap * mem::size_of::<T>());
719-
}
720-
self.cap = max(self.cap, 2) * 2;
721-
}
722-
723-
unsafe {
724-
let end = (self.ptr as *const T).offset(self.len as int) as *mut T;
725-
ptr::write(&mut *end, value);
726-
self.len += 1;
727-
}
728-
}
729-
730669
/// Appends one element to the vector provided. The vector itself is then
731670
/// returned for use again.
732671
///
@@ -1615,6 +1554,70 @@ impl<T:fmt::Show> fmt::Show for Vec<T> {
16151554
}
16161555
}
16171556

1557+
impl<T> MutableSeq<T> for Vec<T> {
1558+
/// Append an element to a vector.
1559+
///
1560+
/// # Failure
1561+
///
1562+
/// Fails if the number of elements in the vector overflows a `uint`.
1563+
///
1564+
/// # Example
1565+
///
1566+
/// ```rust
1567+
/// let mut vec = vec!(1i, 2);
1568+
/// vec.push(3);
1569+
/// assert_eq!(vec, vec!(1, 2, 3));
1570+
/// ```
1571+
#[inline]
1572+
fn push(&mut self, value: T) {
1573+
if mem::size_of::<T>() == 0 {
1574+
// zero-size types consume no memory, so we can't rely on the address space running out
1575+
self.len = self.len.checked_add(&1).expect("length overflow");
1576+
unsafe { mem::forget(value); }
1577+
return
1578+
}
1579+
if self.len == self.cap {
1580+
let old_size = self.cap * mem::size_of::<T>();
1581+
let size = max(old_size, 2 * mem::size_of::<T>()) * 2;
1582+
if old_size > size { fail!("capacity overflow") }
1583+
unsafe {
1584+
self.ptr = alloc_or_realloc(self.ptr, size,
1585+
self.cap * mem::size_of::<T>());
1586+
}
1587+
self.cap = max(self.cap, 2) * 2;
1588+
}
1589+
1590+
unsafe {
1591+
let end = (self.ptr as *const T).offset(self.len as int) as *mut T;
1592+
ptr::write(&mut *end, value);
1593+
self.len += 1;
1594+
}
1595+
}
1596+
1597+
/// Remove the last element from a vector and return it, or `None` if it is
1598+
/// empty.
1599+
///
1600+
/// # Example
1601+
///
1602+
/// ```rust
1603+
/// let mut vec = vec!(1i, 2, 3);
1604+
/// assert_eq!(vec.pop(), Some(3));
1605+
/// assert_eq!(vec, vec!(1, 2));
1606+
/// ```
1607+
#[inline]
1608+
fn pop(&mut self) -> Option<T> {
1609+
if self.len == 0 {
1610+
None
1611+
} else {
1612+
unsafe {
1613+
self.len -= 1;
1614+
Some(ptr::read(self.as_slice().unsafe_ref(self.len())))
1615+
}
1616+
}
1617+
}
1618+
1619+
}
1620+
16181621
/// An iterator that moves out of a vector.
16191622
pub struct MoveItems<T> {
16201623
allocation: *mut T, // the block of memory allocated for the vector
@@ -1704,6 +1707,8 @@ mod tests {
17041707
use test::Bencher;
17051708
use super::{unzip, raw, Vec};
17061709

1710+
use MutableSeq;
1711+
17071712
#[test]
17081713
fn test_small_vec_struct() {
17091714
assert!(size_of::<Vec<u8>>() == size_of::<uint>() * 3);

src/librustrt/at_exit_imp.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use core::prelude::*;
1616

1717
use alloc::boxed::Box;
18+
use collections::MutableSeq;
1819
use collections::vec::Vec;
1920
use core::atomics;
2021
use core::mem;

src/librustrt/local_data.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ assert_eq!(*key_vector.get().unwrap(), vec![4]);
4141
use core::prelude::*;
4242

4343
use alloc::boxed::Box;
44+
use collections::MutableSeq;
4445
use collections::vec::Vec;
4546
use core::kinds::marker;
4647
use core::mem;

0 commit comments

Comments
 (0)