/*******************************************************************************
 * Copyright (c) 2013, 2015 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.common.utility.internal.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import org.eclipse.jpt.common.utility.collection.Queue;
import org.eclipse.jpt.common.utility.collection.Stack;

/**
 * {@link Queue} utility methods.
 */
public final class QueueTools {

	// ********** enqueue all **********

	/**
	 * Enqueue all the elements returned by the specified iterable
	 * on the specified queue.
	 * Return the queue.
	 */
	public static <Q extends Queue<? super E>, E> Q enqueueAll(Q queue, Iterable<? extends E> iterable) {
		return enqueueAll(queue, iterable.iterator());
	}

	/**
	 * Enqueue all the elements returned by the specified iterator
	 * on the specified queue.
	 * Return the queue.
	 */
	public static <Q extends Queue<? super E>, E> Q enqueueAll(Q queue, Iterator<? extends E> iterator) {
		while (iterator.hasNext()) {
			queue.enqueue(iterator.next());
		}
		return queue;
	}

	/**
	 * Enqueue all the elements in the specified array
	 * on the specified queue.
	 * Return the queue.
	 */
	public static <Q extends Queue<? super E>, E> Q enqueueAll(Q queue, E... array) {
		for (E element : array) {
			queue.enqueue(element);
		}
		return queue;
	}

	/**
	 * Pop all the elements from the specified stack and enqueue them
	 * on the specified queue.
	 * Return the queue.
	 */
	public static <Q extends Queue<? super E>, E> Q enqueueAll(Q queue, Stack<? extends E> stack) {
		while ( ! stack.isEmpty()) {
			queue.enqueue(stack.pop());
		}
		return queue;
	}

	/**
	 * Dequeue all the elements from the second specified queue and enqueue them
	 * on the first specified queue.
	 * Return the first queue.
	 * @see #drainTo(Queue, Queue)
	 */
	public static <Q extends Queue<? super E>, E> Q enqueueAll(Q queue1, Queue<? extends E> queue2) {
		while ( ! queue2.isEmpty()) {
			queue1.enqueue(queue2.dequeue());
		}
		return queue1;
	}


	// ********** drain **********

	/**
	 * Drain all the elements from the specified queue and return them in a
	 * list.
	 */
	public static <E> ArrayList<E> drain(Queue<? extends E> queue) {
		return drainTo(queue, new ArrayList<E>());
	}

	/**
	 * Drain all the elements from the specified queue and add them to the
	 * specified collection.
	 * Return the collection.
	 */
	public static <C extends Collection<? super E>, E> C drainTo(Queue<? extends E> queue, C collection) {
		while ( ! queue.isEmpty()) {
			collection.add(queue.dequeue());
		}
		return collection;
	}

	/**
	 * Drain all the elements from the specified queue and push them on the
	 * specified stack.
	 * Return the stack.
	 */
	public static <S extends Stack<? super E>, E> S drainTo(Queue<? extends E> queue, S stack) {
		while ( ! queue.isEmpty()) {
			stack.push(queue.dequeue());
		}
		return stack;
	}

	/**
	 * Drain all the elements from the first specified queue and enqueue them
	 * on the second specified queue.
	 * Return the second queue.
	 * @see #enqueueAll(Queue, Queue)
	 */
	public static <Q extends Queue<? super E>, E> Q drainTo(Queue<? extends E> queue1, Q queue2) {
		while ( ! queue1.isEmpty()) {
			queue2.enqueue(queue1.dequeue());
		}
		return queue2;
	}


	// ********** factory methods **********

	/**
	 * Return an empty array-based FIFO queue.
	 */
	public static <E> ArrayQueue<E> queue() {
		return arrayQueue();
	}

	/**
	 * Return an empty array-based FIFO queue with specified initial capacity.
	 */
	public static <E> ArrayQueue<E> queue(int initialCapacity) {
		return arrayQueue(initialCapacity);
	}

	/**
	 * Return a FIFO queue corresponding to the specified iterable.
	 */
	public static <E> ArrayQueue<E> queue(Iterable<? extends E> iterable) {
		return arrayQueue(iterable);
	}

	/**
	 * Return a FIFO queue corresponding to the specified iterable.
	 * The specified iterable size is a performance hint.
	 */
	public static <E> ArrayQueue<E> queue(Iterable<? extends E> iterable, int iterableSize) {
		return arrayQueue(iterable, iterableSize);
	}

	/**
	 * Return a FIFO queue corresponding to the specified iterator.
	 */
	public static <E> ArrayQueue<E> queue(Iterator<? extends E> iterator) {
		return arrayQueue(iterator);
	}

	/**
	 * Return a FIFO queue corresponding to the specified iterator.
	 * The specified iterator size is a performance hint.
	 */
	public static <E> ArrayQueue<E> queue(Iterator<? extends E> iterator, int iteratorSize) {
		return arrayQueue(iterator, iteratorSize);
	}

	/**
	 * Return a FIFO queue corresponding to the specified array.
	 */
	public static <E> ArrayQueue<E> queue(E... array) {
		return arrayQueue(array);
	}

	/**
	 * Return an empty array-based FIFO queue.
	 */
	public static <E> ArrayQueue<E> arrayQueue() {
		return arrayQueue(10);
	}

	/**
	 * Return an empty array-based FIFO queue with specified initial capacity.
	 */
	public static <E> ArrayQueue<E> arrayQueue(int initialCapacity) {
		return new ArrayQueue<E>(initialCapacity);
	}

	/**
	 * Return an array-based FIFO queue corresponding to the specified iterable.
	 */
	public static <E> ArrayQueue<E> arrayQueue(Iterable<? extends E> iterable) {
		return arrayQueue(iterable.iterator());
	}

	/**
	 * Return an array-based FIFO queue corresponding to the specified iterable.
	 * The specified iterable size is a performance hint.
	 */
	public static <E> ArrayQueue<E> arrayQueue(Iterable<? extends E> iterable, int iterableSize) {
		return arrayQueue(iterable.iterator(), iterableSize);
	}

	/**
	 * Return an array-based FIFO queue corresponding to the specified iterator.
	 */
	public static <E> ArrayQueue<E> arrayQueue(Iterator<? extends E> iterator) {
		return enqueueAll(QueueTools.<E>arrayQueue(), iterator);
	}

	/**
	 * Return an array-based FIFO queue corresponding to the specified iterator.
	 * The specified iterator size is a performance hint.
	 */
	public static <E> ArrayQueue<E> arrayQueue(Iterator<? extends E> iterator, int iteratorSize) {
		return enqueueAll(QueueTools.<E>arrayQueue(iteratorSize), iterator);
	}

	/**
	 * Return an array-based FIFO queue corresponding to the specified array.
	 */
	public static <E> ArrayQueue<E> arrayQueue(E... array) {
		return enqueueAll(QueueTools.<E>arrayQueue(array.length), array);
	}

	/**
	 * Return an empty link-based FIFO queue with no node cache.
	 */
	public static <E> LinkedQueue<E> linkedQueue() {
		return linkedQueue(0);
	}

	/**
	 * Return an empty link-based FIFO queue
	 * with the specified node cache size.
	 * Specify a cache size of -1 for an unlimited cache.
	 */
	public static <E> LinkedQueue<E> linkedQueue(int cacheSize) {
		return new LinkedQueue<E>(cacheSize);
	}

	/**
	 * Return a link-based FIFO queue corresponding to the specified iterable.
	 */
	public static <E> LinkedQueue<E> linkedQueue(Iterable<? extends E> iterable) {
		return linkedQueue(iterable, 0);
	}

	/**
	 * Return a link-based FIFO queue corresponding to the specified iterable
	 * with the specified node cache size.
	 * Specify a cache size of -1 for an unlimited cache.
	 */
	public static <E> LinkedQueue<E> linkedQueue(Iterable<? extends E> iterable, int cacheSize) {
		return linkedQueue(iterable.iterator(), cacheSize);
	}

	/**
	 * Return a link-based FIFO queue corresponding to the specified iterator.
	 */
	public static <E> LinkedQueue<E> linkedQueue(Iterator<? extends E> iterator) {
		return linkedQueue(iterator, 0);
	}

	/**
	 * Return a link-based FIFO queue corresponding to the specified iterator
	 * with the specified node cache size.
	 * Specify a cache size of -1 for an unlimited cache.
	 */
	public static <E> LinkedQueue<E> linkedQueue(Iterator<? extends E> iterator, int cacheSize) {
		return enqueueAll(QueueTools.<E>linkedQueue(cacheSize), iterator);
	}

	/**
	 * Return a link-based FIFO queue corresponding to the specified array.
	 */
	public static <E> LinkedQueue<E> linkedQueue(E... array) {
		return linkedQueue(array, 0);
	}

	/**
	 * Return a link-based FIFO queue corresponding to the specified array
	 * with the specified node cache size.
	 * Specify a cache size of -1 for an unlimited cache.
	 */
	public static <E> LinkedQueue<E> linkedQueue(E[] array, int cacheSize) {
		return enqueueAll(QueueTools.<E>linkedQueue(cacheSize), array);
	}

	/**
	 * Return a fixed-size queue with the specified capacity.
	 */
	public static <E> FixedSizeArrayQueue<E> fixedSizeQueue(int capacity) {
		return new FixedSizeArrayQueue<E>(capacity);
	}

	/**
	 * Return a fized-size queue containing the elements of the specified
	 * collection. The queue will dequeue its elements in the same
	 * order they are returned by the collection's iterator (i.e. the
	 * first element returned by the collection's iterator will be the
	 * first element returned by {@link Queue#dequeue()}).
	 * The queue's capacity will be match the collection's size.
	 */
	public static <E> FixedSizeArrayQueue<E> fixedSizeQueue(Collection<? extends E> collection) {
		return enqueueAll(QueueTools.<E>fixedSizeQueue(collection.size()), collection);
	}

	/**
	 * Return a LIFO queue.
	 */
	public static <E> StackQueue<E> stackQueue() {
		return queue(new ArrayStack<E>());
	}

	/**
	 * Adapt the specified stack to the {@link Queue} interface,
	 * implementing a LIFO queue.
	 */
	public static <E> StackQueue<E> queue(Stack<E> stack) {
		return new StackQueue<E>(stack);
	}

	/**
	 * Return a priority queue that returns its elements in
	 * {@linkplain Comparable natural order}.
	 */
	public static <E> PriorityQueue<E> priorityQueue() {
		return queue((Comparator<? super E>) null);
	}

	/**
	 * Return a priority queue whose elements are returned in
	 * the order determined by the specified comparator.
	 * If the specified comparator is <code>null</code>, the elements will be
	 * returned in {@linkplain Comparable natural order}.
	 */
	public static <E> PriorityQueue<E> queue(Comparator<? super E> comparator) {
		return queue(new TreeSet<E>(comparator));
	}

	/**
	 * Adapt the specified sorted set to the {@link Queue} interface,
	 * implementing a priority queue.
	 */
	public static <E> PriorityQueue<E> queue(SortedSet<E> elements) {
		return new PriorityQueue<E>(elements);
	}

	/**
	 * Adapt the specified list to the {@link Queue} interface.
	 */
	public static <E> ListQueue<E> wrap(List<E> list) {
		return new ListQueue<E>(list);
	}

	/**
	 * Return a queue that synchronizes the specified queue
	 * with specified mutex.
	 */
	public static <E> SynchronizedQueue<E> synchronizedQueue(Queue<E> queue, Object mutex) {
		return new SynchronizedQueue<E>(queue, mutex);
	}

	/**
	 * Return a queue that synchronizes the specified queue.
	 */
	public static <E> SynchronizedQueue<E> synchronizedQueue(Queue<E> queue) {
		return new SynchronizedQueue<E>(queue);
	}

	/**
	 * Return an unmodifiable empty queue.
	 */
	public static <E> Queue<E> emptyQueue() {
		return EmptyQueue.<E>instance();
	}


	// ********** constructor **********

	/**
	 * Suppress default constructor, ensuring non-instantiability.
	 */
	private QueueTools() {
		super();
		throw new UnsupportedOperationException();
	}
}
