// A class that implements the Pop interface.
// Barry Cornelius, 19 June 2000
import java.util. Iterator;
import java.util. Map;
import java.util. Observable;
import java.util. Observer;
import java.util. TreeMap;
public class PopImpl extends Observable implements Pop
{
   private Map iPop;
   private Iterator iIterator;
   public PopImpl()
   {
      iPop = new TreeMap();
      iIterator = null;
   }
   public synchronized boolean add(final Person pPerson)
   {
      final Object tObject = iPop.put(pPerson.getName(), pPerson);
      setChanged();
      notifyObservers();
      return tObject==null;
   }
   public synchronized boolean remove(final String pName)
   {
      final Object tObject = iPop.remove(pName);
      setChanged();
      notifyObservers();
      return tObject!=null;
   } //BJCHEREFIRST
   public synchronized Person get(final String pName)
   {
      return (Person)iPop.get(pName);
   }
   public synchronized Person getFirst()
   {
      iIterator = iPop.values().iterator();
      return next();
   }
   public synchronized Person next()
   {
      if (iIterator.hasNext())
      {
         return (Person)iIterator.next();
      }
      else
      {
         return null;
      }
   }
   public synchronized int size()
   {
      return iPop.size();
   }
   public synchronized boolean equals(final Object pObject)
   {
      if ( pObject==null || getClass()!=pObject.getClass() )
      {
         return false;
      }
      return iPop.equals(((PopImpl)pObject).iPop);
   }
   public synchronized int hashCode()
   {
      return iPop.hashCode();
   }
   public synchronized String toString()
   {
      return iPop.toString();
   }
}
