@@ -269,14 +269,23 @@ impl Bitv {
269
269
270
270
impl Bitv {
271
271
pub fn new ( nbits : uint , init : bool ) -> Bitv {
272
- let rep = if nbits <= uint:: bits {
272
+ let rep = if nbits < uint:: bits {
273
+ Small ( SmallBitv :: new ( if init { ( 1 <<nbits) -1 } else { 0 } ) )
274
+ } else if nbits == uint:: bits {
273
275
Small ( SmallBitv :: new ( if init { !0 } else { 0 } ) )
274
- }
275
- else {
276
- let nelems = nbits/uint:: bits +
277
- if nbits % uint:: bits == 0 { 0 } else { 1 } ;
278
- let elem = if init { !0 u} else { 0 u} ;
279
- let s = vec:: from_elem ( nelems, elem) ;
276
+ } else {
277
+ let exact = nbits % uint:: bits == 0 ;
278
+ let nelems = nbits/uint:: bits + if exact { 0 } else { 1 } ;
279
+ let s =
280
+ if init {
281
+ if exact {
282
+ vec:: from_elem ( nelems, !0 u)
283
+ } else {
284
+ let mut v = vec:: from_elem ( nelems-1 , !0 u) ;
285
+ v. push ( ( 1 <<nbits % uint:: bits) -1 ) ;
286
+ v
287
+ }
288
+ } else { vec:: from_elem ( nelems, 0 u) } ;
280
289
Big ( BigBitv :: new ( s) )
281
290
} ;
282
291
Bitv { rep : rep, nbits : nbits}
@@ -1329,6 +1338,20 @@ mod tests {
1329
1338
assert_eq!(idxs, ~[0, 2, 3]);
1330
1339
}
1331
1340
1341
+ #[test]
1342
+ fn test_bitv_set_frombitv_init() {
1343
+ let bools = [true, false];
1344
+ let lengths = [10, 64, 100];
1345
+ for &b in bools.iter() {
1346
+ for &l in lengths.iter() {
1347
+ let bitset = BitvSet::from_bitv(Bitv::new(l, b));
1348
+ assert_eq!(bitset.contains(&1u), b)
1349
+ assert_eq!(bitset.contains(&(l-1u)), b)
1350
+ assert!(!bitset.contains(&l))
1351
+ }
1352
+ }
1353
+ }
1354
+
1332
1355
#[test]
1333
1356
fn test_small_difference() {
1334
1357
let mut b1 = Bitv::new(3, false);
0 commit comments