package com.limegroup.gnutella.downloader;

import com.limegroup.gnutella.util.IntervalSet;

public interface SelectionStrategy {
    /**
     * Encapsulates an algorithm for deciding which block of a file to download next.  
     * 
     * For efficiency reasons attempts will be made to align the start and end of intervals
     * to block boundaries.  However, there are no guarantees on alignment.
     * 
     * @param candidateBytes a representation of the set of 
     *      bytes that are candidates for downloading.  These are the
     *      bytes of the file that a given for download from a given server, minus
     *      the set of bytes that we already have (or have assigned)
     * @param neededBytes a representation of the set of bytes
     *      of the file that have not yet been leased, verified, etc.
     * @param blockSize the maximum size of the returned Interval. Any values less than 1 will
     *      be ignared.  The returned Interval will in no case span a blockSize boundary.
     *      Any values less than 1 will generate IllegalArgumentExceptions.
     * @return the Interval that should be assigned next, which does not span a blockSize boundary
     * @throws NoSuchElementException if passed an empty IntervalSet
     */
    public Interval pickAssignment(IntervalSet candidateBytes, 
            IntervalSet neededBytes,
            long blockSize) throws java.util.NoSuchElementException;
}
