From b36ed7d2edf68453c0344eb3cd55281e48c96ecb Mon Sep 17 00:00:00 2001 From: Johannes Oertel Date: Wed, 3 Jun 2015 12:38:42 +0200 Subject: [PATCH] Implement RFC 839 Closes #25976. --- src/libcollections/binary_heap.rs | 7 +++++++ src/libcollections/bit.rs | 14 ++++++++++++++ src/libcollections/btree/map.rs | 7 +++++++ src/libcollections/btree/set.rs | 7 +++++++ src/libcollections/enum_set.rs | 7 +++++++ src/libcollections/linked_list.rs | 7 +++++++ src/libcollections/string.rs | 7 +++++++ src/libcollections/vec.rs | 7 +++++++ src/libcollections/vec_deque.rs | 7 +++++++ src/libcollections/vec_map.rs | 7 +++++++ src/libcollectionstest/binary_heap.rs | 25 ++++++++++++++++++++++++ src/libcollectionstest/bit/set.rs | 20 +++++++++++++++++++ src/libcollectionstest/bit/vec.rs | 18 +++++++++++++++++ src/libcollectionstest/btree/map.rs | 16 +++++++++++++++ src/libcollectionstest/btree/set.rs | 28 +++++++++++++++++++++++++++ src/libcollectionstest/enum_set.rs | 22 +++++++++++++++++++++ src/libcollectionstest/linked_list.rs | 19 ++++++++++++++++++ src/libcollectionstest/string.rs | 8 ++++++++ src/libcollectionstest/vec.rs | 15 ++++++++++++++ src/libcollectionstest/vec_deque.rs | 26 +++++++++++++++++++++++++ src/libcollectionstest/vec_map.rs | 16 +++++++++++++++ src/librustdoc/html/render.rs | 2 +- 22 files changed, 291 insertions(+), 1 deletion(-) diff --git a/src/libcollections/binary_heap.rs b/src/libcollections/binary_heap.rs index 00e4002f82f4f..97bdd8e6a6ef5 100644 --- a/src/libcollections/binary_heap.rs +++ b/src/libcollections/binary_heap.rs @@ -760,3 +760,10 @@ impl Extend for BinaryHeap { } } } + +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a, T: 'a + Ord + Copy> Extend<&'a T> for BinaryHeap { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } +} diff --git a/src/libcollections/bit.rs b/src/libcollections/bit.rs index c06cbdb4179d5..37797425e7ad2 100644 --- a/src/libcollections/bit.rs +++ b/src/libcollections/bit.rs @@ -1070,6 +1070,13 @@ impl Extend for BitVec { } } +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a> Extend<&'a bool> for BitVec { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl Clone for BitVec { #[inline] @@ -1278,6 +1285,13 @@ impl Extend for BitSet { } } +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a> Extend<&'a usize> for BitSet { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl PartialOrd for BitSet { #[inline] diff --git a/src/libcollections/btree/map.rs b/src/libcollections/btree/map.rs index 11f16e2f400b4..c7c336e38a1c8 100644 --- a/src/libcollections/btree/map.rs +++ b/src/libcollections/btree/map.rs @@ -879,6 +879,13 @@ impl Extend<(K, V)> for BTreeMap { } } +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a, K: Ord + Copy, V: Copy> Extend<(&'a K, &'a V)> for BTreeMap { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().map(|(&key, &value)| (key, value))); + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl Hash for BTreeMap { fn hash(&self, state: &mut H) { diff --git a/src/libcollections/btree/set.rs b/src/libcollections/btree/set.rs index a3b9320e2b521..ec6c5e63e2daf 100644 --- a/src/libcollections/btree/set.rs +++ b/src/libcollections/btree/set.rs @@ -509,6 +509,13 @@ impl Extend for BTreeSet { } } +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a, T: 'a + Ord + Copy> Extend<&'a T> for BTreeSet { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl Default for BTreeSet { #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/libcollections/enum_set.rs b/src/libcollections/enum_set.rs index e6cdb88d3e174..ad90f9f1caa9c 100644 --- a/src/libcollections/enum_set.rs +++ b/src/libcollections/enum_set.rs @@ -288,3 +288,10 @@ impl Extend for EnumSet { } } } + +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a, E: 'a + CLike + Copy> Extend<&'a E> for EnumSet { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } +} diff --git a/src/libcollections/linked_list.rs b/src/libcollections/linked_list.rs index 61ebf7f6df91c..e47892f44545f 100644 --- a/src/libcollections/linked_list.rs +++ b/src/libcollections/linked_list.rs @@ -871,6 +871,13 @@ impl Extend for LinkedList { } } +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a, T: 'a + Copy> Extend<&'a T> for LinkedList { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl PartialEq for LinkedList { fn eq(&self, other: &LinkedList) -> bool { diff --git a/src/libcollections/string.rs b/src/libcollections/string.rs index c328a58f0770e..d0f59cbf0470e 100644 --- a/src/libcollections/string.rs +++ b/src/libcollections/string.rs @@ -793,6 +793,13 @@ impl Extend for String { } } +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a> Extend<&'a char> for String { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl<'a> Extend<&'a str> for String { fn extend>(&mut self, iterable: I) { diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index 8dacfa53bc980..7ce4bd546b97c 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -1578,6 +1578,13 @@ impl Extend for Vec { } } +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a, T: 'a + Copy> Extend<&'a T> for Vec { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } +} + __impl_slice_eq1! { Vec, Vec } __impl_slice_eq1! { Vec, &'b [B] } __impl_slice_eq1! { Vec, &'b mut [B] } diff --git a/src/libcollections/vec_deque.rs b/src/libcollections/vec_deque.rs index 0bc42bd2c7e02..88d0a96b78cc7 100644 --- a/src/libcollections/vec_deque.rs +++ b/src/libcollections/vec_deque.rs @@ -1785,6 +1785,13 @@ impl Extend for VecDeque { } } +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a, T: 'a + Copy> Extend<&'a T> for VecDeque { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl fmt::Debug for VecDeque { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { diff --git a/src/libcollections/vec_map.rs b/src/libcollections/vec_map.rs index aa0ab41b7455b..8180f1d56df12 100644 --- a/src/libcollections/vec_map.rs +++ b/src/libcollections/vec_map.rs @@ -828,6 +828,13 @@ impl Extend<(usize, V)> for VecMap { } } +#[stable(feature = "extend_ref", since = "1.2.0")] +impl<'a, V: Copy> Extend<(usize, &'a V)> for VecMap { + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().map(|(key, &value)| (key, value))); + } +} + impl Index for VecMap { type Output = V; diff --git a/src/libcollectionstest/binary_heap.rs b/src/libcollectionstest/binary_heap.rs index 47a366bb1e2e0..303a0ce811df6 100644 --- a/src/libcollectionstest/binary_heap.rs +++ b/src/libcollectionstest/binary_heap.rs @@ -217,3 +217,28 @@ fn test_drain() { assert!(q.is_empty()); } + +#[test] +fn test_extend_ref() { + let mut a = BinaryHeap::new(); + a.push(1); + a.push(2); + + a.extend(&[3, 4, 5]); + + assert_eq!(a.len(), 5); + assert_eq!(a.into_sorted_vec(), [1, 2, 3, 4, 5]); + + let mut a = BinaryHeap::new(); + a.push(1); + a.push(2); + let mut b = BinaryHeap::new(); + b.push(3); + b.push(4); + b.push(5); + + a.extend(&b); + + assert_eq!(a.len(), 5); + assert_eq!(a.into_sorted_vec(), [1, 2, 3, 4, 5]); +} diff --git a/src/libcollectionstest/bit/set.rs b/src/libcollectionstest/bit/set.rs index e6aa15608f03e..8ab3eff0f4f64 100644 --- a/src/libcollectionstest/bit/set.rs +++ b/src/libcollectionstest/bit/set.rs @@ -448,6 +448,26 @@ fn test_bit_set_split_off() { 0b00101011, 0b10101101]))); } +#[test] +fn test_bit_set_extend_ref() { + let mut a = BitSet::new(); + a.insert(3); + + a.extend(&[5, 7, 10]); + + assert_eq!(a.len(), 4); + assert_eq!(a, BitSet::from_bit_vec(BitVec::from_bytes(&[0b00010101,0b00100000]))); + + let mut b = BitSet::new(); + b.insert(11); + b.insert(15); + + a.extend(&b); + + assert_eq!(a.len(), 6); + assert_eq!(a, BitSet::from_bit_vec(BitVec::from_bytes(&[0b00010101,0b00110001]))); +} + mod bench { use std::collections::{BitSet, BitVec}; use std::__rand::{Rng, thread_rng, ThreadRng}; diff --git a/src/libcollectionstest/bit/vec.rs b/src/libcollectionstest/bit/vec.rs index a1d2eed0a8b5f..696ae8aa7b68e 100644 --- a/src/libcollectionstest/bit/vec.rs +++ b/src/libcollectionstest/bit/vec.rs @@ -630,6 +630,24 @@ fn test_bit_vec_extend() { 0b01001001, 0b10010010, 0b10111101])); } +#[test] +fn test_bit_vecextend_ref() { + let mut bv = BitVec::from_bytes(&[0b10100011]); + bv.extend(&[true, false, true]); + + assert_eq!(bv.len(), 11); + assert!(bv.eq_vec(&[true, false, true, false, false, false, true, true, + true, false, true])); + + let bw = BitVec::from_bytes(&[0b00010001]); + bv.extend(&bw); + + assert_eq!(bv.len(), 19); + assert!(bv.eq_vec(&[true, false, true, false, false, false, true, true, + true, false, true, false, false, false, true, false, + false, false, true])); +} + #[test] fn test_bit_vec_append() { // Append to BitVec that holds a multiple of u32::BITS bits diff --git a/src/libcollectionstest/btree/map.rs b/src/libcollectionstest/btree/map.rs index a29968ae8a2fc..e617e194d300a 100644 --- a/src/libcollectionstest/btree/map.rs +++ b/src/libcollectionstest/btree/map.rs @@ -249,6 +249,22 @@ fn test_entry(){ assert_eq!(map.len(), 6); } +#[test] +fn test_extend_ref() { + let mut a = BTreeMap::new(); + a.insert(1, "one"); + let mut b = BTreeMap::new(); + b.insert(2, "two"); + b.insert(3, "three"); + + a.extend(&b); + + assert_eq!(a.len(), 3); + assert_eq!(a[&1], "one"); + assert_eq!(a[&2], "two"); + assert_eq!(a[&3], "three"); +} + mod bench { use std::collections::BTreeMap; use std::__rand::{Rng, thread_rng}; diff --git a/src/libcollectionstest/btree/set.rs b/src/libcollectionstest/btree/set.rs index 234cd6e0fd21e..97fb4b6b15fd6 100644 --- a/src/libcollectionstest/btree/set.rs +++ b/src/libcollectionstest/btree/set.rs @@ -184,3 +184,31 @@ fn test_show() { assert_eq!(set_str, "{1, 2}"); assert_eq!(format!("{:?}", empty), "{}"); } + +#[test] +fn test_extend_ref() { + let mut a = BTreeSet::new(); + a.insert(1); + + a.extend(&[2, 3, 4]); + + assert_eq!(a.len(), 4); + assert!(a.contains(&1)); + assert!(a.contains(&2)); + assert!(a.contains(&3)); + assert!(a.contains(&4)); + + let mut b = BTreeSet::new(); + b.insert(5); + b.insert(6); + + a.extend(&b); + + assert_eq!(a.len(), 6); + assert!(a.contains(&1)); + assert!(a.contains(&2)); + assert!(a.contains(&3)); + assert!(a.contains(&4)); + assert!(a.contains(&5)); + assert!(a.contains(&6)); +} diff --git a/src/libcollectionstest/enum_set.rs b/src/libcollectionstest/enum_set.rs index 0a1eb0bcfa887..b073c2f3ae4dd 100644 --- a/src/libcollectionstest/enum_set.rs +++ b/src/libcollectionstest/enum_set.rs @@ -242,3 +242,25 @@ fn test_overflow() { let mut set = EnumSet::new(); set.insert(Bar::V64); } + +#[test] +fn test_extend_ref() { + let mut a = EnumSet::new(); + a.insert(A); + + a.extend(&[A, C]); + + assert_eq!(a.len(), 2); + assert!(a.contains(&A)); + assert!(a.contains(&C)); + + let mut b = EnumSet::new(); + b.insert(B); + + a.extend(&b); + + assert_eq!(a.len(), 3); + assert!(a.contains(&A)); + assert!(a.contains(&B)); + assert!(a.contains(&C)); +} diff --git a/src/libcollectionstest/linked_list.rs b/src/libcollectionstest/linked_list.rs index fd73938095f09..d04ce574ed0a5 100644 --- a/src/libcollectionstest/linked_list.rs +++ b/src/libcollectionstest/linked_list.rs @@ -321,6 +321,25 @@ fn test_show() { assert_eq!(format!("{:?}", list), "[\"just\", \"one\", \"test\", \"more\"]"); } +#[test] +fn test_extend_ref() { + let mut a = LinkedList::new(); + a.push_back(1); + + a.extend(&[2, 3, 4]); + + assert_eq!(a.len(), 4); + assert_eq!(a, list_from(&[1, 2, 3, 4])); + + let mut b = LinkedList::new(); + b.push_back(5); + b.push_back(6); + a.extend(&b); + + assert_eq!(a.len(), 6); + assert_eq!(a, list_from(&[1, 2, 3, 4, 5, 6])); +} + #[bench] fn bench_collect_into(b: &mut test::Bencher) { let v = &[0; 64]; diff --git a/src/libcollectionstest/string.rs b/src/libcollectionstest/string.rs index d4e2ebf4fd137..0e9559c55b0d6 100644 --- a/src/libcollectionstest/string.rs +++ b/src/libcollectionstest/string.rs @@ -365,6 +365,14 @@ fn test_drain() { assert_eq!(t, ""); } +#[test] +fn test_extend_ref() { + let mut a = "foo".to_string(); + a.extend(&['b', 'a', 'r']); + + assert_eq!(&a, "foobar"); +} + #[bench] fn bench_with_capacity(b: &mut Bencher) { b.iter(|| { diff --git a/src/libcollectionstest/vec.rs b/src/libcollectionstest/vec.rs index b4d3d0b1a2281..8df2398c97e0d 100644 --- a/src/libcollectionstest/vec.rs +++ b/src/libcollectionstest/vec.rs @@ -112,6 +112,21 @@ fn test_extend() { assert_eq!(v, w); } +#[test] +fn test_extend_ref() { + let mut v = vec![1, 2]; + v.extend(&[3, 4, 5]); + + assert_eq!(v.len(), 5); + assert_eq!(v, [1, 2, 3, 4, 5]); + + let w = vec![6, 7]; + v.extend(&w); + + assert_eq!(v.len(), 7); + assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]); +} + #[test] fn test_slice_from_mut() { let mut values = vec![1, 2, 3, 4, 5]; diff --git a/src/libcollectionstest/vec_deque.rs b/src/libcollectionstest/vec_deque.rs index 7870447281bc1..14a36b7c4db79 100644 --- a/src/libcollectionstest/vec_deque.rs +++ b/src/libcollectionstest/vec_deque.rs @@ -894,3 +894,29 @@ fn test_retain() { let v: Vec<_> = buf.into_iter().collect(); assert_eq!(&v[..], &[2, 4]); } + +#[test] +fn test_extend_ref() { + let mut v = VecDeque::new(); + v.push_back(1); + v.extend(&[2, 3, 4]); + + assert_eq!(v.len(), 4); + assert_eq!(v[0], 1); + assert_eq!(v[1], 2); + assert_eq!(v[2], 3); + assert_eq!(v[3], 4); + + let mut w = VecDeque::new(); + w.push_back(5); + w.push_back(6); + v.extend(&w); + + assert_eq!(v.len(), 6); + assert_eq!(v[0], 1); + assert_eq!(v[1], 2); + assert_eq!(v[2], 3); + assert_eq!(v[3], 4); + assert_eq!(v[4], 5); + assert_eq!(v[5], 6); +} diff --git a/src/libcollectionstest/vec_map.rs b/src/libcollectionstest/vec_map.rs index 112b4c03e20e5..3ab32323603ca 100644 --- a/src/libcollectionstest/vec_map.rs +++ b/src/libcollectionstest/vec_map.rs @@ -493,6 +493,22 @@ fn test_entry(){ assert_eq!(map.len(), 6); } +#[test] +fn test_extend_ref() { + let mut a = VecMap::new(); + a.insert(1, "one"); + let mut b = VecMap::new(); + b.insert(2, "two"); + b.insert(3, "three"); + + a.extend(&b); + + assert_eq!(a.len(), 3); + assert_eq!(a[&1], "one"); + assert_eq!(a[&2], "two"); + assert_eq!(a[&3], "three"); +} + mod bench { use std::collections::VecMap; diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index c4f2c7207ac39..333e1f0152a2b 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -2284,7 +2284,7 @@ fn render_assoc_items(w: &mut fmt::Formatter, } try!(write!(w, "

Trait \ Implementations

")); - let (derived, manual): (Vec<_>, _) = traits.iter().partition(|i| { + let (derived, manual): (Vec<_>, Vec<&Impl>) = traits.iter().partition(|i| { i.impl_.derived }); for i in &manual {