Skip to content
This repository
Fetching contributors…

Cannot retrieve contributors at this time

file 103 lines (87 sloc) 3.68 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2003-2011, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */


package scala.collection.parallel


import scala.collection.Parallel
import scala.collection.mutable.Builder
import scala.collection.generic.Sizing



/** The base trait for all combiners.
* A combiner incremental collection construction just like
* a regular builder, but also implements an efficient merge operation of two builders
* via `combine` method. Once the collection is constructed, it may be obtained by invoking
* the `result` method.
*
* The complexity of the `combine` method should be less than linear for best
* performance. The `result` method doesn't have to be a constant time operation,
* but may be performed in parallel.
*
* @tparam Elem the type of the elements added to the builder
* @tparam To the type of the collection the builder produces
*
* @author Aleksandar Prokopec
* @since 2.9
*/
trait Combiner[-Elem, +To] extends Builder[Elem, To] with Sizing with Parallel {
  
  @transient
  @volatile
  var _combinerTaskSupport = defaultTaskSupport
  
  def combinerTaskSupport = {
    val cts = _combinerTaskSupport
    if (cts eq null) {
      _combinerTaskSupport = defaultTaskSupport
      defaultTaskSupport
    } else cts
  }
  
  def combinerTaskSupport_=(cts: TaskSupport) = _combinerTaskSupport = cts
  
  /** Combines the contents of the receiver builder and the `other` builder,
* producing a new builder containing both their elements.
*
* This method may combine the two builders by copying them into a larger collection,
* by producing a lazy view that gets evaluated once `result` is invoked, or use
* a merge operation specific to the data structure in question.
*
* Note that both the receiver builder and `other` builder become invalidated
* after the invocation of this method, and should be cleared (see `clear`)
* if they are to be used again.
*
* Also, combining two combiners `c1` and `c2` for which `c1 eq c2` is `true`, that is,
* they are the same objects in memory:
*
* {{{
* c1.combine(c2)
* }}}
*
* always does nothing and returns `c1`.
*
* @tparam N the type of elements contained by the `other` builder
* @tparam NewTo the type of collection produced by the `other` builder
* @param other the other builder
* @return the parallel builder containing both the elements of this and the `other` builder
*/
  def combine[N <: Elem, NewTo >: To](other: Combiner[N, NewTo]): Combiner[N, NewTo]

  /** Returns `true` if this combiner has a thread-safe `+=` and is meant to be shared
* across several threads constructing the collection.
*
* By default, this method returns `false`.
*/
  def canBeShared: Boolean = false
  
  /** Constructs the result and sets the appropriate tasksupport object to the resulting collection
* if this is applicable.
*/
  def resultWithTaskSupport: To = {
    val res = result
    setTaskSupport(res, combinerTaskSupport)
  }
  
}


/*
private[collection] trait EnvironmentPassingCombiner[-Elem, +To] extends Combiner[Elem, To] {
abstract override def result = {
val res = super.result
res
}
}
*/
Something went wrong with that request. Please try again.