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

  1. // Copyright(c) 1996 ObjectSpace, Inc.
  2. // Portions Copyright(c) 1995, 1996 Hewlett-Packard Company.
  3.  
  4. package jgl;
  5.  
  6. /**
  7.  * A OrderedSetIterator is a bidirectional iterator that allows you to iterate through
  8.  * the contents of a OrderedSet.
  9.  * <p>
  10.  * @see jgl.BidirectionalIterator
  11.  * @version 1.1
  12.  * @author ObjectSpace, Inc.
  13.  */
  14.  
  15. public final class OrderedSetIterator implements BidirectionalIterator
  16.   {
  17.   OrderedSet myOrderedSet;
  18.   Tree myTree;
  19.   TreeNode myNode;
  20.  
  21.   /**
  22.    * Construct myself to be an iterator with no associated data structure or position.
  23.    */
  24.   public OrderedSetIterator()
  25.     {
  26.     }
  27.  
  28.   /**
  29.    * Construct myself to be a copy of an existing iterator.
  30.    * @param iterator The iterator to copy.
  31.    */
  32.   public OrderedSetIterator( OrderedSetIterator iterator )
  33.     {
  34.     myOrderedSet = iterator.myOrderedSet;
  35.     myTree = iterator.myTree;
  36.     myNode = iterator.myNode;
  37.     }
  38.  
  39.   /**
  40.    * Construct myself to be positioned at a particular node in a specified Tree.
  41.    * @param tree My associated tree.
  42.    * @param node My associated node.
  43.    */
  44.   OrderedSetIterator( Tree tree, TreeNode node, OrderedSet set )
  45.     {
  46.     myOrderedSet = set;
  47.     myTree = tree;
  48.     myNode = node;
  49.     }
  50.  
  51.   /**
  52.    * Return a clone of myself.
  53.    */
  54.   public Object clone()
  55.     {
  56.     return new OrderedSetIterator( this );
  57.     }
  58.  
  59.   /**
  60.    * Return true if a specified object is the same kind of iterator as me 
  61.    * and is positioned at the same element.
  62.    * @param object Any object.
  63.    */
  64.   public boolean equals( Object object )
  65.     {
  66.     return object instanceof OrderedSetIterator && equals( (OrderedSetIterator) object );
  67.     }
  68.  
  69.   /**
  70.    * Return true if iterator is positioned at the same element as me.
  71.    * @param iterator The iterator to compare myself against.
  72.    */
  73.   public boolean equals( OrderedSetIterator iterator )
  74.     {
  75.     return myNode == iterator.myNode;
  76.     }
  77.  
  78.   /**
  79.    * Return true if I'm positioned at the first item of my input stream.
  80.    */
  81.   public boolean atBegin()
  82.     {
  83.     return myNode == myTree.myHeader.left;
  84.     }
  85.  
  86.   /**
  87.    * Return true if I'm positioned after the last item in my input stream.
  88.    */
  89.   public boolean atEnd()
  90.     {
  91.     return myNode == myTree.myHeader;
  92.     }
  93.  
  94.   /**
  95.    * Return true if there are more elements in my input stream.
  96.    */
  97.   public boolean hasMoreElements()
  98.     {
  99.     return myNode != myTree.myHeader;
  100.     }
  101.  
  102.   /**
  103.    * Advance by one.
  104.    */
  105.   public void advance()
  106.     {
  107.     myNode = Tree.increment( myNode );
  108.     }
  109.  
  110.   /**
  111.    * Advance by a specified amount.
  112.    * @param n The amount to advance.
  113.    */
  114.   public void advance( int n )
  115.     {
  116.     if( n >= 0 )
  117.       while( n-- > 0 )
  118.         advance();
  119.     else
  120.       while( n++ < 0 )
  121.         retreat();
  122.     }
  123.  
  124.   /**
  125.    * Retreat by one.
  126.    */
  127.   public void retreat()
  128.     {
  129.     myNode = Tree.decrement( myNode );
  130.     }
  131.  
  132.   /**
  133.    * Retreat by a specified amount.
  134.    * @param n The amount to retreat.
  135.    */
  136.   public void retreat( int n )
  137.     {
  138.     advance( -n );
  139.     }
  140.  
  141.   /**
  142.    * Return the next element in my input stream.
  143.    */
  144.   public Object nextElement()
  145.     {
  146.     Object object = myNode.object;
  147.     myNode = Tree.increment( myNode );
  148.     return object;
  149.     }
  150.  
  151.   /**
  152.    * Return the object at my current position.
  153.    */
  154.   public Object get()
  155.     {
  156.     return myNode.object;
  157.     }
  158.  
  159.   /**
  160.    * OrderedSet the object at my current position to a specified value.
  161.    * @param object The object to be written at my current position.
  162.    */
  163.   public void put( Object object )
  164.     {
  165.     myNode.object = object;
  166.     }
  167.  
  168.   /**
  169.    * Return the object that is a specified distance from my current position.
  170.    * @param offset The offset from my current position.
  171.    */
  172.   public Object get( int offset )
  173.     {
  174.     TreeNode oldNode = myNode;
  175.     advance( offset );
  176.     Object object = get();
  177.     myNode = oldNode;
  178.     return object;
  179.     }
  180.  
  181.   /**
  182.    * Write an object at a specified distance from my current position.
  183.    * @param offset The offset from my current position.
  184.    * @param object The object to write.
  185.    */
  186.   public void put( int offset, Object object )
  187.     {
  188.     TreeNode oldNode = myNode;
  189.     advance( offset );
  190.     put( object );
  191.     myNode = oldNode;
  192.     }
  193.  
  194.   /**
  195.    * Return the distance from myself to another iterator.
  196.    * I should be before the specified iterator.
  197.    * @param iterator The iterator to compare myself against.
  198.    */
  199.   public int distance( ForwardIterator iterator )
  200.     {
  201.     TreeNode node = ((OrderedSetIterator) iterator).myNode;
  202.     int n = 0;
  203.  
  204.     while( node != myNode )
  205.       {
  206.       ++n;
  207.       node = Tree.decrement( node );
  208.       }
  209.  
  210.     return n;
  211.     }
  212.  
  213.   /** 
  214.    * Return my associated container.
  215.    */
  216.   public Container getContainer() 
  217.     {
  218.     return myOrderedSet;
  219.     }
  220.   }
  221.  
  222.