diff --git a/core/src/main/groovy/com/muwire/core/download/Pieces.groovy b/core/src/main/groovy/com/muwire/core/download/Pieces.groovy new file mode 100644 index 00000000..4692525d --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/download/Pieces.groovy @@ -0,0 +1,30 @@ +package com.muwire.core.download + +class Pieces { + private final BitSet bitSet + private final int nPieces + private final Random random = new Random() + + Pieces(int nPieces) { + this.nPieces = nPieces + bitSet = new BitSet(nPieces) + } + + synchronized int getRandomPiece() { + if (isComplete()) + return -1 + while(true) { + int start = random.nextInt(nPieces) + while(bitSet.get(start) && ++start < nPieces); + return start + } + } + + synchronized void markDownloaded(int piece) { + bitSet.set(piece) + } + + synchronized boolean isComplete() { + bitSet.cardinality() == nPieces + } +} diff --git a/core/src/test/groovy/com/muwire/core/download/PiecesTest.groovy b/core/src/test/groovy/com/muwire/core/download/PiecesTest.groovy new file mode 100644 index 00000000..7dc31b78 --- /dev/null +++ b/core/src/test/groovy/com/muwire/core/download/PiecesTest.groovy @@ -0,0 +1,23 @@ +package com.muwire.core.download + +import org.junit.Test + +class PiecesTest { + + Pieces pieces + + @Test + public void testEmpty() { + pieces = new Pieces(20) + assert !pieces.isComplete() + } + + @Test + public void testSinglePiece() { + pieces = new Pieces(1) + assert !pieces.isComplete() + assert pieces.getRandomPiece() == 0 + pieces.markDownloaded(0) + assert pieces.isComplete() + } +}