From 789d0b498ad424a4f602d6082d764968be456ebe Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 21 Jun 2016 17:47:03 +0200 Subject: Add bitfield --- bitfield/bitfield.go | 38 ++++++++++++++++++++++++++++++++++++++ bitfield/bitfield_test.go | 16 ++++++++++++++++ peer/peer.go | 7 ++++--- 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 bitfield/bitfield.go create mode 100644 bitfield/bitfield_test.go diff --git a/bitfield/bitfield.go b/bitfield/bitfield.go new file mode 100644 index 0000000..2346a2c --- /dev/null +++ b/bitfield/bitfield.go @@ -0,0 +1,38 @@ +package bitfield + +type BitField []byte + +func New(n int) BitField { + l := n / 8 + if pad := (8 - n%8) % 8; pad != 0 { + l++ + } + return make(BitField, l) +} + +func (b BitField) At(i int) bool { + x := i / 8 + y := 7 - uint(i%8) + if x < 0 || x > len(b) { + panic("out of range") + } + return (int(b[x]>>y) & 1) == 1 +} + +func (b BitField) Set(i int) { + x := i / 8 + y := 7 - uint(i%8) + if x < 0 || x > len(b) { + panic("out of range") + } + b[x] |= 1 << y +} + +func (b BitField) Clear(i int) { + x := i / 8 + y := 7 - uint(i%8) + if x < 0 || x > len(b) { + panic("out of range") + } + b[x] &= ^(1 << y) +} diff --git a/bitfield/bitfield_test.go b/bitfield/bitfield_test.go new file mode 100644 index 0000000..4b7218a --- /dev/null +++ b/bitfield/bitfield_test.go @@ -0,0 +1,16 @@ +package bitfield + +import "testing" + +func TestNew(t *testing.T) { + bf := New(63) + bf.Set(7) + if !bf.At(7) { + t.Error("expected set") + } + bf.Clear(7) + if bf.At(7) { + t.Error("expected cleared") + } + t.Log("len:", len(bf), bf, bf.At(7)) +} diff --git a/peer/peer.go b/peer/peer.go index 565de38..1784eac 100644 --- a/peer/peer.go +++ b/peer/peer.go @@ -2,8 +2,9 @@ package peer import ( "bytes" - "math/big" "net" + + "dim13.org/btget/bitfield" ) const ( @@ -25,7 +26,7 @@ type Peer struct { Intersting bool // local Optimistic bool buf *bytes.Buffer - bitField *big.Int // see Bit, SetBit ans Bytes + bitField bitfield.BitField } func NewPeer(addr string) (Peer, error) { @@ -33,5 +34,5 @@ func NewPeer(addr string) (Peer, error) { if err != nil { return Peer{}, err } - return Peer{Addr: a, Choked: true, Choking: true, bitField: new(big.Int)}, nil + return Peer{Addr: a, Choked: true, Choking: true}, nil } -- cgit v1.2.3