about summary refs log tree commit diff
path: root/src/libextra
diff options
context:
space:
mode:
authorAlex Whitney <aw1209@ic.ac.uk>2014-01-17 11:04:05 +0000
committerAlex Whitney <aw1209@ic.ac.uk>2014-01-17 12:07:32 +0000
commit32408a6e32ba396a8e5f4d183d6b80352dfad092 (patch)
treee2684adc4727a440d888d62b61f7c062cecfaeb5 /src/libextra
parent5fdc81262a5d44f10e335384b5d69b938d6d729c (diff)
downloadrust-32408a6e32ba396a8e5f4d183d6b80352dfad092.tar.gz
rust-32408a6e32ba396a8e5f4d183d6b80352dfad092.zip
Fixed bug when initialising bitv from bool=true
Diffstat (limited to 'src/libextra')
-rw-r--r--src/libextra/bitv.rs37
1 files changed, 30 insertions, 7 deletions
diff --git a/src/libextra/bitv.rs b/src/libextra/bitv.rs
index 9f40507826f..756c97ed400 100644
--- a/src/libextra/bitv.rs
+++ b/src/libextra/bitv.rs
@@ -269,14 +269,23 @@ impl Bitv {
 
 impl Bitv {
     pub fn new(nbits: uint, init: bool) -> Bitv {
-        let rep = if nbits <= uint::bits {
+        let rep = if nbits < uint::bits {
+            Small(SmallBitv::new(if init {(1<<nbits)-1} else {0}))
+        } else if nbits == uint::bits {
             Small(SmallBitv::new(if init {!0} else {0}))
-        }
-        else {
-            let nelems = nbits/uint::bits +
-                         if nbits % uint::bits == 0 {0} else {1};
-            let elem = if init {!0u} else {0u};
-            let s = vec::from_elem(nelems, elem);
+        } else {
+            let exact = nbits % uint::bits == 0;
+            let nelems = nbits/uint::bits + if exact {0} else {1};
+            let s =
+                if init {
+                    if exact {
+                        vec::from_elem(nelems, !0u)
+                    } else {
+                        let mut v = vec::from_elem(nelems-1, !0u);
+                        v.push((1<<nbits % uint::bits)-1);
+                        v
+                    }
+                } else { vec::from_elem(nelems, 0u)};
             Big(BigBitv::new(s))
         };
         Bitv {rep: rep, nbits: nbits}
@@ -1330,6 +1339,20 @@ mod tests {
     }
 
     #[test]
+    fn test_bitv_set_frombitv_init() {
+        let bools = [true, false];
+        let lengths = [10, 64, 100];
+        for &b in bools.iter() {
+            for &l in lengths.iter() {
+                let bitset = BitvSet::from_bitv(Bitv::new(l, b));
+                assert_eq!(bitset.contains(&1u), b)
+                assert_eq!(bitset.contains(&(l-1u)), b)
+                assert!(!bitset.contains(&l))
+            }
+        }
+    }
+
+    #[test]
     fn test_small_difference() {
         let mut b1 = Bitv::new(3, false);
         let mut b2 = Bitv::new(3, false);