diff options
author | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2011-03-18 19:07:38 +0000 |
---|---|---|
committer | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2011-03-18 19:07:38 +0000 |
commit | 86e8f5ae1dccc9f628b6a3f1bdab7e4e81ae9cbb (patch) | |
tree | 2e8a5cc7b5ef666c31a2c99dca990f269b850eb5 /src/library/scala/collection/immutable/HashSet.scala | |
parent | 0554c378653c47aefaabe48b0ef568f952d1695b (diff) | |
download | scala-86e8f5ae1dccc9f628b6a3f1bdab7e4e81ae9cbb.tar.gz scala-86e8f5ae1dccc9f628b6a3f1bdab7e4e81ae9cbb.tar.bz2 scala-86e8f5ae1dccc9f628b6a3f1bdab7e4e81ae9cbb.zip |
Removing toPar* methods, since we've agreed the...
Removing toPar* methods, since we've agreed they're difficult to: -
underestand - maintain
Also, changed the docs and some tests appropriately.
Description:
1) Every collection is now parallelizable - switch to the parallel version of the collection is done via `par`.
- Traversable collections and iterators have `par` return a parallel
- collection of type `ParIterable[A]` with the implementation being the
- representative of `ParIterable`s (currently, `ParArray`). Iterable
- collections do the same thing. Sequences refine `par`'s returns type
- to `ParSeq[A]`. Maps and sets do a similar thing.
The above means that the contract for `par` changed - it is no longer guaranteed to be O(1), nor reflect the same underlying data, as was the case for mutable collections before. Method `par` is now at worst linear.
Furthermore, specific collection implementations override `par` to a more efficient alternative - instead of copying the dataset, the dataset is shared between the old and the new version. Implementation complexity may be sublinear or constant in these cases, and the underlying data structure may be shared. Currently, these data structures include parallel arrays, maps and sets, vectors, hash trie maps and sets, and ranges.
Finally, parallel collections implement `par` trivially.
2) Methods `toMap`, `toSet`, `toSeq` and `toIterable` have been refined
for parallel collections to switch between collection types, however,
they never switch an implementation from parallel to sequential. They
may or may not copy the elements, as is the case with sequential
variants of these methods.
3) The preferred way to switch between different collection types,
whether maps, sets and seqs, or parallel and sequential, is now via use
of methods `toIterable`, `toSeq`, `toSet` and `toMap` in combination
with `par` and `seq`.
Review by odersky.
Diffstat (limited to 'src/library/scala/collection/immutable/HashSet.scala')
-rw-r--r-- | src/library/scala/collection/immutable/HashSet.scala | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/src/library/scala/collection/immutable/HashSet.scala b/src/library/scala/collection/immutable/HashSet.scala index 7d31f20e14..951f6d235e 100644 --- a/src/library/scala/collection/immutable/HashSet.scala +++ b/src/library/scala/collection/immutable/HashSet.scala @@ -32,13 +32,15 @@ import collection.parallel.immutable.ParHashSet class HashSet[A] extends Set[A] with GenericSetTemplate[A, HashSet] with SetLike[A, HashSet[A]] - with Parallelizable[ParHashSet[A]] + with CustomParallelizable[A, ParHashSet[A]] with Serializable { override def companion: GenericCompanion[HashSet] = HashSet //class HashSet[A] extends Set[A] with SetLike[A, HashSet[A]] { + override def par = ParHashSet.fromTrie(this) + override def size: Int = 0 override def empty = HashSet.empty[A] @@ -58,8 +60,6 @@ class HashSet[A] extends Set[A] def - (e: A): HashSet[A] = removed0(e, computeHash(e), 0) - def par = ParHashSet.fromTrie(this) - protected def elemHashCode(key: A) = key.## protected final def improve(hcode: Int) = { @@ -79,8 +79,7 @@ class HashSet[A] extends Set[A] protected def removed0(key: A, hash: Int, level: Int): HashSet[A] = this protected def writeReplace(): AnyRef = new HashSet.SerializationProxy(this) - override def toParIterable = par - override def toParSet[B >: A] = par.asInstanceOf[ParHashSet[B]] + } /** $factoryInfo |