home *** CD-ROM | disk | FTP | other *** search
/ ActiveX Programming Unleashed CD / AXU.iso / jgl_1_1 / src / orderedmapiterator.java < prev    next >
Encoding:
Java Source  |  1996-09-10  |  6.3 KB  |  294 lines

  1. // Copyright(c) 1996 ObjectSpace, Inc.
  2. // Portions Copyright(c) 1995, 1996 Hewlett-Packard Company.
  3.  
  4. package jgl;
  5.  
  6. /**
  7.  * A OrderedMapIterator is a bidirectional iterator that allows you to iterate through
  8.  * the contents of a OrderedMap. It has a mode that allows selection of the current
  9.  * position's key, value, or key-value pair.
  10.  * <p>
  11.  * @see jgl.BidirectionalIterator
  12.  * @version 1.1
  13.  * @author ObjectSpace, Inc.
  14.  */
  15.  
  16. public final class OrderedMapIterator implements BidirectionalIterator
  17.   {
  18.   public final static int PAIR = 1;
  19.   public final static int KEY = 2;
  20.   public final static int VALUE = 3;
  21.   
  22.   OrderedMap myOrderedMap;
  23.   Tree myTree;
  24.   TreeNode myNode;
  25.   int myMode = PAIR;
  26.  
  27.   /**
  28.    * Construct myself to be an iterator with no associated data structure or position.
  29.    */
  30.   public OrderedMapIterator()
  31.     {
  32.     }
  33.  
  34.   /**
  35.    * Construct myself to be a copy of an existing iterator.
  36.    * @param iterator The iterator to copy.
  37.    */
  38.   public OrderedMapIterator( OrderedMapIterator iterator )
  39.     {
  40.     myOrderedMap = iterator.myOrderedMap;
  41.     myTree = iterator.myTree;
  42.     myNode = iterator.myNode;
  43.     myMode = iterator.myMode;
  44.     }
  45.  
  46.   /**
  47.    * Construct myself to be positioned at a particular node in a specified Tree.
  48.    * @param tree My associated tree.
  49.    * @param node My associated node.
  50.    * @param mode My mode for returning( PAIR, KEY, VALUE )
  51.    */
  52.   OrderedMapIterator( Tree tree, TreeNode node, OrderedMap map, int mode ) 
  53.     {
  54.     myOrderedMap = map;
  55.     myTree = tree;
  56.     myNode = node;
  57.     myMode = mode;
  58.     }
  59.  
  60.   /**
  61.    * Return a clone of myself.
  62.    */
  63.   public Object clone()
  64.     {
  65.     return new OrderedMapIterator( this );
  66.     }
  67.  
  68.   /**
  69.    * Return true if a specified object is the same kind of iterator as me 
  70.    * and is positioned at the same element.
  71.    * @param object Any object.
  72.    */
  73.   public boolean equals( Object object )
  74.     {
  75.     return object instanceof OrderedMapIterator && equals( (OrderedMapIterator) object );
  76.     }
  77.  
  78.   /**
  79.    * Return true if iterator is positioned at the same element as me.
  80.    * @param iterator The iterator to compare myself against.
  81.    */
  82.   public boolean equals( OrderedMapIterator iterator )
  83.     {
  84.     return myNode == iterator.myNode;
  85.     }
  86.  
  87.   /**
  88.    * Return true if I'm positioned at the first item of my input stream.
  89.    */
  90.   public boolean atBegin()
  91.     {
  92.     return myNode == myTree.myHeader.left;
  93.     }
  94.  
  95.   /**
  96.    * Return true if I'm positioned after the last item in my input stream.
  97.    */
  98.   public boolean atEnd()
  99.     {
  100.     return myNode == myTree.myHeader;
  101.     }
  102.  
  103.   /**
  104.    * Return true if there are more elements in my input stream.
  105.    */
  106.   public boolean hasMoreElements()
  107.     {
  108.     return myNode != myTree.myHeader;
  109.     }
  110.  
  111.   /**
  112.    * Advance by one.
  113.    */
  114.   public void advance()
  115.     {
  116.     myNode = Tree.increment( myNode );
  117.     }
  118.  
  119.   /**
  120.    * Advance by a specified amount.
  121.    * @param n The amount to advance.
  122.    */
  123.   public void advance( int n )
  124.     {
  125.     if( n >= 0 )
  126.       while( n-- > 0 )
  127.         advance();
  128.     else
  129.       while( n++ < 0 )
  130.         retreat();
  131.     }
  132.  
  133.   /**
  134.    * Retreat by one.
  135.    */
  136.   public void retreat()
  137.     {
  138.     myNode = Tree.decrement( myNode );
  139.     }
  140.  
  141.   /**
  142.    * Retreat by a specified amount.
  143.    * @param n The amount to retreat.
  144.    */
  145.   public void retreat( int n )
  146.     {
  147.     advance( -n );
  148.     }
  149.  
  150.   /**
  151.    * Return the next element in my input stream.
  152.    */
  153.   public Object nextElement()
  154.     {
  155.     Object object = myNode.object;
  156.     myNode = Tree.increment( myNode );
  157.     
  158.     switch( myMode )
  159.       {
  160.       case PAIR:
  161.         return object;
  162.       
  163.       case KEY:
  164.         return ((Pair) object).first;
  165.         
  166.       case VALUE:
  167.         return ((Pair) object).second;
  168.       }
  169.       
  170.     return null;
  171.     }
  172.  
  173.   /**
  174.    * Return the object at my current position.
  175.    */
  176.   public Object get()
  177.     {
  178.     switch( myMode )
  179.       {
  180.       case PAIR:
  181.         return myNode.object;
  182.         
  183.       case KEY:
  184.         return ((Pair) myNode.object).first;
  185.         
  186.       case VALUE:
  187.          return ((Pair) myNode.object).second;
  188.       }
  189.     
  190.     return null;
  191.     }
  192.  
  193.   /**
  194.    * Set the object at my current position to a specified value.
  195.    * @param object The object to be written at my current position.
  196.    */
  197.   public void put( Object object )
  198.     {
  199.     myNode.object = object;
  200.     }
  201.  
  202.   /**
  203.    * Return the key of my current key/value pair.
  204.    */
  205.   public Object key()
  206.     {
  207.     return ((Pair) myNode.object).first;
  208.     }
  209.  
  210.   /**
  211.    * Return the value of my current key/value pair.
  212.    */
  213.   public Object value()
  214.     {
  215.     return ((Pair) myNode.object).second;
  216.     }
  217.  
  218.   /**
  219.    * Change the value of my current key/value pair.
  220.    * @param object The new value.
  221.    */
  222.   public void value( Object object )
  223.     {
  224.     ((Pair) myNode.object).second = object;
  225.     }
  226.  
  227.   /**
  228.    * Return the object that is a specified distance from my current position.
  229.    * @param offset The offset from my current position.
  230.    */
  231.   public Object get( int offset )
  232.     {
  233.     TreeNode oldNode = myNode;
  234.     advance( offset );
  235.     Object object = get();
  236.     myNode = oldNode;
  237.     
  238.     switch( myMode )
  239.       {
  240.       case PAIR:
  241.         return object;
  242.         
  243.       case KEY:
  244.         return ((Pair) object).first;
  245.         
  246.       case VALUE:
  247.         return ((Pair) object).second;
  248.       }
  249.       
  250.     return null;
  251.     }
  252.  
  253.   /**
  254.    * Write an object at a specified distance from my current position.
  255.    * @param offset The offset from my current position.
  256.    * @param object The object to write.
  257.    */
  258.   public void put( int offset, Object object )
  259.     {
  260.     TreeNode oldNode = myNode;
  261.     advance( offset );
  262.     put( object );
  263.     myNode = oldNode;
  264.     }
  265.  
  266.   /**
  267.    * Return the distance from myself to another iterator.
  268.    * I should be before the specified iterator.
  269.    * @param iterator The iterator to compare myself against.
  270.    */
  271.   public int distance( ForwardIterator iterator )
  272.     {
  273.     TreeNode node = ((OrderedMapIterator) iterator).myNode;
  274.     int n = 0;
  275.  
  276.     while( node != myNode )
  277.       {
  278.       ++n;
  279.       node = Tree.decrement( node );
  280.       }
  281.  
  282.     return n;
  283.     }
  284.  
  285.   /** 
  286.    * Return my associated container.
  287.    */
  288.   public Container getContainer() 
  289.     {
  290.     return myOrderedMap;
  291.     }
  292.   }
  293.  
  294.