github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/util/bitfield.go (about)

     1  package util
     2  
     3  import (
     4  	"github.com/filecoin-project/go-bitfield"
     5  	"github.com/filecoin-project/go-bitfield/rle"
     6  )
     7  
     8  type BitField = bitfield.BitField
     9  
    10  func isEmpty(iter rlepluslazy.RunIterator) (bool, error) {
    11  	// Look for the first non-zero bit.
    12  	for iter.HasNext() {
    13  		r, err := iter.NextRun()
    14  		if err != nil {
    15  			return false, err
    16  		}
    17  		if r.Val {
    18  			return false, nil
    19  		}
    20  	}
    21  	return true, nil
    22  }
    23  
    24  // Checks whether bitfield `a` contains any bit that is set in bitfield `b`.
    25  func BitFieldContainsAny(a, b BitField) (bool, error) {
    26  	aruns, err := a.RunIterator()
    27  	if err != nil {
    28  		return false, err
    29  	}
    30  
    31  	bruns, err := b.RunIterator()
    32  	if err != nil {
    33  		return false, err
    34  	}
    35  
    36  	// Take the intersection of the two bitfields.
    37  	combined, err := rlepluslazy.And(aruns, bruns)
    38  	if err != nil {
    39  		return false, err
    40  	}
    41  
    42  	// Look for the first non-zero bit.
    43  	empty, err := isEmpty(combined)
    44  	if err != nil {
    45  		return false, err
    46  	}
    47  	return !empty, nil
    48  }
    49  
    50  // Checks whether bitfield `a` contains all bits set in bitfield `b`.
    51  func BitFieldContainsAll(a, b BitField) (bool, error) {
    52  	aruns, err := a.RunIterator()
    53  	if err != nil {
    54  		return false, err
    55  	}
    56  
    57  	bruns, err := b.RunIterator()
    58  	if err != nil {
    59  		return false, err
    60  	}
    61  
    62  	// Remove any elements in a from b. If b contains bits not in a, some
    63  	// bits will remain.
    64  	combined, err := rlepluslazy.Subtract(bruns, aruns)
    65  	if err != nil {
    66  		return false, err
    67  	}
    68  	return isEmpty(combined)
    69  }