github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/network/bitvector/bitvector.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 12:09:47</date>
    10  //</624342671938293760>
    11  
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  //
    25  //
    26  //
    27  
    28  package bitvector
    29  
    30  import (
    31  	"errors"
    32  )
    33  
    34  var errInvalidLength = errors.New("invalid length")
    35  
    36  type BitVector struct {
    37  	len int
    38  	b   []byte
    39  }
    40  
    41  func New(l int) (bv *BitVector, err error) {
    42  	return NewFromBytes(make([]byte, l/8+1), l)
    43  }
    44  
    45  func NewFromBytes(b []byte, l int) (bv *BitVector, err error) {
    46  	if l <= 0 {
    47  		return nil, errInvalidLength
    48  	}
    49  	if len(b)*8 < l {
    50  		return nil, errInvalidLength
    51  	}
    52  	return &BitVector{
    53  		len: l,
    54  		b:   b,
    55  	}, nil
    56  }
    57  
    58  func (bv *BitVector) Get(i int) bool {
    59  	bi := i / 8
    60  	return bv.b[bi]&(0x1<<uint(i%8)) != 0
    61  }
    62  
    63  func (bv *BitVector) Set(i int, v bool) {
    64  	bi := i / 8
    65  	cv := bv.Get(i)
    66  	if cv != v {
    67  		bv.b[bi] ^= 0x1 << uint8(i%8)
    68  	}
    69  }
    70  
    71  func (bv *BitVector) Bytes() []byte {
    72  	return bv.b
    73  }
    74  
    75  func (bv *BitVector) Length() int {
    76  	return bv.len
    77  }
    78