]> git.lizzy.rs Git - rust.git/commitdiff
collections: Move push/pop to MutableSeq
authorBrian Anderson <banderson@mozilla.com>
Fri, 11 Jul 2014 17:12:38 +0000 (10:12 -0700)
committerBrian Anderson <banderson@mozilla.com>
Wed, 23 Jul 2014 20:20:10 +0000 (13:20 -0700)
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]

31 files changed:
src/liballoc/arc.rs
src/libcollections/bitv.rs
src/libcollections/btree.rs
src/libcollections/dlist.rs
src/libcollections/hash/sip.rs
src/libcollections/lib.rs
src/libcollections/macros.rs
src/libcollections/priority_queue.rs
src/libcollections/ringbuf.rs
src/libcollections/slice.rs
src/libcollections/str.rs
src/libcollections/string.rs
src/libcollections/treemap.rs
src/libcollections/vec.rs
src/librustrt/at_exit_imp.rs
src/librustrt/local_data.rs
src/libstd/collections/mod.rs
src/libstd/dynamic_lib.rs
src/libstd/io/extensions.rs
src/libstd/io/fs.rs
src/libstd/io/signal.rs
src/libstd/lib.rs
src/libstd/macros.rs
src/libstd/num/strconv.rs
src/libstd/os.rs
src/libstd/path/mod.rs
src/libstd/path/posix.rs
src/libstd/path/windows.rs
src/libstd/prelude.rs
src/libsync/deque.rs
src/libsync/raw.rs

index 9b4f879e61ea4a8474cc172002d31e021b4b6bd6..27174de8e7416ae7c277ad99fdd3388492241655 100644 (file)
@@ -268,6 +268,7 @@ fn drop(&mut self) {
 #[allow(experimental)]
 mod tests {
     use std::clone::Clone;
+    use std::collections::MutableSeq;
     use std::comm::channel;
     use std::mem::drop;
     use std::ops::Drop;
index f1e9eabe8d1ede1a9fae8f4473243ffcef9c1b57..e7190a810e47f1ab525dde3ca4421b5c4d1a9ad6 100644 (file)
@@ -72,7 +72,7 @@
 use core::uint;
 use std::hash;
 
-use {Collection, Mutable, Set, MutableSet};
+use {Collection, Mutable, Set, MutableSet, MutableSeq};
 use vec::Vec;
 
 
index e4605527ce55011bc64aedf178de136acef067b9..096b0c7f5172c50cf6252bb2a4d0750226a62c1a 100644 (file)
@@ -24,7 +24,7 @@
 use core::fmt;
 use core::fmt::Show;
 
-use Collection;
+use {Collection, MutableSeq};
 use vec::Vec;
 
 #[allow(missing_doc)]
index 48ea1bd1c0150d72fcd641c600c88dfcac9f5ac5..24df95e77c4806bae25f3b71da014715af6f89f3 100644 (file)
@@ -30,7 +30,7 @@
 use core::mem;
 use core::ptr;
 
-use {Collection, Mutable, Deque};
+use {Collection, Mutable, Deque, MutableSeq};
 
 /// A doubly-linked list.
 pub struct DList<T> {
@@ -265,6 +265,11 @@ fn pop_back(&mut self) -> Option<T> {
     }
 }
 
+impl<T> MutableSeq<T> for DList<T> {
+    fn push(&mut self, elt: T) { self.push_back(elt) }
+    fn pop(&mut self) -> Option<T> { self.pop_back() }
+}
+
 impl<T> Default for DList<T> {
     #[inline]
     fn default() -> DList<T> { DList::new() }
@@ -719,7 +724,7 @@ mod tests {
     use test::Bencher;
     use test;
 
-    use Deque;
+    use {Deque, MutableSeq};
     use super::{DList, Node, ListInsertion};
     use vec::Vec;
 
index 7168af89b59ea36f600068c14b75ee559bd28299..485dc8c5959b74f3d5dae4650bd8451e8398fbcb 100644 (file)
@@ -281,6 +281,8 @@ mod tests {
     use super::super::{Hash, Writer};
     use super::{SipState, hash, hash_with_keys};
 
+    use MutableSeq;
+
     // Hash just the bytes of the slice, without length prefix
     struct Bytes<'a>(&'a [u8]);
 
index fba89df1bbc6b2555b9cbb75158d3f9f17866b2c..2b1d8b140ae5840cb2a15969a0deed4057cba8dd 100644 (file)
@@ -325,6 +325,11 @@ pub trait MutableSet<T>: Set<T> + Mutable {
     fn remove(&mut self, value: &T) -> bool;
 }
 
+pub trait MutableSeq<T>: Mutable {
+    fn push(&mut self, t: T);
+    fn pop(&mut self) -> Option<T>;
+}
+
 /// A double-ended sequence that allows querying, insertion and deletion at both
 /// ends.
 ///
@@ -384,7 +389,7 @@ pub trait MutableSet<T>: Set<T> + Mutable {
 ///     println!("{}", (f, b));
 /// }
 /// ```
-pub trait Deque<T> : Mutable {
+pub trait Deque<T> : MutableSeq<T> {
     /// Provide a reference to the front element, or `None` if the sequence is
     /// empty.
     ///
@@ -535,4 +540,8 @@ mod std {
     pub use core::clone;    // deriving(Clone)
     pub use core::cmp;      // deriving(Eq, Ord, etc.)
     pub use hash;           // deriving(Hash)
+
+    pub mod collections {
+        pub use MutableSeq;
+    }
 }
index db062a70bbb677fdbe03199c9057145a694129e4..0e4b46cfc56fbfae5bffebef959d8092f21b1426 100644 (file)
 #![macro_escape]
 
 /// Create a `std::vec::Vec` containing the arguments.
+#[cfg(not(test))]
 macro_rules! vec(
     ($($e:expr),*) => ({
+        #[allow(unused_imports)]
+        use std::collections::MutableSeq;
+
+        // leading _ to allow empty construction without a warning.
+        let mut _temp = ::vec::Vec::new();
+        $(_temp.push($e);)*
+        _temp
+    });
+    ($($e:expr),+,) => (vec!($($e),+))
+)
+
+#[cfg(test)]
+macro_rules! vec(
+    ($($e:expr),*) => ({
+        #[allow(unused_imports)]
+        use MutableSeq;
+
         // leading _ to allow empty construction without a warning.
         let mut _temp = ::vec::Vec::new();
         $(_temp.push($e);)*
index 9451f2521c89a67e263e7c269405be245cd14aa2..6e1a3ec1cb6c81d68ff4b7465fe0070fbed29f03 100644 (file)
 use core::mem::{zeroed, replace, swap};
 use core::ptr;
 
-use {Collection, Mutable};
+use {Collection, Mutable, MutableSeq};
 use slice;
 use vec::Vec;
 
@@ -388,6 +388,7 @@ mod tests {
 
     use priority_queue::PriorityQueue;
     use vec::Vec;
+    use MutableSeq;
 
     #[test]
     fn test_iterator() {
index 5e19accdd67152854d0bc355e3da11555b33ddb1..05dda93039861aa0910c72380676b9dd27d39951 100644 (file)
@@ -20,7 +20,7 @@
 use core::fmt;
 use core::iter::RandomAccessIterator;
 
-use {Deque, Collection, Mutable};
+use {Deque, Collection, Mutable, MutableSeq};
 use vec::Vec;
 
 static INITIAL_CAPACITY: uint = 8u; // 2^3
@@ -114,6 +114,11 @@ fn push_back(&mut self, t: T) {
     }
 }
 
+impl<T> MutableSeq<T> for RingBuf<T> {
+    fn push(&mut self, t: T) { self.push_back(t) }
+    fn pop(&mut self) -> Option<T> { self.pop_back() }
+}
+
 impl<T> Default for RingBuf<T> {
     #[inline]
     fn default() -> RingBuf<T> { RingBuf::new() }
index 6c3c8437e255a6c8845700a3c522c3163cfc77c3..64062dc0ccbf8abc2e4f62adbaf5c7ca923727ab 100644 (file)
 use core::ptr;
 use core::iter::{range_step, MultiplicativeIterator};
 
-use Collection;
+use {Collection, MutableSeq};
 use vec::Vec;
 
 pub use core::slice::{ref_slice, mut_ref_slice, Splits, Windows};
@@ -731,7 +731,7 @@ mod tests {
     use std::rt;
     use slice::*;
 
-    use Mutable;
+    use {Mutable, MutableSeq};
     use vec::Vec;
 
     fn square(n: uint) -> uint { n * n }
@@ -2133,6 +2133,7 @@ mod bench {
     use test::Bencher;
 
     use vec::Vec;
+    use MutableSeq;
 
     #[bench]
     fn iterator(b: &mut Bencher) {
index 48bc492e25ce4d591ed6af22fa8d52ba6ad7d2c9..653f6bae26c2bbc6a1a63c6dea23ddf136162d34 100644 (file)
@@ -77,7 +77,7 @@ fn main() {
 use core::iter::AdditiveIterator;
 use core::mem;
 
-use Collection;
+use {Collection, MutableSeq};
 use hash;
 use string::String;
 use unicode;
index b19bef685901fdea57a3e136bcade71c34e18646..10cc446abcdafb3b3d43485c9a43f4f494425843 100644 (file)
@@ -20,7 +20,7 @@
 use core::ptr;
 use core::raw::Slice;
 
-use {Collection, Mutable};
+use {Collection, Mutable, MutableSeq};
 use hash;
 use str;
 use str::{CharRange, StrAllocating, MaybeOwned, Owned, Slice};
index 8c24326c84092508c350161dd1dfda1c9c462296..124209ba52e2a01bda21aaa69c1d570e483d6d26 100644 (file)
@@ -40,7 +40,7 @@
 use core::ptr;
 use std::hash::{Writer, Hash};
 
-use {Collection, Mutable, Set, MutableSet, MutableMap, Map};
+use {Collection, Mutable, Set, MutableSet, MutableMap, Map, MutableSeq};
 use vec::Vec;
 
 // This is implemented as an AA tree, which is a simplified variation of
@@ -1127,7 +1127,7 @@ mod test_treemap {
     use std::rand::Rng;
     use std::rand;
 
-    use {Map, MutableMap, Mutable};
+    use {Map, MutableMap, Mutable, MutableSeq};
     use super::{TreeMap, TreeNode};
 
     #[test]
index 0002867495c78b9825263c08a24da25be3f0a05d..2338b5ff7e97af221c1cb78fd0ce99aab685221a 100644 (file)
@@ -23,7 +23,7 @@
 use core::ptr;
 use core::uint;
 
-use {Collection, Mutable};
+use {Collection, Mutable, MutableSeq};
 use slice::{MutableOrdVector, MutableVectorAllocating, CloneableVector};
 use slice::{Items, MutItems};
 
@@ -666,67 +666,6 @@ pub fn shrink_to_fit(&mut self) {
         }
     }
 
-    /// Remove the last element from a vector and return it, or `None` if it is
-    /// empty.
-    ///
-    /// # Example
-    ///
-    /// ```
-    /// let mut vec = vec![1i, 2, 3];
-    /// assert_eq!(vec.pop(), Some(3));
-    /// assert_eq!(vec, vec![1, 2]);
-    /// ```
-    #[inline]
-    pub fn pop(&mut self) -> Option<T> {
-        if self.len == 0 {
-            None
-        } else {
-            unsafe {
-                self.len -= 1;
-                Some(ptr::read(self.as_slice().unsafe_ref(self.len())))
-            }
-        }
-    }
-
-    /// Append an element to a vector.
-    ///
-    /// # Failure
-    ///
-    /// Fails if the number of elements in the vector overflows a `uint`.
-    ///
-    /// # Example
-    ///
-    /// ```
-    /// let mut vec = vec![1i, 2];
-    /// vec.push(3);
-    /// assert_eq!(vec, vec![1, 2, 3]);
-    /// ```
-    #[inline]
-    pub fn push(&mut self, value: T) {
-        if mem::size_of::<T>() == 0 {
-            // zero-size types consume no memory, so we can't rely on the address space running out
-            self.len = self.len.checked_add(&1).expect("length overflow");
-            unsafe { mem::forget(value); }
-            return
-        }
-        if self.len == self.cap {
-            let old_size = self.cap * mem::size_of::<T>();
-            let size = max(old_size, 2 * mem::size_of::<T>()) * 2;
-            if old_size > size { fail!("capacity overflow") }
-            unsafe {
-                self.ptr = alloc_or_realloc(self.ptr, size,
-                                            self.cap * mem::size_of::<T>());
-            }
-            self.cap = max(self.cap, 2) * 2;
-        }
-
-        unsafe {
-            let end = (self.ptr as *const T).offset(self.len as int) as *mut T;
-            ptr::write(&mut *end, value);
-            self.len += 1;
-        }
-    }
-
     /// Appends one element to the vector provided. The vector itself is then
     /// returned for use again.
     ///
@@ -1615,6 +1554,70 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
     }
 }
 
+impl<T> MutableSeq<T> for Vec<T> {
+    /// Append an element to a vector.
+    ///
+    /// # Failure
+    ///
+    /// Fails if the number of elements in the vector overflows a `uint`.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// let mut vec = vec!(1i, 2);
+    /// vec.push(3);
+    /// assert_eq!(vec, vec!(1, 2, 3));
+    /// ```
+    #[inline]
+    fn push(&mut self, value: T) {
+        if mem::size_of::<T>() == 0 {
+            // zero-size types consume no memory, so we can't rely on the address space running out
+            self.len = self.len.checked_add(&1).expect("length overflow");
+            unsafe { mem::forget(value); }
+            return
+        }
+        if self.len == self.cap {
+            let old_size = self.cap * mem::size_of::<T>();
+            let size = max(old_size, 2 * mem::size_of::<T>()) * 2;
+            if old_size > size { fail!("capacity overflow") }
+            unsafe {
+                self.ptr = alloc_or_realloc(self.ptr, size,
+                                            self.cap * mem::size_of::<T>());
+            }
+            self.cap = max(self.cap, 2) * 2;
+        }
+
+        unsafe {
+            let end = (self.ptr as *const T).offset(self.len as int) as *mut T;
+            ptr::write(&mut *end, value);
+            self.len += 1;
+        }
+    }
+
+    /// Remove the last element from a vector and return it, or `None` if it is
+    /// empty.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// let mut vec = vec!(1i, 2, 3);
+    /// assert_eq!(vec.pop(), Some(3));
+    /// assert_eq!(vec, vec!(1, 2));
+    /// ```
+    #[inline]
+    fn pop(&mut self) -> Option<T> {
+        if self.len == 0 {
+            None
+        } else {
+            unsafe {
+                self.len -= 1;
+                Some(ptr::read(self.as_slice().unsafe_ref(self.len())))
+            }
+        }
+    }
+
+}
+
 /// An iterator that moves out of a vector.
 pub struct MoveItems<T> {
     allocation: *mut T, // the block of memory allocated for the vector
@@ -1704,6 +1707,8 @@ mod tests {
     use test::Bencher;
     use super::{unzip, raw, Vec};
 
+    use MutableSeq;
+
     #[test]
     fn test_small_vec_struct() {
         assert!(size_of::<Vec<u8>>() == size_of::<uint>() * 3);
index 1faf492e498ace09860dd8fc0ccd65091c892a82..c9188e81975c614f9bcd93f384012d9841b03299 100644 (file)
@@ -15,6 +15,7 @@
 use core::prelude::*;
 
 use alloc::boxed::Box;
+use collections::MutableSeq;
 use collections::vec::Vec;
 use core::atomics;
 use core::mem;
index 7434951d3ee9166db99cd67c3502b862dd1ab8f7..b7366f440d0348ace6c011cd5aa81b359b384cc8 100644 (file)
@@ -41,6 +41,7 @@
 use core::prelude::*;
 
 use alloc::boxed::Box;
+use collections::MutableSeq;
 use collections::vec::Vec;
 use core::kinds::marker;
 use core::mem;
index ccef1c0fd2adb80331da2b646ff06de772ffba05..d98d490a84b2741edf740cfac18235c007dd5ba8 100644 (file)
@@ -15,7 +15,7 @@
 #![experimental]
 
 pub use core_collections::{Collection, Mutable, Map, MutableMap};
-pub use core_collections::{Set, MutableSet, Deque};
+pub use core_collections::{Set, MutableSet, Deque, MutableSeq};
 pub use core_collections::{Bitv, BitvSet, BTree, DList, EnumSet};
 pub use core_collections::{PriorityQueue, RingBuf, SmallIntMap};
 pub use core_collections::{TreeMap, TreeSet, TrieMap, TrieSet};
index 86283f03381dd1c68d4c7130f49bd726c57ff3f1..5980245fa79a24e53f445b0192e920a67b8b01bf 100644 (file)
@@ -20,6 +20,7 @@
 #![allow(missing_doc)]
 
 use clone::Clone;
+use collections::MutableSeq;
 use c_str::ToCStr;
 use iter::Iterator;
 use mem;
index ca3eee01575fd3aca54bbddd85bb875925a0a69b..5215aec5dfbfa6e314bd481a22169e3f978cea25 100644 (file)
@@ -15,7 +15,7 @@
 // FIXME: Not sure how this should be structured
 // FIXME: Iteration should probably be considered separately
 
-use collections::Collection;
+use collections::{Collection, MutableSeq};
 use iter::Iterator;
 use option::{Option, Some, None};
 use result::{Ok, Err};
index afd88ee0ed91b05d93369480c508eb5e1ae7a08d..c7dec49a76d1fe0f2b82568300b81ab11488a1dc 100644 (file)
@@ -53,7 +53,7 @@
 
 use c_str::ToCStr;
 use clone::Clone;
-use collections::Collection;
+use collections::{Collection, MutableSeq};
 use io::standard_error;
 use io::{FilePermission, Write, UnstableFileStat, Open, FileAccess, FileMode};
 use io::{IoResult, IoError, FileStat, SeekStyle, Seek, Writer, Reader};
index d46f437cddd50a500badf5021657b7528866b4b7..c126866e7159ae67f1d33f84af6bbd25923912df 100644 (file)
@@ -20,6 +20,7 @@
 */
 
 use clone::Clone;
+use collections::MutableSeq;
 use comm::{Sender, Receiver, channel};
 use io;
 use iter::Iterator;
index e14092bc8dc1604e04b29883d24396bf480b95fa..125c3fdf5d90c02b0f2dfc6614d0bb33c5038c7f 100644 (file)
@@ -288,4 +288,6 @@ mod std {
     #[cfg(test)] pub use os = realstd::os;
     // The test runner requires std::slice::Vector, so re-export std::slice just for it.
     #[cfg(test)] pub use slice;
+
+    pub use collections; // vec!() uses MutableSeq
 }
index 3c6c860f516bb63c8c5cd4724a02af5285fc60a0..6de6b9d680f7556b39d4cbcc6d8ea6edb645e3b7 100644 (file)
@@ -315,6 +315,9 @@ macro_rules! try(
 #[macro_export]
 macro_rules! vec(
     ($($e:expr),*) => ({
+        #[allow(unused_imports)]
+        use std::collections::MutableSeq;
+
         // leading _ to allow empty construction without a warning.
         let mut _temp = ::std::vec::Vec::new();
         $(_temp.push($e);)*
index cc30acf064b8257fac2db9f8b0907684d0c5a6f0..c8528e752e89a114ebca84ad381bcedf3fddb89b 100644 (file)
@@ -14,7 +14,7 @@
 
 use char;
 use clone::Clone;
-use collections::Collection;
+use collections::{Collection, MutableSeq};
 use num::{NumCast, Zero, One, cast, Int};
 use num::{Float, FPNaN, FPInfinite, ToPrimitive};
 use num;
index 96d3b3e3e6a5390fed602624e6ccbe32ce2aad12..f71f1d22d009d0f95e07d1d15f7c4576c542a6ac 100644 (file)
@@ -32,7 +32,7 @@
 #![allow(non_snake_case_functions)]
 
 use clone::Clone;
-use collections::Collection;
+use collections::{Collection, MutableSeq};
 use fmt;
 use io::{IoResult, IoError};
 use iter::Iterator;
index ececfab5f743301a4e241b1cf85da2b3ab9e1161..0c93f8e6de979cde2a8cee3e15a80982e83c48e7 100644 (file)
@@ -65,7 +65,7 @@
 
 #![experimental]
 
-use collections::Collection;
+use collections::{Collection, MutableSeq};
 use c_str::CString;
 use clone::Clone;
 use fmt;
index 007686aa05cd5865cf03a4f4d52344653ff462df..877ca2c7e013fa03135f6878ed7a0d8b108b05c3 100644 (file)
@@ -13,7 +13,7 @@
 use c_str::{CString, ToCStr};
 use clone::Clone;
 use cmp::{PartialEq, Eq, PartialOrd, Ord, Ordering};
-use collections::Collection;
+use collections::{Collection, MutableSeq};
 use from_str::FromStr;
 use hash;
 use io::Writer;
index 4a6ed5612334c5bf9c4ebd87d928bf79fdf28410..d9b802b38fdeb4840e7e31351f5bc5c551868b60 100644 (file)
@@ -16,7 +16,7 @@
 use c_str::{CString, ToCStr};
 use clone::Clone;
 use cmp::{PartialEq, Eq, PartialOrd, Ord, Ordering};
-use collections::Collection;
+use collections::{Collection, MutableSeq};
 use from_str::FromStr;
 use hash;
 use io::Writer;
index 0fa223305a669d36fb929c9896d864e85768e9bd..0ce7497cf300e7ef3776cb2603ef963fa59e57ed 100644 (file)
@@ -63,7 +63,7 @@
 #[doc(no_inline)] pub use clone::Clone;
 #[doc(no_inline)] pub use cmp::{PartialEq, PartialOrd, Eq, Ord};
 #[doc(no_inline)] pub use cmp::{Ordering, Less, Equal, Greater, Equiv};
-#[doc(no_inline)] pub use collections::{Collection, Mutable, Map, MutableMap};
+#[doc(no_inline)] pub use collections::{Collection, Mutable, Map, MutableMap, MutableSeq};
 #[doc(no_inline)] pub use collections::{Set, MutableSet};
 #[doc(no_inline)] pub use iter::{FromIterator, Extendable, ExactSize};
 #[doc(no_inline)] pub use iter::{Iterator, DoubleEndedIterator};
index 913a58010d496b9db4c010e393a048a93ce07056..c541cc02774e0d3f5d4e503cc23970b992757156 100644 (file)
@@ -55,7 +55,7 @@
 use alloc::arc::Arc;
 use alloc::heap::{allocate, deallocate};
 use alloc::boxed::Box;
-use collections::Vec;
+use collections::{Vec, MutableSeq};
 use core::kinds::marker;
 use core::mem::{forget, min_align_of, size_of, transmute};
 use core::ptr;
index d056566bb9a97908a61b134f1fe80cabe1c802c0..1bdf24ea7dd5166ad7d0ab006a1b4e228d73f837 100644 (file)
@@ -22,7 +22,7 @@
 use core::kinds::marker;
 use core::mem;
 use core::ty::Unsafe;
-use collections::Vec;
+use collections::{Vec, MutableSeq};
 
 use mutex;
 use comm::{Receiver, Sender, channel};