diff --git a/phf/src/lib.rs b/phf/src/lib.rs index 05893fd2..b81bd496 100644 --- a/phf/src/lib.rs +++ b/phf/src/lib.rs @@ -4,7 +4,7 @@ //! literals, or any of the fixed-size integral types. #![doc(html_root_url="https://sfackler.github.io/doc")] #![warn(missing_docs)] -#![feature(macro_rules, phase, globs, old_orphan_check)] +#![feature(macro_rules, phase, globs, old_orphan_check, associated_types)] #![no_std] #[phase(plugin, link)] diff --git a/phf/src/map.rs b/phf/src/map.rs index 92c04198..a6e14e75 100644 --- a/phf/src/map.rs +++ b/phf/src/map.rs @@ -54,7 +54,9 @@ impl fmt::Show for Map where K: fmt::Show, V: fmt::Show { } } -impl Index for Map where T: Eq + PhfHash + BorrowFrom { +impl Index for Map where T: Eq + PhfHash + BorrowFrom { + type Output = V; + fn index(&self, k: &T) -> &V { self.get(k).expect("invalid key") } @@ -131,7 +133,9 @@ pub struct Entries<'a, K:'a, V:'a> { iter: slice::Iter<'a, (K, V)>, } -impl<'a, K, V> Iterator<(&'a K, &'a V)> for Entries<'a, K, V> { +impl<'a, K, V> Iterator for Entries<'a, K, V> { + type Item = (&'a K, &'a V); + fn next(&mut self) -> Option<(&'a K, &'a V)> { self.iter.next().map(|&(ref k, ref v)| (k, v)) } @@ -141,20 +145,22 @@ impl<'a, K, V> Iterator<(&'a K, &'a V)> for Entries<'a, K, V> { } } -impl<'a, K, V> DoubleEndedIterator<(&'a K, &'a V)> for Entries<'a, K, V> { +impl<'a, K, V> DoubleEndedIterator for Entries<'a, K, V> { fn next_back(&mut self) -> Option<(&'a K, &'a V)> { self.iter.next_back().map(|e| (&e.0, &e.1)) } } -impl<'a, K, V> ExactSizeIterator<(&'a K, &'a V)> for Entries<'a, K, V> {} +impl<'a, K, V> ExactSizeIterator for Entries<'a, K, V> {} /// An iterator over the keys in a `Map`. pub struct Keys<'a, K:'a, V:'a> { iter: Entries<'a, K, V>, } -impl<'a, K, V> Iterator<&'a K> for Keys<'a, K, V> { +impl<'a, K, V> Iterator for Keys<'a, K, V> { + type Item = &'a K; + fn next(&mut self) -> Option<&'a K> { self.iter.next().map(|e| e.0) } @@ -164,20 +170,22 @@ impl<'a, K, V> Iterator<&'a K> for Keys<'a, K, V> { } } -impl<'a, K, V> DoubleEndedIterator<&'a K> for Keys<'a, K, V> { +impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> { fn next_back(&mut self) -> Option<&'a K> { self.iter.next_back().map(|e| e.0) } } -impl<'a, K, V> ExactSizeIterator<&'a K> for Keys<'a, K, V> {} +impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {} /// An iterator over the values in a `Map`. pub struct Values<'a, K:'a, V:'a> { iter: Entries<'a, K, V>, } -impl<'a, K, V> Iterator<&'a V> for Values<'a, K, V> { +impl<'a, K, V> Iterator for Values<'a, K, V> { + type Item = &'a V; + fn next(&mut self) -> Option<&'a V> { self.iter.next().map(|e| e.1) } @@ -187,10 +195,10 @@ impl<'a, K, V> Iterator<&'a V> for Values<'a, K, V> { } } -impl<'a, K, V> DoubleEndedIterator<&'a V> for Values<'a, K, V> { +impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> { fn next_back(&mut self) -> Option<&'a V> { self.iter.next_back().map(|e| e.1) } } -impl<'a, K, V> ExactSizeIterator<&'a V> for Values<'a, K, V> {} +impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {} diff --git a/phf/src/ordered_map.rs b/phf/src/ordered_map.rs index 521282e4..c5be0fbe 100644 --- a/phf/src/ordered_map.rs +++ b/phf/src/ordered_map.rs @@ -61,7 +61,9 @@ impl fmt::Show for OrderedMap where K: fmt::Show, V: fmt::Show { } } -impl Index for OrderedMap where T: Eq + PhfHash + BorrowFrom { +impl Index for OrderedMap where T: Eq + PhfHash + BorrowFrom { + type Output = V; + fn index(&self, k: &T) -> &V { self.get(k).expect("invalid key") } @@ -151,7 +153,9 @@ pub struct Entries<'a, K:'a, V:'a> { iter: slice::Iter<'a, (K, V)>, } -impl<'a, K, V> Iterator<(&'a K, &'a V)> for Entries<'a, K, V> { +impl<'a, K, V> Iterator for Entries<'a, K, V> { + type Item = (&'a K, &'a V); + fn next(&mut self) -> Option<(&'a K, &'a V)> { self.iter.next().map(|e| (&e.0, &e.1)) } @@ -161,13 +165,13 @@ impl<'a, K, V> Iterator<(&'a K, &'a V)> for Entries<'a, K, V> { } } -impl<'a, K, V> DoubleEndedIterator<(&'a K, &'a V)> for Entries<'a, K, V> { +impl<'a, K, V> DoubleEndedIterator for Entries<'a, K, V> { fn next_back(&mut self) -> Option<(&'a K, &'a V)> { self.iter.next_back().map(|e| (&e.0, &e.1)) } } -impl<'a, K, V> RandomAccessIterator<(&'a K, &'a V)> for Entries<'a, K, V> { +impl<'a, K, V> RandomAccessIterator for Entries<'a, K, V> { fn indexable(&self) -> uint { self.iter.indexable() } @@ -177,14 +181,16 @@ impl<'a, K, V> RandomAccessIterator<(&'a K, &'a V)> for Entries<'a, K, V> { } } -impl<'a, K, V> ExactSizeIterator<(&'a K, &'a V)> for Entries<'a, K, V> {} +impl<'a, K, V> ExactSizeIterator for Entries<'a, K, V> {} /// An iterator over the keys in a `OrderedMap`. pub struct Keys<'a, K:'a, V:'a> { iter: Entries<'a, K, V>, } -impl<'a, K, V> Iterator<&'a K> for Keys<'a, K, V> { +impl<'a, K, V> Iterator for Keys<'a, K, V> { + type Item = &'a K; + fn next(&mut self) -> Option<&'a K> { self.iter.next().map(|e| e.0) } @@ -194,13 +200,13 @@ impl<'a, K, V> Iterator<&'a K> for Keys<'a, K, V> { } } -impl<'a, K, V> DoubleEndedIterator<&'a K> for Keys<'a, K, V> { +impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> { fn next_back(&mut self) -> Option<&'a K> { self.iter.next_back().map(|e| e.0) } } -impl<'a, K, V> RandomAccessIterator<&'a K> for Keys<'a, K, V> { +impl<'a, K, V> RandomAccessIterator for Keys<'a, K, V> { fn indexable(&self) -> uint { self.iter.indexable() } @@ -210,14 +216,16 @@ impl<'a, K, V> RandomAccessIterator<&'a K> for Keys<'a, K, V> { } } -impl<'a, K, V> ExactSizeIterator<&'a K> for Keys<'a, K, V> {} +impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {} /// An iterator over the values in a `OrderedMap`. pub struct Values<'a, K:'a, V:'a> { iter: Entries<'a, K, V>, } -impl<'a, K, V> Iterator<&'a V> for Values<'a, K, V> { +impl<'a, K, V> Iterator for Values<'a, K, V> { + type Item = &'a V; + fn next(&mut self) -> Option<&'a V> { self.iter.next().map(|e| e.1) } @@ -227,13 +235,13 @@ impl<'a, K, V> Iterator<&'a V> for Values<'a, K, V> { } } -impl<'a, K, V> DoubleEndedIterator<&'a V> for Values<'a, K, V> { +impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> { fn next_back(&mut self) -> Option<&'a V> { self.iter.next_back().map(|e| e.1) } } -impl<'a, K, V> RandomAccessIterator<&'a V> for Values<'a, K, V> { +impl<'a, K, V> RandomAccessIterator for Values<'a, K, V> { fn indexable(&self) -> uint { self.iter.indexable() } @@ -243,4 +251,4 @@ impl<'a, K, V> RandomAccessIterator<&'a V> for Values<'a, K, V> { } } -impl<'a, K, V> ExactSizeIterator<&'a V> for Values<'a, K, V> {} +impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {} diff --git a/phf/src/ordered_set.rs b/phf/src/ordered_set.rs index 115644a9..acc60a9a 100644 --- a/phf/src/ordered_set.rs +++ b/phf/src/ordered_set.rs @@ -116,7 +116,9 @@ pub struct Iter<'a, T:'a> { iter: ordered_map::Keys<'a, T, ()>, } -impl<'a, T> Iterator<&'a T> for Iter<'a, T> { +impl<'a, T> Iterator for Iter<'a, T> { + type Item = &'a T; + #[inline] fn next(&mut self) -> Option<&'a T> { self.iter.next() @@ -128,14 +130,14 @@ impl<'a, T> Iterator<&'a T> for Iter<'a, T> { } } -impl<'a, T> DoubleEndedIterator<&'a T> for Iter<'a, T> { +impl<'a, T> DoubleEndedIterator for Iter<'a, T> { #[inline] fn next_back(&mut self) -> Option<&'a T> { self.iter.next_back() } } -impl<'a, T> RandomAccessIterator<&'a T> for Iter<'a, T> { +impl<'a, T> RandomAccessIterator for Iter<'a, T> { #[inline] fn indexable(&self) -> uint { self.iter.indexable() @@ -147,5 +149,4 @@ impl<'a, T> RandomAccessIterator<&'a T> for Iter<'a, T> { } } -impl<'a, T> ExactSizeIterator<&'a T> for Iter<'a, T> {} - +impl<'a, T> ExactSizeIterator for Iter<'a, T> {} diff --git a/phf/src/set.rs b/phf/src/set.rs index 83fe63d1..099f985d 100644 --- a/phf/src/set.rs +++ b/phf/src/set.rs @@ -104,7 +104,9 @@ pub struct Iter<'a, T:'static> { iter: map::Keys<'a, T, ()>, } -impl<'a, T> Iterator<&'a T> for Iter<'a, T> { +impl<'a, T> Iterator for Iter<'a, T> { + type Item = &'a T; + fn next(&mut self) -> Option<&'a T> { self.iter.next() } @@ -114,10 +116,10 @@ impl<'a, T> Iterator<&'a T> for Iter<'a, T> { } } -impl<'a, T> DoubleEndedIterator<&'a T> for Iter<'a, T> { +impl<'a, T> DoubleEndedIterator for Iter<'a, T> { fn next_back(&mut self) -> Option<&'a T> { self.iter.next_back() } } -impl<'a, T> ExactSizeIterator<&'a T> for Iter<'a, T> {} +impl<'a, T> ExactSizeIterator for Iter<'a, T> {}