Skip to content

Commit 5307d36

Browse files
author
blake2-ppc
committed
std: Implement Extendable for hashmap, str and trie
1 parent f8ae526 commit 5307d36

File tree

3 files changed

+58
-21
lines changed

3 files changed

+58
-21
lines changed

src/libstd/hashmap.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use container::{Container, Mutable, Map, MutableMap, Set, MutableSet};
1919
use clone::Clone;
2020
use cmp::{Eq, Equiv};
2121
use hash::Hash;
22-
use iterator::{Iterator, IteratorUtil, FromIterator, Chain};
22+
use iterator::{Iterator, IteratorUtil, FromIterator, Extendable, Chain};
2323
use num;
2424
use option::{None, Option, Some};
2525
use rand::RngUtil;
@@ -618,15 +618,19 @@ impl<K> Iterator<K> for HashSetConsumeIterator<K> {
618618
}
619619

620620
impl<K: Eq + Hash, V, T: Iterator<(K, V)>> FromIterator<(K, V), T> for HashMap<K, V> {
621-
pub fn from_iterator(iter: &mut T) -> HashMap<K, V> {
621+
fn from_iterator(iter: &mut T) -> HashMap<K, V> {
622622
let (lower, _) = iter.size_hint();
623623
let mut map = HashMap::with_capacity(lower);
624+
map.extend(iter);
625+
map
626+
}
627+
}
624628

629+
impl<K: Eq + Hash, V, T: Iterator<(K, V)>> Extendable<(K, V), T> for HashMap<K, V> {
630+
fn extend(&mut self, iter: &mut T) {
625631
for iter.advance |(k, v)| {
626-
map.insert(k, v);
632+
self.insert(k, v);
627633
}
628-
629-
map
630634
}
631635
}
632636

@@ -771,15 +775,19 @@ impl<T:Hash + Eq> HashSet<T> {
771775
}
772776

773777
impl<K: Eq + Hash, T: Iterator<K>> FromIterator<K, T> for HashSet<K> {
774-
pub fn from_iterator(iter: &mut T) -> HashSet<K> {
778+
fn from_iterator(iter: &mut T) -> HashSet<K> {
775779
let (lower, _) = iter.size_hint();
776780
let mut set = HashSet::with_capacity(lower);
781+
set.extend(iter);
782+
set
783+
}
784+
}
777785

786+
impl<K: Eq + Hash, T: Iterator<K>> Extendable<K, T> for HashSet<K> {
787+
fn extend(&mut self, iter: &mut T) {
778788
for iter.advance |k| {
779-
set.insert(k);
789+
self.insert(k);
780790
}
781-
782-
set
783791
}
784792
}
785793

src/libstd/str.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ use char::Char;
2323
use clone::Clone;
2424
use container::{Container, Mutable};
2525
use iter::Times;
26-
use iterator::{Iterator, FromIterator, IteratorUtil, Filter, AdditiveIterator, Map};
26+
use iterator::{Iterator, FromIterator, Extendable, IteratorUtil};
27+
use iterator::{Filter, AdditiveIterator, Map};
2728
use libc;
2829
use num::Zero;
2930
use option::{None, Option, Some};
@@ -2323,10 +2324,20 @@ impl<T: Iterator<char>> FromIterator<char, T> for ~str {
23232324
fn from_iterator(iterator: &mut T) -> ~str {
23242325
let (lower, _) = iterator.size_hint();
23252326
let mut buf = with_capacity(lower);
2327+
buf.extend(iterator);
2328+
buf
2329+
}
2330+
}
2331+
2332+
impl<T: Iterator<char>> Extendable<char, T> for ~str {
2333+
#[inline]
2334+
fn extend(&mut self, iterator: &mut T) {
2335+
let (lower, _) = iterator.size_hint();
2336+
let reserve = lower + self.len();
2337+
self.reserve_at_least(reserve);
23262338
for iterator.advance |ch| {
2327-
buf.push_char(ch)
2339+
self.push_char(ch)
23282340
}
2329-
buf
23302341
}
23312342
}
23322343
@@ -2503,6 +2514,16 @@ mod tests {
25032514
assert_eq!(data, s.as_slice());
25042515
}
25052516
2517+
#[test]
2518+
fn test_extend() {
2519+
let data = ~"ประเทศไทย中";
2520+
let mut cpy = data.clone();
2521+
let other = "abc";
2522+
let mut it = other.iter();
2523+
cpy.extend(&mut it);
2524+
assert_eq!(cpy, data + other);
2525+
}
2526+
25062527
#[test]
25072528
fn test_clear() {
25082529
let mut empty = ~"";

src/libstd/trie.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//! An ordered map and set for integer keys implemented as a radix trie
1212
1313
use prelude::*;
14-
use iterator::{IteratorUtil, FromIterator};
14+
use iterator::{IteratorUtil, FromIterator, Extendable};
1515
use uint;
1616
use util::{swap, replace};
1717

@@ -155,14 +155,18 @@ impl<T> TrieMap<T> {
155155
}
156156

157157
impl<T, Iter: Iterator<(uint, T)>> FromIterator<(uint, T), Iter> for TrieMap<T> {
158-
pub fn from_iterator(iter: &mut Iter) -> TrieMap<T> {
158+
fn from_iterator(iter: &mut Iter) -> TrieMap<T> {
159159
let mut map = TrieMap::new();
160+
map.extend(iter);
161+
map
162+
}
163+
}
160164

165+
impl<T, Iter: Iterator<(uint, T)>> Extendable<(uint, T), Iter> for TrieMap<T> {
166+
fn extend(&mut self, iter: &mut Iter) {
161167
for iter.advance |(k, v)| {
162-
map.insert(k, v);
168+
self.insert(k, v);
163169
}
164-
165-
map
166170
}
167171
}
168172

@@ -222,14 +226,18 @@ impl TrieSet {
222226
}
223227

224228
impl<Iter: Iterator<uint>> FromIterator<uint, Iter> for TrieSet {
225-
pub fn from_iterator(iter: &mut Iter) -> TrieSet {
229+
fn from_iterator(iter: &mut Iter) -> TrieSet {
226230
let mut set = TrieSet::new();
231+
set.extend(iter);
232+
set
233+
}
234+
}
227235

236+
impl<Iter: Iterator<uint>> Extendable<uint, Iter> for TrieSet {
237+
fn extend(&mut self, iter: &mut Iter) {
228238
for iter.advance |elem| {
229-
set.insert(elem);
239+
self.insert(elem);
230240
}
231-
232-
set
233241
}
234242
}
235243

0 commit comments

Comments
 (0)