summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/parallel/immutable/ParHashSet.scala
diff options
context:
space:
mode:
authorAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2010-11-08 08:52:20 +0000
committerAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2010-11-08 08:52:20 +0000
commit09ed9d12c343ee972861c8439fd10596903efe59 (patch)
treeea2735b13b43d4132664d8b3d6a9c23e2b709b7e /src/library/scala/collection/parallel/immutable/ParHashSet.scala
parent056663c3f22b8c03f222856305ef99e3ed029889 (diff)
downloadscala-09ed9d12c343ee972861c8439fd10596903efe59.tar.gz
scala-09ed9d12c343ee972861c8439fd10596903efe59.tar.bz2
scala-09ed9d12c343ee972861c8439fd10596903efe59.zip
Added size maps to flat hash tables.
Added parallel mutable hash sets. Implemented parallel mutable hash set iterators. Implemented parallel mutable hash set combiners. Factored out unrolled linked lists into a separate class UnrolledBuffer, added tests. Added parallel mutable hash set tests, and debugged hashsets. No review.
Diffstat (limited to 'src/library/scala/collection/parallel/immutable/ParHashSet.scala')
-rw-r--r--src/library/scala/collection/parallel/immutable/ParHashSet.scala24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/library/scala/collection/parallel/immutable/ParHashSet.scala b/src/library/scala/collection/parallel/immutable/ParHashSet.scala
index 33e2e7102a..66ded02397 100644
--- a/src/library/scala/collection/parallel/immutable/ParHashSet.scala
+++ b/src/library/scala/collection/parallel/immutable/ParHashSet.scala
@@ -11,7 +11,8 @@ import scala.collection.parallel.ParSetLike
import scala.collection.parallel.Combiner
import scala.collection.parallel.ParIterableIterator
import scala.collection.parallel.EnvironmentPassingCombiner
-import scala.collection.parallel.Unrolled
+import scala.collection.parallel.UnrolledBuffer.Unrolled
+import scala.collection.parallel.UnrolledBuffer
import scala.collection.generic.ParSetFactory
import scala.collection.generic.CanCombineFrom
import scala.collection.generic.GenericParTemplate
@@ -112,26 +113,25 @@ self: EnvironmentPassingCombiner[T, ParHashSet[T]] =>
sz += 1
val hc = emptyTrie.computeHash(elem)
val pos = hc & 0x1f
- if (lasts(pos) eq null) {
+ if (buckets(pos) eq null) {
// initialize bucket
- heads(pos) = new Unrolled[Any]
- lasts(pos) = heads(pos)
+ buckets(pos) = new UnrolledBuffer[Any]
}
// add to bucket
- lasts(pos) = lasts(pos).add(elem)
+ buckets(pos) += elem
this
}
def result = {
- val buckets = heads.filter(_ != null)
- val root = new Array[HashSet[T]](buckets.length)
+ val bucks = buckets.filter(_ != null).map(_.headPtr)
+ val root = new Array[HashSet[T]](bucks.length)
- executeAndWaitResult(new CreateTrie(buckets, root, 0, buckets.length))
+ executeAndWaitResult(new CreateTrie(bucks, root, 0, bucks.length))
var bitmap = 0
var i = 0
while (i < rootsize) {
- if (heads(i) ne null) bitmap |= 1 << i
+ if (buckets(i) ne null) bitmap |= 1 << i
i += 1
}
val sz = root.foldLeft(0)(_ + _.size)
@@ -146,14 +146,14 @@ self: EnvironmentPassingCombiner[T, ParHashSet[T]] =>
/* tasks */
- class CreateTrie(buckets: Array[Unrolled[Any]], root: Array[HashSet[T]], offset: Int, howmany: Int)
+ class CreateTrie(bucks: Array[Unrolled[Any]], root: Array[HashSet[T]], offset: Int, howmany: Int)
extends super.Task[Unit, CreateTrie] {
var result = ()
def leaf(prev: Option[Unit]) = {
var i = offset
val until = offset + howmany
while (i < until) {
- root(i) = createTrie(buckets(i))
+ root(i) = createTrie(bucks(i))
i += 1
}
}
@@ -179,7 +179,7 @@ self: EnvironmentPassingCombiner[T, ParHashSet[T]] =>
}
def split = {
val fp = howmany / 2
- List(new CreateTrie(buckets, root, offset, fp), new CreateTrie(buckets, root, offset + fp, howmany - fp))
+ List(new CreateTrie(bucks, root, offset, fp), new CreateTrie(bucks, root, offset + fp, howmany - fp))
}
def shouldSplitFurther = howmany > collection.parallel.thresholdFromSize(root.length, parallelismLevel)
}