package edu.ucsb.jpregel.system;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
*
* @author Pete Cappello
*/
final public class MessageQ<VertexIdType, MessageValueType>
extends ConcurrentLinkedQueue<Message<VertexIdType, MessageValueType>>
implements Factory
{
private Combiner<VertexIdType, MessageValueType> combiner; // == null: Combining is disabled
MessageQ( Combiner<VertexIdType, MessageValueType> combiner ) { this.combiner = combiner; }
@Override
public boolean add( Message<VertexIdType, MessageValueType> message )
{
if ( combiner != null )
{
Message polled = poll();
if ( polled != null )
{
assert size() == 1 : size();
message = combiner.combine( polled, message );
}
}
return super.add( message );
}
public boolean addAll( MessageQ<VertexIdType, MessageValueType> messageQ )
{
if ( combiner != null )
{
Message polled = poll();
if ( polled != null )
{
assert messageQ.size() == 1 : messageQ.size();
return super.add( combiner.combine( polled, messageQ.remove() ) );
}
}
assert combiner == null || ( isEmpty() && messageQ.size() == 1 );
return super.addAll( messageQ );
}
@Override
public MessageQ<VertexIdType, MessageValueType> make()
{
return new MessageQ<VertexIdType, MessageValueType>( combiner );
}
}