package org.jctools.queues.blocking;
import org.jctools.queues.*;
import org.jctools.queues.blocking.*;
import java.util.Collection;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
public class {{blockingQueueClassName}}<E> extends {{queueClassName}}<E> implements BlockingQueue<E>
{
private final {{TakeStrategy}}<E> takeStrategy = new {{TakeStrategy}}<E>();
private final {{PutStrategy}} putStrategy = new {{PutStrategy}}();
public {{blockingQueueClassName}}(int capacity)
{
super(capacity);
}
@Override
public void put(E e) throws InterruptedException
{
putStrategy.waitOffer(this, e);
}
@Override
public E take() throws InterruptedException
{
return takeStrategy.waitPoll(this);
}
@Override
public boolean offer(E e)
{
boolean offered = super.offer(e);
if (offered)
{
takeStrategy.signal();
}
return offered;
}
@Override
public E poll()
{
E e = super.poll();
if (e!=null)
{
putStrategy.signal();
}
return e;
}
@Override
public E poll(long timeout, TimeUnit unit) throws InterruptedException
{
throw new UnsupportedOperationException();
}
@Override
public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException
{
throw new UnsupportedOperationException();
}
@Override
public int remainingCapacity()
{
throw new UnsupportedOperationException();
}
@Override
public int drainTo(Collection<? super E> c)
{
int count = 0;
E e;
while((e = poll()) != null)
{
c.add(e);
count++;
}
return count;
}
@Override
public int drainTo(Collection<? super E> c, int maxElements)
{
int count = 0;
E e;
while(((e = poll()) != null) && count<maxElements)
{
c.add(e);
count++;
}
return count;
}
}