aboutsummaryrefslogtreecommitdiff
path: root/meta/piece.go
blob: 247f848b480fc6114386611416be6e457532a300 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package meta

import (
	"crypto/sha1"
	"fmt"

	"dim13.org/btget/bitfield"
)

type Pieces []Piece

type Piece struct {
	Offset int64
	Length int
	Sum    [sha1.Size]byte
	Ok     bool
}

func (p *Piece) Check(b []byte) bool {
	if !p.Ok {
		p.Ok = sha1.Sum(b) == p.Sum
	}
	return p.Ok
}

type Percent float64

func (p Percent) String() string {
	return fmt.Sprintf("%6.2f%%", p)
}

func (p Pieces) Good() Percent {
	var good int
	for _, v := range p {
		if v.Ok {
			good++
		}
	}
	return Percent(good) * 100.0 / Percent(len(p))
}

func (p Pieces) BitField() bitfield.BitField {
	bf := bitfield.New(len(p))
	for i, v := range p {
		if v.Ok {
			bf.Set(i)
		}
	}
	return bf
}