key0-96/
key0-96/doc/key/
key0-96/doc/key/credits/
key0-96/doc/key/developers/
key0-96/doc/key/developers/resources/
key0-96/setup/caves/
key0-96/setup/help/
key0-96/setup/ruins/
key0-96/src/
key0-96/src/commands/
key0-96/src/events/
key0-96/src/hack/
key0-96/src/sql/
key0-96/src/swing/
key0-96/src/talker/forest/
key0-96/src/talker/objects/
key0-96/src/terminals/
/*
**               j###t  ########## ####   ####
**              j###t   ########## ####   ####
**             j###T               "###L J###"
**          ######P'    ##########  #########
**          ######k,    ##########   T######T
**          ####~###L   ####
**          #### q###L  ##########   .#####
**          ####  \###L ##########   #####"
**
**  $Id$
**
**  Class History
**
**  Date        Name         Description
**  ---------|------------|-----------------------------------------------
**  19Aug98     subtle       start of recorded history
**
*/

package key.util;

import java.io.IOException;

/**
  * Implementation of a simple FIFO queue
  *
  * @version 1.00, 23Apr96
  * @author Paul Mclachlan
  *
 */
public class Queue
{
	Element First;
	Element Last;
	int Count;

    /**
	  * creates the queue
     */
	public Queue()
	{
		First = null;
		Last = null;
		Count = 0;
	}

	/**
	  * Adds another object to the queue
	  *
	  * @param store the object to be added
	 */
	public void push( Object store )
	{
		Element latest = new Element( store );

		if( Last != null )
			Last.setNext( latest );
		else
			First = latest;
		
		Last = latest;

		Count++;
	}
	
	/**
	  * Takes the first object off the queue and returns it
	  * @return the first object from the queue
	 */
	public Object pop() throws java.util.NoSuchElementException
	{
		if( First == null )
			throw new java.util.NoSuchElementException( "trying to pop past end of queue" );

		Object result=First.item();
		First = First.getNext();
		if( First == null )
			Last = null;
		Count--;

		return( result );
	}

	/**
	  * Returns the number of objects in the queue
	  * @return the number of objects in the queue
	 */
	public int count()
	{
		return( Count );
	}

	/* TEST SUITE */
/*
	void dump()
	{
		Element t;
		t = First;
		while( t != null )
		{
			System.out.println( t.item().toString() );
			t = t.getNext();
		}
	}

	public static void main( String args[] )
	{
		Queue main = new Queue();
		String entry;
		int count=0;

		do
		{
			System.out.println( "\nQueue contains " + main.count() + " elements" );
			entry = input( "dump,quit,push <item>,pop: " );
			if( entry.length() == 0 )
			{
			}
			else if( entry.equals( "dump" ) )
			{
				System.out.println( "\nDUMPING:\n--------" );
				main.dump();
			}
			else if( entry.equals( "pop" ) )
			{
				System.out.println( "Popping '" + main.pop().toString() +"'..." );
			}
			else if( entry.equals( "quit" ) )
			{
			}
			else if( entry.startsWith( "push " ) )
			{
				entry = entry.substring( 5 );
				System.out.println( "Pushing " + entry + "..." );
				main.push( entry );
			}
			else
			{
				System.out.println( "Unknown command '" + entry + "'" );
			}
		} while( !entry.equals( "quit" ) );
	}
	
	public static String input( String prompt )
	{
		StringBuffer buildInput = new StringBuffer();
		char b=' ';

		System.out.print( prompt );
		System.out.flush();

		do
			{
			try
				b = (char) System.in.read();
			catch( IOException e )
				{
						//  generally an IOException here means that
						//  the player in question has disconnected
					System.out.println( e.toString() );
					System.exit( 1 );
				}
			if( b != '\n' && b != 0 )
				buildInput.append( b );
			} while( b != '\n' && b != 0 );

		return( new String( buildInput ) );
	}
*/
	
	private static class Element
	{
		Object Stored;
		Element Next;
		
		/**
		  * Creates a new queue element to hold
		  * this object
		 */
		public Element( Object store )
		{
			Stored = store;
			Next = null;
		}

		/**
		  * Sets the value of 'next' to the given value
		  @param next the next element in the queue
		 */
		public void setNext( Element next )
		{
			Next = next;
		}

		public Element getNext()
		{
			return( Next );
		}

		public Object item()
		{
			return( Stored );
		}
	}
}