Skip to content

Commit 7a57ecf

Browse files
committed
---
yaml --- r: 64311 b: refs/heads/snap-stage3 c: bb6615d h: refs/heads/master i: 64309: f1bfb2b 64307: 96178a0 64303: 587866b v: v3
1 parent 1c8dc37 commit 7a57ecf

File tree

3 files changed

+92
-15
lines changed

3 files changed

+92
-15
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 2d28d645422c1617be58c8ca7ad9a457264ca850
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 4ff7ef434ff5805dc8636fa0bb821feeb0705d22
4+
refs/heads/snap-stage3: bb6615d43a872d8cd3e2e33be5ff9efebf9cc02e
55
refs/heads/try: 7b78b52e602bb3ea8174f9b2006bff3315f03ef9
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b

branches/snap-stage3/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
}

branches/snap-stage3/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)