Skip to content

Commit bb6615d

Browse files
committed
Implemented FromIterator for TrieMap and TrieSet
1 parent 4ff7ef4 commit bb6615d

File tree

2 files changed

+91
-14
lines changed

2 files changed

+91
-14
lines changed

src/libstd/hashmap.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,20 @@ impl<T:Hash + Eq> HashSet<T> {
735735
}
736736
}
737737

738+
impl<K: Eq + Hash, T: Iterator<K>> FromIterator<K, T> for HashSet<K> {
739+
pub fn from_iterator(iter: &mut T) -> HashSet<K> {
740+
let (lower, _) = iter.size_hint();
741+
let mut set = HashSet::with_capacity(lower);
742+
743+
for iter.advance |k| {
744+
set.insert(k);
745+
}
746+
747+
set
748+
}
749+
}
750+
751+
738752
#[cfg(test)]
739753
mod test_map {
740754
use container::{Container, Map, Set};
@@ -1139,4 +1153,15 @@ mod test_set {
11391153
}
11401154
assert_eq!(i, expected.len());
11411155
}
1156+
1157+
#[test]
1158+
fn test_from_iter() {
1159+
let xs = ~[1, 2, 3, 4, 5, 6, 7, 8, 9];
1160+
1161+
let set: HashSet<int> = xs.iter().transform(|&x| x).collect();
1162+
1163+
for xs.iter().advance |x: &int| {
1164+
assert!(set.contains(x));
1165+
}
1166+
}
11421167
}

src/libstd/trie.rs

Lines changed: 66 additions & 14 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;
14+
use iterator::{IteratorUtil, FromIterator};
1515
use uint;
1616
use util::{swap, replace};
1717

@@ -171,6 +171,18 @@ impl<T> TrieMap<T> {
171171
}
172172
}
173173

174+
impl<T, Iter: Iterator<(uint, T)>> FromIterator<(uint, T), Iter> for TrieMap<T> {
175+
pub fn from_iterator(iter: &mut Iter) -> TrieMap<T> {
176+
let mut map = TrieMap::new();
177+
178+
for iter.advance |(k, v)| {
179+
map.insert(k, v);
180+
}
181+
182+
map
183+
}
184+
}
185+
174186
#[allow(missing_doc)]
175187
pub struct TrieSet {
176188
priv map: TrieMap<()>
@@ -230,6 +242,18 @@ impl TrieSet {
230242
}
231243
}
232244

245+
impl<Iter: Iterator<uint>> FromIterator<uint, Iter> for TrieSet {
246+
pub fn from_iterator(iter: &mut Iter) -> TrieSet {
247+
let mut set = TrieSet::new();
248+
249+
for iter.advance |elem| {
250+
set.insert(elem);
251+
}
252+
253+
set
254+
}
255+
}
256+
233257
struct TrieNode<T> {
234258
count: uint,
235259
children: [Child<T>, ..SIZE]
@@ -382,7 +406,7 @@ pub fn check_integrity<T>(trie: &TrieNode<T>) {
382406
}
383407

384408
#[cfg(test)]
385-
mod tests {
409+
mod test_map {
386410
use super::*;
387411
use core::option::{Some, None};
388412
use uint;
@@ -510,6 +534,39 @@ mod tests {
510534
}
511535
}
512536

537+
#[test]
538+
fn test_swap() {
539+
let mut m = TrieMap::new();
540+
assert_eq!(m.swap(1, 2), None);
541+
assert_eq!(m.swap(1, 3), Some(2));
542+
assert_eq!(m.swap(1, 4), Some(3));
543+
}
544+
545+
#[test]
546+
fn test_pop() {
547+
let mut m = TrieMap::new();
548+
m.insert(1, 2);
549+
assert_eq!(m.pop(&1), Some(2));
550+
assert_eq!(m.pop(&1), None);
551+
}
552+
553+
#[test]
554+
fn test_from_iter() {
555+
let xs = ~[(1u, 1i), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
556+
557+
let map: TrieMap<int> = xs.iter().transform(|&x| x).collect();
558+
559+
for xs.iter().advance |&(k, v)| {
560+
assert_eq!(map.find(&k), Some(&v));
561+
}
562+
}
563+
}
564+
565+
#[cfg(test)]
566+
mod test_set {
567+
use super::*;
568+
use uint;
569+
513570
#[test]
514571
fn test_sane_chunk() {
515572
let x = 1;
@@ -533,18 +590,13 @@ mod tests {
533590
}
534591

535592
#[test]
536-
fn test_swap() {
537-
let mut m = TrieMap::new();
538-
assert_eq!(m.swap(1, 2), None);
539-
assert_eq!(m.swap(1, 3), Some(2));
540-
assert_eq!(m.swap(1, 4), Some(3));
541-
}
593+
fn test_from_iter() {
594+
let xs = ~[9u, 8, 7, 6, 5, 4, 3, 2, 1];
595+
596+
let set: TrieSet = xs.iter().transform(|&x| x).collect();
542597

543-
#[test]
544-
fn test_pop() {
545-
let mut m = TrieMap::new();
546-
m.insert(1, 2);
547-
assert_eq!(m.pop(&1), Some(2));
548-
assert_eq!(m.pop(&1), None);
598+
for xs.iter().advance |x| {
599+
assert!(set.contains(x));
600+
}
549601
}
550602
}

0 commit comments

Comments
 (0)