@@ -28,13 +28,20 @@ pub const WORD_BITS: usize = WORD_BYTES * 8;
28
28
/// will panic if the bitsets have differing domain sizes.
29
29
///
30
30
/// [`GrowableBitSet`]: struct.GrowableBitSet.html
31
- #[ derive( Clone , Eq , PartialEq , Decodable , Encodable ) ]
32
- pub struct BitSet < T : Idx > {
31
+ #[ derive( Eq , PartialEq , Decodable , Encodable ) ]
32
+ pub struct BitSet < T > {
33
33
domain_size : usize ,
34
34
words : Vec < Word > ,
35
35
marker : PhantomData < T > ,
36
36
}
37
37
38
+ impl < T > BitSet < T > {
39
+ /// Gets the domain size.
40
+ pub fn domain_size ( & self ) -> usize {
41
+ self . domain_size
42
+ }
43
+ }
44
+
38
45
impl < T : Idx > BitSet < T > {
39
46
/// Creates a new, empty bitset with a given `domain_size`.
40
47
#[ inline]
@@ -52,11 +59,6 @@ impl<T: Idx> BitSet<T> {
52
59
result
53
60
}
54
61
55
- /// Gets the domain size.
56
- pub fn domain_size ( & self ) -> usize {
57
- self . domain_size
58
- }
59
-
60
62
/// Clear all elements.
61
63
#[ inline]
62
64
pub fn clear ( & mut self ) {
@@ -75,12 +77,6 @@ impl<T: Idx> BitSet<T> {
75
77
}
76
78
}
77
79
78
- /// Efficiently overwrite `self` with `other`.
79
- pub fn overwrite ( & mut self , other : & BitSet < T > ) {
80
- assert ! ( self . domain_size == other. domain_size) ;
81
- self . words . clone_from_slice ( & other. words ) ;
82
- }
83
-
84
80
/// Count the number of set bits in the set.
85
81
pub fn count ( & self ) -> usize {
86
82
self . words . iter ( ) . map ( |e| e. count_ones ( ) as usize ) . sum ( )
@@ -243,6 +239,21 @@ impl<T: Idx> SubtractFromBitSet<T> for BitSet<T> {
243
239
}
244
240
}
245
241
242
+ impl < T > Clone for BitSet < T > {
243
+ fn clone ( & self ) -> Self {
244
+ BitSet { domain_size : self . domain_size , words : self . words . clone ( ) , marker : PhantomData }
245
+ }
246
+
247
+ fn clone_from ( & mut self , from : & Self ) {
248
+ if self . domain_size != from. domain_size {
249
+ self . words . resize ( from. domain_size , 0 ) ;
250
+ self . domain_size = from. domain_size ;
251
+ }
252
+
253
+ self . words . copy_from_slice ( & from. words ) ;
254
+ }
255
+ }
256
+
246
257
impl < T : Idx > fmt:: Debug for BitSet < T > {
247
258
fn fmt ( & self , w : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
248
259
w. debug_list ( ) . entries ( self . iter ( ) ) . finish ( )
@@ -363,7 +374,7 @@ const SPARSE_MAX: usize = 8;
363
374
///
364
375
/// This type is used by `HybridBitSet`; do not use directly.
365
376
#[ derive( Clone , Debug ) ]
366
- pub struct SparseBitSet < T : Idx > {
377
+ pub struct SparseBitSet < T > {
367
378
domain_size : usize ,
368
379
elems : ArrayVec < [ T ; SPARSE_MAX ] > ,
369
380
}
@@ -464,18 +475,27 @@ impl<T: Idx> SubtractFromBitSet<T> for SparseBitSet<T> {
464
475
/// All operations that involve an element will panic if the element is equal
465
476
/// to or greater than the domain size. All operations that involve two bitsets
466
477
/// will panic if the bitsets have differing domain sizes.
467
- #[ derive( Clone , Debug ) ]
468
- pub enum HybridBitSet < T : Idx > {
478
+ #[ derive( Clone ) ]
479
+ pub enum HybridBitSet < T > {
469
480
Sparse ( SparseBitSet < T > ) ,
470
481
Dense ( BitSet < T > ) ,
471
482
}
472
483
484
+ impl < T : Idx > fmt:: Debug for HybridBitSet < T > {
485
+ fn fmt ( & self , w : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
486
+ match self {
487
+ Self :: Sparse ( b) => b. fmt ( w) ,
488
+ Self :: Dense ( b) => b. fmt ( w) ,
489
+ }
490
+ }
491
+ }
492
+
473
493
impl < T : Idx > HybridBitSet < T > {
474
494
pub fn new_empty ( domain_size : usize ) -> Self {
475
495
HybridBitSet :: Sparse ( SparseBitSet :: new_empty ( domain_size) )
476
496
}
477
497
478
- fn domain_size ( & self ) -> usize {
498
+ pub fn domain_size ( & self ) -> usize {
479
499
match self {
480
500
HybridBitSet :: Sparse ( sparse) => sparse. domain_size ,
481
501
HybridBitSet :: Dense ( dense) => dense. domain_size ,
0 commit comments