@@ -148,7 +148,7 @@ pub struct Bitv {
148
148
impl Index < uint , bool > for Bitv {
149
149
#[ inline]
150
150
fn index < ' a > ( & ' a self , i : & uint ) -> & ' a bool {
151
- if self . get ( * i) {
151
+ if self . get ( * i) . expect ( "index out of bounds" ) {
152
152
& TRUE
153
153
} else {
154
154
& FALSE
@@ -315,32 +315,30 @@ impl Bitv {
315
315
bitv
316
316
}
317
317
318
- /// Retrieves the value at index `i`.
319
- ///
320
- /// # Panics
321
- ///
322
- /// Panics if `i` is out of bounds.
318
+ /// Retrieves the value at index `i`, or `None` if the index is out of bounds.
323
319
///
324
320
/// # Example
325
321
///
326
322
/// ```
327
323
/// use std::collections::Bitv;
328
324
///
329
325
/// let bv = Bitv::from_bytes(&[0b01100000]);
330
- /// assert_eq!(bv.get(0), false);
331
- /// assert_eq!(bv.get(1), true);
326
+ /// assert_eq!(bv.get(0), Some(false));
327
+ /// assert_eq!(bv.get(1), Some(true));
328
+ /// assert_eq!(bv.get(100), None);
332
329
///
333
330
/// // Can also use array indexing
334
331
/// assert_eq!(bv[1], true);
335
332
/// ```
336
333
#[ inline]
337
334
#[ unstable = "panic semantics are likely to change in the future" ]
338
- pub fn get ( & self , i : uint ) -> bool {
335
+ pub fn get ( & self , i : uint ) -> Option < bool > {
339
336
assert ! ( i < self . nbits) ;
340
337
let w = i / u32:: BITS ;
341
338
let b = i % u32:: BITS ;
342
- let x = self . storage [ w] & ( 1 << b) ;
343
- x != 0
339
+ self . storage . get ( w) . map ( |block|
340
+ ( block & ( 1 << b) ) != 0
341
+ )
344
342
}
345
343
346
344
/// Sets the value of a bit at an index `i`.
@@ -609,7 +607,7 @@ impl Bitv {
609
607
if offset >= bitv. nbits {
610
608
0
611
609
} else {
612
- bitv. get ( offset) as u8 << ( 7 - bit)
610
+ bitv[ offset] as u8 << ( 7 - bit)
613
611
}
614
612
}
615
613
@@ -630,7 +628,7 @@ impl Bitv {
630
628
/// Deprecated: Use `iter().collect()`.
631
629
#[ deprecated = "Use `iter().collect()`" ]
632
630
pub fn to_bools ( & self ) -> Vec < bool > {
633
- Vec :: from_fn ( self . nbits , |i| self . get ( i ) )
631
+ Vec :: from_fn ( self . nbits , |i| self [ i ] )
634
632
}
635
633
636
634
/// Compares a `Bitv` to a slice of `bool`s.
@@ -654,7 +652,7 @@ impl Bitv {
654
652
assert_eq ! ( self . nbits, v. len( ) ) ;
655
653
let mut i = 0 ;
656
654
while i < self . nbits {
657
- if self . get ( i ) != v[ i] { return false ; }
655
+ if self [ i ] != v[ i] { return false ; }
658
656
i = i + 1 ;
659
657
}
660
658
true
@@ -837,7 +835,7 @@ impl Bitv {
837
835
if self . is_empty ( ) {
838
836
None
839
837
} else {
840
- let ret = self . get ( self . nbits - 1 ) ;
838
+ let ret = self [ self . nbits - 1 ] ;
841
839
// If we are unusing a whole word, make sure it is zeroed out
842
840
self . nbits -= 1 ;
843
841
if self . nbits % u32:: BITS == 0 {
@@ -993,7 +991,7 @@ impl<'a> Iterator<bool> for Bits<'a> {
993
991
if self . next_idx != self . end_idx {
994
992
let idx = self . next_idx ;
995
993
self . next_idx += 1 ;
996
- Some ( self . bitv . get ( idx) )
994
+ Some ( self . bitv [ idx] )
997
995
} else {
998
996
None
999
997
}
@@ -1010,7 +1008,7 @@ impl<'a> DoubleEndedIterator<bool> for Bits<'a> {
1010
1008
fn next_back ( & mut self ) -> Option < bool > {
1011
1009
if self . next_idx != self . end_idx {
1012
1010
self . end_idx -= 1 ;
1013
- Some ( self . bitv . get ( self . end_idx ) )
1011
+ Some ( self . bitv [ self . end_idx ] )
1014
1012
} else {
1015
1013
None
1016
1014
}
@@ -1030,7 +1028,7 @@ impl<'a> RandomAccessIterator<bool> for Bits<'a> {
1030
1028
if index >= self . indexable ( ) {
1031
1029
None
1032
1030
} else {
1033
- Some ( self . bitv . get ( index) )
1031
+ Some ( self . bitv [ index] )
1034
1032
}
1035
1033
}
1036
1034
}
@@ -1071,7 +1069,7 @@ impl<'a> RandomAccessIterator<bool> for Bits<'a> {
1071
1069
///
1072
1070
/// // Can convert back to a `Bitv`
1073
1071
/// let bv: Bitv = s.into_bitv();
1074
- /// assert!(bv.get(3) );
1072
+ /// assert!(bv[3] );
1075
1073
/// ```
1076
1074
#[ deriving( Clone ) ]
1077
1075
pub struct BitvSet {
@@ -1260,8 +1258,8 @@ impl BitvSet {
1260
1258
/// s.insert(3);
1261
1259
///
1262
1260
/// let bv = s.into_bitv();
1263
- /// assert!(bv.get(0) );
1264
- /// assert!(bv.get(3) );
1261
+ /// assert!(bv[0] );
1262
+ /// assert!(bv[3] );
1265
1263
/// ```
1266
1264
#[ inline]
1267
1265
pub fn into_bitv ( self ) -> Bitv {
@@ -1615,7 +1613,7 @@ impl BitvSet {
1615
1613
#[ unstable = "matches collection reform specification, waiting for dust to settle" ]
1616
1614
pub fn contains ( & self , value : & uint ) -> bool {
1617
1615
let bitv = & self . bitv ;
1618
- * value < bitv. nbits && bitv. get ( * value)
1616
+ * value < bitv. nbits && bitv[ * value]
1619
1617
}
1620
1618
1621
1619
/// Returns `true` if the set has no elements in common with `other`.
@@ -2173,9 +2171,9 @@ mod bitv_test {
2173
2171
b2. set ( 1 , true ) ;
2174
2172
b2. set ( 2 , true ) ;
2175
2173
assert ! ( b1. difference( & b2) ) ;
2176
- assert ! ( b1. get ( 0 ) ) ;
2177
- assert ! ( !b1. get ( 1 ) ) ;
2178
- assert ! ( !b1. get ( 2 ) ) ;
2174
+ assert ! ( b1[ 0 ] ) ;
2175
+ assert ! ( !b1[ 1 ] ) ;
2176
+ assert ! ( !b1[ 2 ] ) ;
2179
2177
}
2180
2178
2181
2179
#[ test]
@@ -2187,9 +2185,9 @@ mod bitv_test {
2187
2185
b2. set ( 40 , true ) ;
2188
2186
b2. set ( 80 , true ) ;
2189
2187
assert ! ( b1. difference( & b2) ) ;
2190
- assert ! ( b1. get ( 0 ) ) ;
2191
- assert ! ( !b1. get ( 40 ) ) ;
2192
- assert ! ( !b1. get ( 80 ) ) ;
2188
+ assert ! ( b1[ 0 ] ) ;
2189
+ assert ! ( !b1[ 40 ] ) ;
2190
+ assert ! ( !b1[ 80 ] ) ;
2193
2191
}
2194
2192
2195
2193
#[ test]
@@ -2287,16 +2285,16 @@ mod bitv_test {
2287
2285
fn test_bitv_push_pop ( ) {
2288
2286
let mut s = Bitv :: from_elem ( 5 * u32:: BITS - 2 , false ) ;
2289
2287
assert_eq ! ( s. len( ) , 5 * u32 :: BITS - 2 ) ;
2290
- assert_eq ! ( s. get ( 5 * u32 :: BITS - 3 ) , false ) ;
2288
+ assert_eq ! ( s[ 5 * u32 :: BITS - 3 ] , false ) ;
2291
2289
s. push ( true ) ;
2292
2290
s. push ( true ) ;
2293
- assert_eq ! ( s. get ( 5 * u32 :: BITS - 2 ) , true ) ;
2294
- assert_eq ! ( s. get ( 5 * u32 :: BITS - 1 ) , true ) ;
2291
+ assert_eq ! ( s[ 5 * u32 :: BITS - 2 ] , true ) ;
2292
+ assert_eq ! ( s[ 5 * u32 :: BITS - 1 ] , true ) ;
2295
2293
// Here the internal vector will need to be extended
2296
2294
s. push ( false ) ;
2297
- assert_eq ! ( s. get ( 5 * u32 :: BITS ) , false ) ;
2295
+ assert_eq ! ( s[ 5 * u32 :: BITS ] , false ) ;
2298
2296
s. push ( false ) ;
2299
- assert_eq ! ( s. get ( 5 * u32 :: BITS + 1 ) , false ) ;
2297
+ assert_eq ! ( s[ 5 * u32 :: BITS + 1 ] , false ) ;
2300
2298
assert_eq ! ( s. len( ) , 5 * u32 :: BITS + 2 ) ;
2301
2299
// Pop it all off
2302
2300
assert_eq ! ( s. pop( ) , Some ( false ) ) ;
@@ -2345,10 +2343,10 @@ mod bitv_test {
2345
2343
s. push ( true ) ;
2346
2344
s. push ( false ) ;
2347
2345
s. push ( true ) ;
2348
- assert_eq ! ( s. get ( 5 * u32 :: BITS - 1 ) , true ) ;
2349
- assert_eq ! ( s. get ( 5 * u32 :: BITS - 0 ) , true ) ;
2350
- assert_eq ! ( s. get ( 5 * u32 :: BITS + 1 ) , false ) ;
2351
- assert_eq ! ( s. get ( 5 * u32 :: BITS + 2 ) , true ) ;
2346
+ assert_eq ! ( s[ 5 * u32 :: BITS - 1 ] , true ) ;
2347
+ assert_eq ! ( s[ 5 * u32 :: BITS - 0 ] , true ) ;
2348
+ assert_eq ! ( s[ 5 * u32 :: BITS + 1 ] , false ) ;
2349
+ assert_eq ! ( s[ 5 * u32 :: BITS + 2 ] , true ) ;
2352
2350
}
2353
2351
2354
2352
#[ test]
0 commit comments