/*
 *    GeoTools - OpenSource mapping toolkit
 *    http://geotools.org
 *    (C) 2002-2006, GeoTools Project Managment Committee (PMC)
 *    (C) 2002, Refractions Reserach Inc.
 *
 *    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;
 *    version 2.1 of the License.
 *
 *    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.
 */
package org.geotools.graph.traverse.basic;

import org.geotools.graph.structure.Graph;
import org.geotools.graph.structure.GraphVisitor;
import org.geotools.graph.structure.Graphable;
import org.geotools.graph.traverse.GraphIterator;
import org.geotools.graph.traverse.GraphWalker;

/**
 * 
 * TODO: DOCUMENT ME!
 * @author Justin Deoliveira, Refractions Research Inc, jdeolive@refractions.net
 *
 * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/extension/graph/src/main/java/org/geotools/graph/traverse/basic/StagedGraphTraversal.java $
 */
public class StagedGraphTraversal extends BasicGraphTraversal {

  private int m_stage;
  
  public StagedGraphTraversal(
    Graph graph, GraphWalker walker, GraphIterator iterator
  ) {
    super(graph, walker, iterator);
    m_stage = 0;
  }
  
  public void init() {
    //initialize the nodes of the graph by setting counts to 0
    getGraph().visitNodes(
      new GraphVisitor() {
        public int visit(Graphable component) {
          component.setCount(0);
          return(0);
        }
      }
    );
  }

  public boolean isVisited(Graphable g) {
    return(g.getCount() == m_stage);
  }
  
  public void setVisited(Graphable g, boolean visited) {
    g.setCount(visited ? m_stage : -1);
  }

}
