From 4b4897284da11b59b4122c4b0c10b23064ca380c Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 13 Jul 2014 00:09:14 -0700 Subject: [PATCH] Implement more iterator traits for PhfMap iters --- phf/src/lib.rs | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/phf/src/lib.rs b/phf/src/lib.rs index 5a4771e4..8c71e3e2 100644 --- a/phf/src/lib.rs +++ b/phf/src/lib.rs @@ -185,6 +185,14 @@ impl<'a, K, V> Iterator<&'a (K, V)> for PhfMapEntries<'a, K, V> { } } +impl<'a, K, V> DoubleEndedIterator<&'a (K, V)> for PhfMapEntries<'a, K, V> { + fn next_back(&mut self) -> Option<&'a (K, V)> { + self.iter.next_back() + } +} + +impl<'a, K, V> ExactSize<&'a (K, V)> for PhfMapEntries<'a, K, V> {} + /// An iterator over the keys in a `PhfMap`. pub struct PhfMapKeys<'a, K, V> { iter: PhfMapEntries<'a, K, V>, @@ -192,7 +200,7 @@ pub struct PhfMapKeys<'a, K, V> { impl<'a, K, V> Iterator<&'a K> for PhfMapKeys<'a, K, V> { fn next(&mut self) -> Option<&'a K> { - self.iter.next().map(|&(ref key, _)| key) + self.iter.next().map(|&(ref k, _)| k) } fn size_hint(&self) -> (uint, Option) { @@ -200,6 +208,14 @@ impl<'a, K, V> Iterator<&'a K> for PhfMapKeys<'a, K, V> { } } +impl<'a, K, V> DoubleEndedIterator<&'a K> for PhfMapKeys<'a, K, V> { + fn next_back(&mut self) -> Option<&'a K> { + self.iter.next_back().map(|&(ref k, _)| k) + } +} + +impl<'a, K, V> ExactSize<&'a K> for PhfMapKeys<'a, K, V> {} + /// An iterator over the values in a `PhfMap`. pub struct PhfMapValues<'a, K, V> { iter: PhfMapEntries<'a, K, V>, @@ -207,7 +223,7 @@ pub struct PhfMapValues<'a, K, V> { impl<'a, K, V> Iterator<&'a V> for PhfMapValues<'a, K, V> { fn next(&mut self) -> Option<&'a V> { - self.iter.next().map(|&(_, ref value)| value) + self.iter.next().map(|&(_, ref v)| v) } fn size_hint(&self) -> (uint, Option) { @@ -215,6 +231,14 @@ impl<'a, K, V> Iterator<&'a V> for PhfMapValues<'a, K, V> { } } +impl<'a, K, V> DoubleEndedIterator<&'a V> for PhfMapValues<'a, K, V> { + fn next_back(&mut self) -> Option<&'a V> { + self.iter.next_back().map(|&(_, ref v)| v) + } +} + +impl<'a, K, V> ExactSize<&'a V> for PhfMapValues<'a, K, V> {} + /// An immutable set constructed at compile time. /// /// `PhfSet`s may be created with the `phf_set` macro: @@ -311,17 +335,23 @@ pub struct PhfSetValues<'a, T> { } impl<'a, T> Iterator<&'a T> for PhfSetValues<'a, T> { - #[inline] fn next(&mut self) -> Option<&'a T> { self.iter.next() } - #[inline] fn size_hint(&self) -> (uint, Option) { self.iter.size_hint() } } +impl<'a, T> DoubleEndedIterator<&'a T> for PhfSetValues<'a, T> { + fn next_back(&mut self) -> Option<&'a T> { + self.iter.next_back() + } +} + +impl<'a, T> ExactSize<&'a T> for PhfSetValues<'a, T> {} + /// An order-preserving immutable map constructed at compile time. /// /// Unlike a `PhfMap`, the order of entries in a `PhfOrderedMap` is guaranteed