...

Source file src/github.com/concurrency-8/queue/queue.go

Documentation: github.com/concurrency-8/queue

     1  package queue
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/concurrency-8/parser"
     6  )
     7  
     8  // Queue object for storing requested pieces
     9  type Queue struct {
    10  	torrent parser.TorrentFile
    11  	Choked  bool
    12  	queue   []parser.PieceBlock
    13  }
    14  
    15  // NewQueue returns a fresh pointer to a Queue object
    16  func NewQueue(torrent parser.TorrentFile) (queue *Queue) {
    17  	queue = &Queue{torrent, true, make([]parser.PieceBlock, 0)}
    18  	return
    19  }
    20  
    21  // Enqueue adds a piece to queue
    22  func (queue *Queue) Enqueue(pieceIndex uint32) (err error) {
    23  	nBlocks, err := parser.BlocksPerPiece(queue.torrent, pieceIndex)
    24  
    25  	if err != nil {
    26  		return
    27  	}
    28  
    29  	for i := 0; i < int(nBlocks); i++ {
    30  		blocklen, err := parser.BlockLen(queue.torrent, pieceIndex, uint32(i))
    31  		if err != nil {
    32  			break
    33  		}
    34  
    35  		pieceBlock := parser.PieceBlock{
    36  			Index:   pieceIndex,
    37  			Begin:   uint32(i) * parser.BLOCK_LEN,
    38  			Length:  blocklen,
    39  			Nblocks: nBlocks,
    40  		}
    41  		queue.queue = append(queue.queue, pieceBlock)
    42  
    43  	}
    44  	return
    45  }
    46  
    47  // Dequeue removes first piece block
    48  func (queue *Queue) Dequeue() error {
    49  	if queue.Length() == 0 {
    50  		return fmt.Errorf("Queue empty : can't dequeue")
    51  	}
    52  
    53  	queue.queue = queue.queue[1:]
    54  	return nil
    55  }
    56  
    57  // Peek returns first pieceblock
    58  func (queue *Queue) Peek() (block parser.PieceBlock, err error) {
    59  
    60  	if queue.Length() == 0 {
    61  		err = fmt.Errorf("Queue empty : can't peek")
    62  	} else {
    63  		block = queue.queue[0]
    64  	}
    65  	return
    66  }
    67  
    68  // Length returns length of queue
    69  func (queue *Queue) Length() int {
    70  	return len(queue.queue)
    71  }
    72  

View as plain text