Skip to content

Commit f8ae526

Browse files
author
blake2-ppc
committed
extra: Implement iterator::Extendable
1 parent f686213 commit f8ae526

File tree

4 files changed

+51
-21
lines changed

4 files changed

+51
-21
lines changed

src/libextra/dlist.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
use std::cast;
2626
use std::ptr;
2727
use std::util;
28-
use std::iterator::{FromIterator, Invert};
28+
use std::iterator::{FromIterator, Extendable, Invert};
2929

3030
use container::Deque;
3131

@@ -541,11 +541,17 @@ impl<A> DoubleEndedIterator<A> for ConsumeIterator<A> {
541541
impl<A, T: Iterator<A>> FromIterator<A, T> for DList<A> {
542542
fn from_iterator(iterator: &mut T) -> DList<A> {
543543
let mut ret = DList::new();
544-
for iterator.advance |elt| { ret.push_back(elt); }
544+
ret.extend(iterator);
545545
ret
546546
}
547547
}
548548

549+
impl<A, T: Iterator<A>> Extendable<A, T> for DList<A> {
550+
fn extend(&mut self, iterator: &mut T) {
551+
for iterator.advance |elt| { self.push_back(elt); }
552+
}
553+
}
554+
549555
impl<A: Eq> Eq for DList<A> {
550556
fn eq(&self, other: &DList<A>) -> bool {
551557
self.len() == other.len() &&

src/libextra/priority_queue.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::clone::Clone;
1616
use std::unstable::intrinsics::{move_val_init, init};
1717
use std::util::{replace, swap};
1818
use std::vec;
19-
use std::iterator::FromIterator;
19+
use std::iterator::{FromIterator, Extendable};
2020

2121
/// A priority queue implemented with a binary heap
2222
#[deriving(Clone)]
@@ -191,17 +191,24 @@ impl<'self, T> Iterator<&'self T> for PriorityQueueIterator<'self, T> {
191191
}
192192

193193
impl<T: Ord, Iter: Iterator<T>> FromIterator<T, Iter> for PriorityQueue<T> {
194-
pub fn from_iterator(iter: &mut Iter) -> PriorityQueue<T> {
194+
fn from_iterator(iter: &mut Iter) -> PriorityQueue<T> {
195+
let mut q = PriorityQueue::new();
196+
q.extend(iter);
197+
198+
q
199+
}
200+
}
201+
202+
impl<T: Ord, Iter: Iterator<T>> Extendable<T, Iter> for PriorityQueue<T> {
203+
fn extend(&mut self, iter: &mut Iter) {
195204
let (lower, _) = iter.size_hint();
196205

197-
let mut q = PriorityQueue::new();
198-
q.reserve_at_least(lower);
206+
let len = self.capacity();
207+
self.reserve_at_least(len + lower);
199208

200209
for iter.advance |elem| {
201-
q.push(elem);
210+
self.push(elem);
202211
}
203-
204-
q
205212
}
206213
}
207214

src/libextra/ringbuf.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
use std::num;
1717
use std::uint;
1818
use std::vec;
19-
use std::iterator::{FromIterator, Invert, RandomAccessIterator};
19+
use std::iterator::{FromIterator, Invert, RandomAccessIterator, Extendable};
2020

2121
use container::Deque;
2222

@@ -325,11 +325,18 @@ impl<A: Eq> Eq for RingBuf<A> {
325325

326326
impl<A, T: Iterator<A>> FromIterator<A, T> for RingBuf<A> {
327327
fn from_iterator(iterator: &mut T) -> RingBuf<A> {
328-
let mut deq = RingBuf::new();
328+
let (lower, _) = iterator.size_hint();
329+
let mut deq = RingBuf::with_capacity(lower);
330+
deq.extend(iterator);
331+
deq
332+
}
333+
}
334+
335+
impl<A, T: Iterator<A>> Extendable<A, T> for RingBuf<A> {
336+
fn extend(&mut self, iterator: &mut T) {
329337
for iterator.advance |elt| {
330-
deq.push_back(elt);
338+
self.push_back(elt);
331339
}
332-
deq
333340
}
334341
}
335342

src/libextra/treemap.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
use std::num;
1717
use std::util::{swap, replace};
18-
use std::iterator::FromIterator;
18+
use std::iterator::{FromIterator, Extendable};
1919

2020
// This is implemented as an AA tree, which is a simplified variation of
2121
// a red-black tree where red (horizontal) nodes can only be added
@@ -753,26 +753,36 @@ fn remove<K: TotalOrd, V>(node: &mut Option<~TreeNode<K, V>>,
753753
}
754754

755755
impl<K: TotalOrd, V, T: Iterator<(K, V)>> FromIterator<(K, V), T> for TreeMap<K, V> {
756-
pub fn from_iterator(iter: &mut T) -> TreeMap<K, V> {
756+
fn from_iterator(iter: &mut T) -> TreeMap<K, V> {
757757
let mut map = TreeMap::new();
758+
map.extend(iter);
759+
map
760+
}
761+
}
758762

763+
impl<K: TotalOrd, V, T: Iterator<(K, V)>> Extendable<(K, V), T> for TreeMap<K, V> {
764+
#[inline]
765+
fn extend(&mut self, iter: &mut T) {
759766
for iter.advance |(k, v)| {
760-
map.insert(k, v);
767+
self.insert(k, v);
761768
}
762-
763-
map
764769
}
765770
}
766771

767772
impl<T: TotalOrd, Iter: Iterator<T>> FromIterator<T, Iter> for TreeSet<T> {
768773
pub fn from_iterator(iter: &mut Iter) -> TreeSet<T> {
769774
let mut set = TreeSet::new();
775+
set.extend(iter);
776+
set
777+
}
778+
}
770779

780+
impl<T: TotalOrd, Iter: Iterator<T>> Extendable<T, Iter> for TreeSet<T> {
781+
#[inline]
782+
fn extend(&mut self, iter: &mut Iter) {
771783
for iter.advance |elem| {
772-
set.insert(elem);
784+
self.insert(elem);
773785
}
774-
775-
set
776786
}
777787
}
778788

0 commit comments

Comments
 (0)