/*
 *  Copyright (C) 2012 Ed Schaller <schallee@darkmist.net>
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package net.darkmist.alib.collection;

import java.util.Enumeration;
import java.util.NoSuchElementException;
import java.util.Iterator;

public final class Enumerations
{
	private Enumerations()
	{
	}

	private static final class EmptyEnumeration<T> implements Enumeration<T>
	{
		@SuppressWarnings("rawtypes")
		private static EmptyEnumeration SINGLETON = new EmptyEnumeration();

		private EmptyEnumeration()
		{
		}

		@SuppressWarnings("unchecked")
		static <T> EmptyEnumeration<T> instance()
		{
			return SINGLETON;
		}

		@Override
		public boolean hasMoreElements()
		{
			return false;
		}

		@Override
		public T nextElement()
		{
			throw new NoSuchElementException("This enumeration is empty");
		}
	}

	public static <T> Enumeration<T> getEmptyEnumeration()
	{
		return EmptyEnumeration.instance();
	}

	private static final class EnumerationIterator<T> extends NonRemovingIterator<T>
	{
		private Enumeration<T> e;

		/**
		 * @param e The enumeration to back the iterator with.
		 * @throws NullPointerException if e is null
		 */
		public EnumerationIterator(Enumeration<T> e)
		{
			if(e == null)
				throw new NullPointerException("Backing enumeration cannot be null");
			this.e = e;
		}

		@Override
		public boolean hasNext()
		{
			return e.hasMoreElements();
		}

		@Override
		public T next()
		{
			return e.nextElement();
		}
	}

	public static <T> Iterator<T> asIterator(Enumeration<T> e)
	{
		if(e == null || !e.hasMoreElements())
			return Iterators.getEmptyIterator();
		return new EnumerationIterator<T>(e);
	}
}

@@ -866,27 +866,25 @@
 va.util.
-Enumeration
+ArrayList
 ;%0Aimport
@@ -898,57 +898,140 @@
 til.
-NoSuchElementException;%0Aimport java.util.Iterator
+Collections;%0Aimport java.util.Enumeration;%0Aimport java.util.Iterator;%0Aimport java.util.List;%0Aimport java.util.NoSuchElementException
 ;%0A%0Ap
@@ -2433,11 +2433,640 @@
 %3E(e);%0A%09%7D
+%0A%0A%09public static %3CT%3E Iterable%3CT%3E asSingleIterable(final Enumeration%3CT%3E e)%0A%09%7B%0A%09%09return new Iterable%3CT%3E()%0A%09%09%7B%0A%09%09%09private boolean initial=true;%0A%0A%09%09%09@Override%0A%09%09%09public Iterator%3CT%3E iterator()%0A%09%09%09%7B%0A%09%09%09%09if(!initial)%0A%09%09%09%09%09throw new UnsupportedOperationException(%22Calling iterator multiple times is not supported.%22);%0A%09%09%09%09initial=false;%0A%09%09%09%09return asIterator(e);%0A%09%09%09%7D%0A%09%09%7D;%0A%09%7D%0A%0A%09public static %3CT%3E Iterable%3CT%3E asMultiIterable(final Enumeration%3CT%3E e)%0A%09%7B%0A%09%09List%3CT%3E list = new ArrayList%3CT%3E();%0A%0A%09%09if(e==null %7C%7C !e.hasMoreElements())%0A%09%09%09return Collections.emptyList();%0A%09%09while(e.hasMoreElements())%0A%09%09%09list.add(e.nextElement());%0A%09%09return list;%0A%09%7D
 %0A%7D%0A

add asIterable asMultiIterable