001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.compilers.opt.dfsolver;
014    
015    import java.util.ArrayList;
016    import java.util.Enumeration;
017    
018    import org.jikesrvm.compilers.opt.OptimizingCompilerException;
019    import org.jikesrvm.compilers.opt.util.Graph;
020    import org.jikesrvm.compilers.opt.util.GraphNode;
021    
022    /**
023     * Implementation of a graph used in the guts of the dataflow equation
024     * solver.
025     */
026    class DF_Graph implements Graph {
027    
028      /**
029       * The nodes of the graph.
030       */
031      public final ArrayList<GraphNode> nodes = new ArrayList<GraphNode>();
032    
033      /**
034       * Number of nodes in the graph.
035       */
036      private int count = 0;
037    
038      @Override
039      public int numberOfNodes() {
040        return count;
041      }
042    
043      /**
044       * Implementation for Graph Interface.  TODO: why is this in the
045       * Graph interface?
046       */
047      @Override
048      public void compactNodeNumbering() {}
049    
050      /**
051       * Enumerate the nodes in the graph.
052       * @return an enumeration of the nodes in the graph
053       */
054      @Override
055      public Enumeration<GraphNode> enumerateNodes() {
056        return new Enumeration<GraphNode>() {
057          private int i = 0;
058    
059          @Override
060          public boolean hasMoreElements() {
061            return i < count;
062          }
063    
064          @Override
065          public GraphNode nextElement() {
066            return nodes.get(i++);
067          }
068        };
069      }
070    
071      /**
072       * @param x the node to add
073       */
074      @Override
075      public void addGraphNode(GraphNode x) {
076        x.setIndex(count);
077        nodes.add(x);
078        count++;
079      }
080    
081      /**
082       * Unsupported.  Why is this here?
083       */
084      @Override
085      public void addGraphEdge(GraphNode x, GraphNode y) {
086        throw new OptimizingCompilerException("DF_Graph edges implicit");
087      }
088    }