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 }