|
org.codehaus.gpars | |||||||
FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object groovyx.gpars.serial.WithSerialId groovyx.gpars.dataflow.expression.DataflowExpression
@SuppressWarnings({"UnqualifiedStaticUsage", "CallToSimpleGetterFromWithinClass", "ConstantDeclaredInAbstractClass", "unchecked"}) public abstract class DataflowExpression extends WithSerialId
The base class for all dataflow elements.
Nested Class Summary | |
---|---|
static class |
DataflowExpression.BindDataflow
Represents a remote message binding a value to a remoted DataflowExpression |
class |
DataflowExpression.DataflowExpressionsCollector
Listener for availability of data flow expressions we depend on. |
private static class |
DataflowExpression.TransformMany
|
private static class |
DataflowExpression.TransformOne
|
private static class |
DataflowExpression.WaitingThread
A logical representation of a synchronous or asynchronous request to read the value once it is bound. |
Field Summary | |
---|---|
private static java.lang.String |
ATTACHMENT
|
private static java.lang.String |
RESULT
|
protected static int |
S_INITIALIZED
|
protected static int |
S_INITIALIZING
|
protected static int |
S_NOT_INITIALIZED
Possible states |
private static DataflowExpression.WaitingThread |
dummyWaitingThread
A request chain terminator |
protected java.lang.Throwable |
error
|
private DataflowChannelEventOrchestrator |
eventManager
|
private groovy.lang.MetaClass |
metaClass
The current metaclass |
private static long |
serialVersionUID
|
protected java.util.concurrent.atomic.AtomicInteger |
state
Holds the current state of the variable |
protected java.lang.Object |
value
Holds the actual value. |
private java.util.concurrent.atomic.AtomicReference |
waiting
Points to the head of the chain of requests waiting for a value to be bound |
Fields inherited from class WithSerialId | |
---|---|
serialHandle, serialVersionUID |
Constructor Summary | |
DataflowExpression()
|
Method Summary | |
---|---|
protected java.lang.Object
|
DataflowExpression()
Creates a new unbound Dataflow Expression |
void
|
binaryChoice(DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
|
void
|
binaryChoice(Pool pool, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
|
void
|
binaryChoice(PGroup group, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
|
void
|
binaryChoice(java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
|
void
|
binaryChoice(Pool pool, java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
|
void
|
binaryChoice(PGroup group, java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
|
void
|
bind(java.lang.Object value)
Assigns a value to the variable. |
void
|
bindError(java.lang.Throwable e)
|
void
|
bindSafely(java.lang.Object value)
Assigns a value to the variable. |
void
|
bindUnique(java.lang.Object value)
Assigns a value to the variable. |
DataflowReadChannel
|
chainWith(groovy.lang.Closure closure)
|
DataflowReadChannel
|
chainWith(Pool pool, groovy.lang.Closure closure)
|
DataflowReadChannel
|
chainWith(PGroup group, groovy.lang.Closure closure)
|
DataflowReadChannel
|
chainWith(java.util.Map params, groovy.lang.Closure closure)
|
DataflowReadChannel
|
chainWith(Pool pool, java.util.Map params, groovy.lang.Closure closure)
|
DataflowReadChannel
|
chainWith(PGroup group, java.util.Map params, groovy.lang.Closure closure)
|
void
|
choice(java.util.List outputs, groovy.lang.Closure code)
|
void
|
choice(Pool pool, java.util.List outputs, groovy.lang.Closure code)
|
void
|
choice(PGroup group, java.util.List outputs, groovy.lang.Closure code)
|
void
|
choice(java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
|
void
|
choice(Pool pool, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
|
void
|
choice(PGroup group, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
|
private void
|
doBind(java.lang.Object value)
Performs the actual bind operation, unblocks all blocked threads and informs all asynchronously waiting actors. |
protected void
|
doBindImpl(java.lang.Object value)
|
void
|
doBindRemote(java.util.UUID hostId, java.lang.Object message)
Binds the value after receiving a bing message over the wire |
protected java.lang.Object
|
evaluate()
Evaluates the expression after the ones we depend on are ready |
DataflowReadChannel
|
filter(groovy.lang.Closure closure)
|
DataflowReadChannel
|
filter(Pool pool, groovy.lang.Closure closure)
|
DataflowReadChannel
|
filter(PGroup group, groovy.lang.Closure closure)
|
DataflowReadChannel
|
filter(java.util.Map params, groovy.lang.Closure closure)
|
DataflowReadChannel
|
filter(Pool pool, java.util.Map params, groovy.lang.Closure closure)
|
DataflowReadChannel
|
filter(PGroup group, java.util.Map params, groovy.lang.Closure closure)
|
private void
|
fireOnMessage(java.lang.Object value)
|
DataflowChannelEventListenerManager
|
getEventManager()
|
groovy.lang.MetaClass
|
getMetaClass()
|
java.lang.Object
|
getProperty(java.lang.String propertyName)
Returns either standard property of the expression or creates an expression, which will request given property when the receiver becomes available |
java.lang.Object
|
getVal()
Reads the value of the variable. |
java.lang.Object
|
getVal(long timeout, java.util.concurrent.TimeUnit units)
Reads the value of the variable. |
void
|
getValAsync(MessageStream callback)
Asynchronously retrieves the value of the variable. |
void
|
getValAsync(java.lang.Object attachment, MessageStream callback)
Used by Dataflow operators. |
private static void
|
handleInterruption(java.util.concurrent.atomic.AtomicBoolean newWaiting)
|
void
|
into(DataflowWriteChannel target)
|
void
|
into(Pool pool, DataflowWriteChannel target)
|
void
|
into(PGroup group, DataflowWriteChannel target)
|
void
|
into(java.util.Map params, DataflowWriteChannel target)
|
void
|
into(Pool pool, java.util.Map params, DataflowWriteChannel target)
|
void
|
into(PGroup group, java.util.Map params, DataflowWriteChannel target)
|
java.lang.Object
|
invokeMethod(java.lang.String name, java.lang.Object args)
Invokes the method on itself or creates an expression, which will invoke the method n the bound value, once it is available. |
boolean
|
isBound()
Check if value has been set already for this expression |
void
|
join()
Blocks, if the value has not been assigned yet to the DataflowVariable |
void
|
join(long timeout, java.util.concurrent.TimeUnit units)
Blocks, if the value has not been assigned yet to the DataflowVariable |
int
|
length()
|
DataflowReadChannel
|
merge(DataflowReadChannel other, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(Pool pool, DataflowReadChannel other, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(PGroup group, DataflowReadChannel other, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(java.util.List others, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(Pool pool, java.util.List others, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(PGroup group, java.util.List others, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(Pool pool, java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(PGroup group, java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(java.util.Map params, java.util.List others, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(Pool pool, java.util.Map params, java.util.List others, groovy.lang.Closure closure)
|
DataflowReadChannel
|
merge(PGroup group, java.util.Map params, java.util.List others, groovy.lang.Closure closure)
|
private void
|
notifyRemote(java.util.UUID hostId)
Sends notifications to all subscribers |
DataflowReadChannel
|
or(groovy.lang.Closure closure)
|
void
|
or(DataflowWriteChannel target)
|
DataflowExpression
|
poll()
Retrieves the bound value. |
Promise
|
rightShift(groovy.lang.Closure closure)
Schedule closure to be executed by pooled actor after data became available. |
protected void
|
scheduleCallback(java.lang.Object attachment, MessageStream callback)
Sends the result back to the actor, which is waiting asynchronously for the value to be bound. |
void
|
separate(java.util.List outputs, groovy.lang.Closure code)
|
void
|
separate(Pool pool, java.util.List outputs, groovy.lang.Closure code)
|
void
|
separate(PGroup group, java.util.List outputs, groovy.lang.Closure code)
|
void
|
separate(java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
|
void
|
separate(Pool pool, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
|
void
|
separate(PGroup group, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
|
void
|
setMetaClass(groovy.lang.MetaClass metaClass)
|
void
|
setProperty(java.lang.String propertyName, java.lang.Object newValue)
|
void
|
split(DataflowWriteChannel target1, DataflowWriteChannel target2)
|
void
|
split(Pool pool, DataflowWriteChannel target1, DataflowWriteChannel target2)
|
void
|
split(PGroup group, DataflowWriteChannel target1, DataflowWriteChannel target2)
|
void
|
split(java.util.List targets)
|
void
|
split(Pool pool, java.util.List targets)
|
void
|
split(PGroup group, java.util.List targets)
|
void
|
split(java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)
|
void
|
split(Pool pool, java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)
|
void
|
split(PGroup group, java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)
|
void
|
split(java.util.Map params, java.util.List targets)
|
void
|
split(Pool pool, java.util.Map params, java.util.List targets)
|
void
|
split(PGroup group, java.util.Map params, java.util.List targets)
|
protected void
|
subscribe()
A utility method to call at the very end of constructors of derived expressions. |
protected void
|
subscribe(DataflowExpression.DataflowExpressionsCollector listener)
|
DataflowReadChannel
|
tap(DataflowWriteChannel target)
|
DataflowReadChannel
|
tap(Pool pool, DataflowWriteChannel target)
|
DataflowReadChannel
|
tap(PGroup group, DataflowWriteChannel target)
|
DataflowReadChannel
|
tap(java.util.Map params, DataflowWriteChannel target)
|
DataflowReadChannel
|
tap(Pool pool, java.util.Map params, DataflowWriteChannel target)
|
DataflowReadChannel
|
tap(PGroup group, java.util.Map params, DataflowWriteChannel target)
|
Promise
|
then(groovy.lang.Closure closure)
Schedule closure to be executed after data became available. |
Promise
|
then(Pool pool, groovy.lang.Closure closure)
Schedule closure to be executed after data becomes available. |
Promise
|
then(PGroup group, groovy.lang.Closure closure)
Schedule closure to be executed after data becomes available. |
java.lang.String
|
toString()
|
static DataflowExpression
|
transform(java.lang.Object another, groovy.lang.Closure closure)
Transforms values bound eventually to dataflow variables using the supplied closure. |
void
|
whenBound(groovy.lang.Closure closure)
Schedule closure to be executed by pooled actor after data becomes available. |
void
|
whenBound(Pool pool, groovy.lang.Closure closure)
Schedule closure to be executed by pooled actor after data becomes available. |
void
|
whenBound(PGroup group, groovy.lang.Closure closure)
Schedule closure to be executed by pooled actor after data becomes available. |
void
|
whenBound(MessageStream stream)
Send the bound data to provided stream when it becomes available |
void
|
wheneverBound(groovy.lang.Closure closure)
Send all pieces of data bound in the future to the provided stream when it becomes available |
void
|
wheneverBound(MessageStream stream)
Send all pieces of data bound in the future to the provided stream when it becomes available. |
Methods inherited from class WithSerialId | |
---|---|
createRemoteHandle, getOrCreateSerialHandle, getRemoteClass, writeReplace |
Field Detail |
---|
private static final java.lang.String ATTACHMENT
private static final java.lang.String RESULT
protected static final int S_INITIALIZED
protected static final int S_INITIALIZING
protected static final int S_NOT_INITIALIZED
private static final DataflowExpression.WaitingThread dummyWaitingThread
protected java.lang.Throwable error
private DataflowChannelEventOrchestrator eventManager
private groovy.lang.MetaClass metaClass
private static final long serialVersionUID
protected final java.util.concurrent.atomic.AtomicInteger state
@SuppressWarnings({"InstanceVariableMayNotBeInitialized"}) protected java.lang.Object value
private final java.util.concurrent.atomic.AtomicReference waiting
Constructor Detail |
---|
DataflowExpression()
Method Detail |
---|
protected java.lang.Object DataflowExpression()
@Override public void binaryChoice(DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
@Override public void binaryChoice(Pool pool, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
@Override public void binaryChoice(PGroup group, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
@Override public void binaryChoice(java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
@Override public void binaryChoice(Pool pool, java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
@Override public void binaryChoice(PGroup group, java.util.Map params, DataflowWriteChannel trueBranch, DataflowWriteChannel falseBranch, groovy.lang.Closure code)
public final void bind(java.lang.Object value)
value
- The value to assign
public final void bindError(java.lang.Throwable e)
public final void bindSafely(java.lang.Object value)
value
- The value to assign
public final void bindUnique(java.lang.Object value)
value
- The value to assign
@Override public final DataflowReadChannel chainWith(groovy.lang.Closure closure)
@Override public final DataflowReadChannel chainWith(Pool pool, groovy.lang.Closure closure)
@SuppressWarnings({"ClassReferencesSubclass"}) @Override public DataflowReadChannel chainWith(PGroup group, groovy.lang.Closure closure)
@Override public final DataflowReadChannel chainWith(java.util.Map params, groovy.lang.Closure closure)
@Override public final DataflowReadChannel chainWith(Pool pool, java.util.Map params, groovy.lang.Closure closure)
@SuppressWarnings({"ClassReferencesSubclass"}) @Override public DataflowReadChannel chainWith(PGroup group, java.util.Map params, groovy.lang.Closure closure)
@Override public void choice(java.util.List outputs, groovy.lang.Closure code)
@Override public void choice(Pool pool, java.util.List outputs, groovy.lang.Closure code)
@Override public void choice(PGroup group, java.util.List outputs, groovy.lang.Closure code)
@Override public void choice(java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
@Override public void choice(Pool pool, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
@Override public void choice(PGroup group, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
private void doBind(java.lang.Object value)
value
- The value to assign
protected void doBindImpl(java.lang.Object value)
public final void doBindRemote(java.util.UUID hostId, java.lang.Object message)
hostId
- Id of the bind originator hostmessage
- The value to bind
protected java.lang.Object evaluate()
@Override public DataflowReadChannel filter(groovy.lang.Closure closure)
@Override public DataflowReadChannel filter(Pool pool, groovy.lang.Closure closure)
@Override public DataflowReadChannel filter(PGroup group, groovy.lang.Closure closure)
@Override public DataflowReadChannel filter(java.util.Map params, groovy.lang.Closure closure)
@Override public DataflowReadChannel filter(Pool pool, java.util.Map params, groovy.lang.Closure closure)
@Override public DataflowReadChannel filter(PGroup group, java.util.Map params, groovy.lang.Closure closure)
private void fireOnMessage(java.lang.Object value)
@Override public DataflowChannelEventListenerManager getEventManager()
@Override public final groovy.lang.MetaClass getMetaClass()
@Override public final java.lang.Object getProperty(java.lang.String propertyName)
propertyName
- The name of the property to retrieve
@Override public java.lang.Object getVal()
@Override public java.lang.Object getVal(long timeout, java.util.concurrent.TimeUnit units)
timeout
- The timeout valueunits
- Units for the timeout
@Override public final void getValAsync(MessageStream callback)
callback
- An actor to send the bound value to.
@Override public final void getValAsync(java.lang.Object attachment, MessageStream callback)
attachment
- arbitrary non-null attachment if reader needs better identification of resultcallback
- An actor to send the bound value plus the supplied index to.
private static void handleInterruption(java.util.concurrent.atomic.AtomicBoolean newWaiting)
@Override public void into(DataflowWriteChannel target)
@Override public void into(Pool pool, DataflowWriteChannel target)
@Override public void into(PGroup group, DataflowWriteChannel target)
@Override public void into(java.util.Map params, DataflowWriteChannel target)
@Override public void into(Pool pool, java.util.Map params, DataflowWriteChannel target)
@Override public void into(PGroup group, java.util.Map params, DataflowWriteChannel target)
@Override public final java.lang.Object invokeMethod(java.lang.String name, java.lang.Object args)
@Override public final boolean isBound()
public final void join()
public final void join(long timeout, java.util.concurrent.TimeUnit units)
timeout
- The timeout valueunits
- Units for the timeout
@Override public final int length()
@Override public DataflowReadChannel merge(DataflowReadChannel other, groovy.lang.Closure closure)
@Override public DataflowReadChannel merge(Pool pool, DataflowReadChannel other, groovy.lang.Closure closure)
@Override public DataflowReadChannel merge(PGroup group, DataflowReadChannel other, groovy.lang.Closure closure)
@Override public DataflowReadChannel merge(java.util.List others, groovy.lang.Closure closure)
@Override public DataflowReadChannel merge(Pool pool, java.util.List others, groovy.lang.Closure closure)
@SuppressWarnings({"ClassReferencesSubclass"}) @Override public DataflowReadChannel merge(PGroup group, java.util.List others, groovy.lang.Closure closure)
@Override public DataflowReadChannel merge(java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)
@Override public DataflowReadChannel merge(Pool pool, java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)
@Override public DataflowReadChannel merge(PGroup group, java.util.Map params, DataflowReadChannel other, groovy.lang.Closure closure)
@Override public DataflowReadChannel merge(java.util.Map params, java.util.List others, groovy.lang.Closure closure)
@Override public DataflowReadChannel merge(Pool pool, java.util.Map params, java.util.List others, groovy.lang.Closure closure)
@SuppressWarnings({"ClassReferencesSubclass"}) @Override public DataflowReadChannel merge(PGroup group, java.util.Map params, java.util.List others, groovy.lang.Closure closure)
private void notifyRemote(java.util.UUID hostId)
hostId
- The local host id
@Override public DataflowReadChannel or(groovy.lang.Closure closure)
@Override public void or(DataflowWriteChannel target)
@Override public final DataflowExpression poll()
@Override public final Promise rightShift(groovy.lang.Closure closure)
closure
- closure to execute when data becomes available. The closure should take at most one argument.
@SuppressWarnings({"TypeMayBeWeakened"}) protected void scheduleCallback(java.lang.Object attachment, MessageStream callback)
attachment
- An arbitrary object identifying the requestcallback
- The actor to send the message to
@Override public void separate(java.util.List outputs, groovy.lang.Closure code)
@Override public void separate(Pool pool, java.util.List outputs, groovy.lang.Closure code)
@Override public void separate(PGroup group, java.util.List outputs, groovy.lang.Closure code)
@Override public void separate(java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
@Override public void separate(Pool pool, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
@Override public void separate(PGroup group, java.util.Map params, java.util.List outputs, groovy.lang.Closure code)
@Override public final void setMetaClass(groovy.lang.MetaClass metaClass)
@Override public final void setProperty(java.lang.String propertyName, java.lang.Object newValue)
@Override public void split(DataflowWriteChannel target1, DataflowWriteChannel target2)
@Override public void split(Pool pool, DataflowWriteChannel target1, DataflowWriteChannel target2)
@Override public void split(PGroup group, DataflowWriteChannel target1, DataflowWriteChannel target2)
@Override public void split(java.util.List targets)
@Override public void split(Pool pool, java.util.List targets)
@Override public void split(PGroup group, java.util.List targets)
@Override public void split(java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)
@Override public void split(Pool pool, java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)
@Override public void split(PGroup group, java.util.Map params, DataflowWriteChannel target1, DataflowWriteChannel target2)
@Override public void split(java.util.Map params, java.util.List targets)
@Override public void split(Pool pool, java.util.Map params, java.util.List targets)
@Override public void split(PGroup group, java.util.Map params, java.util.List targets)
protected final void subscribe()
protected void subscribe(DataflowExpression.DataflowExpressionsCollector listener)
@Override public DataflowReadChannel tap(DataflowWriteChannel target)
@Override public DataflowReadChannel tap(Pool pool, DataflowWriteChannel target)
@SuppressWarnings({"ClassReferencesSubclass"}) @Override public DataflowReadChannel tap(PGroup group, DataflowWriteChannel target)
@Override public DataflowReadChannel tap(java.util.Map params, DataflowWriteChannel target)
@Override public DataflowReadChannel tap(Pool pool, java.util.Map params, DataflowWriteChannel target)
@SuppressWarnings({"ClassReferencesSubclass"}) @Override public DataflowReadChannel tap(PGroup group, java.util.Map params, DataflowWriteChannel target)
@Override public final Promise then(groovy.lang.Closure closure)
closure
- closure to execute when data becomes available. The closure should take at most one argument.
@Override public final Promise then(Pool pool, groovy.lang.Closure closure)
pool
- The thread pool to use for task scheduling for asynchronous message deliveryclosure
- closure to execute when data becomes available. The closure should take at most one argument.
@Override public final Promise then(PGroup group, groovy.lang.Closure closure)
group
- The PGroup to use for task scheduling for asynchronous message deliveryclosure
- closure to execute when data becomes available. The closure should take at most one argument.
@SuppressWarnings({"ArithmeticOnVolatileField"}) @Override public java.lang.String toString()
public static DataflowExpression transform(java.lang.Object another, groovy.lang.Closure closure)
another
- A list of DataflowVariables to transformclosure
- The transformation function, which must take the same number of arguments as there are elements in the "another" list
- Type of the bound values
@Override public final void whenBound(groovy.lang.Closure closure)
closure
- closure to execute when data becomes available. The closure should take at most one argument.
@Override public void whenBound(Pool pool, groovy.lang.Closure closure)
pool
- The thread pool to use for task scheduling for asynchronous message deliveryclosure
- closure to execute when data becomes available. The closure should take at most one argument.
@Override public final void whenBound(PGroup group, groovy.lang.Closure closure)
group
- The PGroup to use for task scheduling for asynchronous message deliveryclosure
- closure to execute when data becomes available. The closure should take at most one argument.
@Override public final void whenBound(MessageStream stream)
stream
- stream where to send result
@Override public final void wheneverBound(groovy.lang.Closure closure)
closure
- closure to execute when data becomes available. The closure should take at most one argument.
@Override public final void wheneverBound(MessageStream stream)
stream
- stream where to send result
Copyright © 2008–2012 Václav Pech. All Rights Reserved.