4 g "github.com/anacrolix/generics"
8 Info *Info // Can we embed the fields here instead, or is it something to do with saving memory?
14 func (p Piece) Length() int64 {
17 pieceLength := p.Info.PieceLength
18 lastFileEnd := int64(0)
20 p.Info.FileTree.upvertedFiles(pieceLength, func(fi FileInfo) {
24 fileStartPiece := int(offset / pieceLength)
25 if fileStartPiece > p.i {
29 lastFileEnd = offset + fi.Length
30 offset = (lastFileEnd + pieceLength - 1) / pieceLength * pieceLength
32 ret := min(lastFileEnd-int64(p.i)*pieceLength, pieceLength)
41 func (p Piece) V1Length() int64 {
43 lastPiece := p.Info.NumPieces() - 1
45 case 0 <= i && i < lastPiece:
46 return p.Info.PieceLength
47 case lastPiece >= 0 && i == lastPiece:
48 files := p.Info.UpvertedFiles()
49 lastFile := files[len(files)-1]
50 length := lastFile.TorrentOffset + lastFile.Length - int64(i)*p.Info.PieceLength
51 if length <= 0 || length > p.Info.PieceLength {
60 func (p Piece) Offset() int64 {
61 return int64(p.i) * p.Info.PieceLength
64 func (p Piece) V1Hash() (ret g.Option[Hash]) {
68 copy(ret.Value[:], p.Info.Pieces[p.i*HashSize:(p.i+1)*HashSize])
73 func (p Piece) Index() int {