]> git.lizzy.rs Git - enumset.git/commitdiff
Bugfix in EnumSetIter::size_hint()
authorManu Thambi <manu@meshcapital.com>
Thu, 26 Sep 2019 20:31:28 +0000 (16:31 -0400)
committerManu Thambi <manu@meshcapital.com>
Thu, 26 Sep 2019 20:31:28 +0000 (16:31 -0400)
Also added tests for size_hint().

enumset/src/lib.rs
enumset/tests/ops.rs

index 327394f1cfd26839e94647f6c902a3bc36fd1e45..5f98ab539da411ed4f8ebf6cc55f41ff8fefa878 100644 (file)
@@ -509,7 +509,7 @@ impl <T : EnumSetType> Iterator for EnumSetIter<T> {
         None
     }
     fn size_hint(&self) -> (usize, Option<usize>) {
-        let left_mask = EnumSet::<T>::partial_bits(self.1);
+        let left_mask = !EnumSet::<T>::partial_bits(self.1);
         let left = (self.0.__enumset_underlying & left_mask).count_ones() as usize;
         (left, Some(left))
     }
index 014891d87203ac6d28058602609d5343a18be00e..cebdc0027050aecb5afa5103ff130e3e94158fbb 100644 (file)
@@ -137,6 +137,25 @@ macro_rules! test_enum {
             assert_eq!(set, set_3);
         }
 
+        fn check_iter_size_hint(set: EnumSet<$e>) {
+            let count = set.len();
+            let mut itr = set.iter();
+            for idx in 0 .. count {
+                assert_eq!(itr.size_hint(), (count-idx, Some(count-idx)));
+                assert!(itr.next().is_some());
+            }
+            assert_eq!(itr.size_hint(), (0, Some(0)));
+        }
+        #[test]
+        fn test_iter_size_hint() {
+            check_iter_size_hint(EnumSet::<$e>::all());
+            let mut set = EnumSet::new();
+            set.insert($e::A);
+            set.insert($e::C);
+            set.insert($e::E);
+            check_iter_size_hint(set);
+        }
+
         #[test]
         fn basic_ops_test() {
             assert_eq!(($e::A | $e::B) | ($e::B | $e::C), $e::A | $e::B | $e::C);