blob: c6d64cb12fd3ce10cc2c85b425ef7aa76d3c65e1 [file] [log] [blame]
/*
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dev.jjs.impl.gflow;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Directed graph abstraction for flow analysis. We specifically define all
* navigation methods in graph interface and do not ask nodes and edges to
* conform to any interface. This way graphs can be memory-efficient.
*
* The graph can have one or more incoming edges (i.e. edges, which end on
* some nodes in the graph, but originate somewhere outside the graph), and one
* or more outgoing edges.
*
* @param <NodeType> graph node type.
* @param <EdgeType> graph edge type.
* @param <TransformerType> transformer type. Transformer instances can be used
* to change the graph and its underlying representation to apply
* optimizations.
*/
public interface Graph<NodeType, EdgeType, TransformerType> {
Object getEdgeData(EdgeType edge);
/**
* Returns edge end node.
*/
NodeType getEnd(EdgeType edge);
/**
* Returns graph incoming edges.
*/
ArrayList<EdgeType> getGraphInEdges();
/**
* Returns graph outgoing edges.
*/
ArrayList<EdgeType> getGraphOutEdges();
/**
* Returns edges coming into node.
*/
List<EdgeType> getInEdges(NodeType n);
/**
* Returns all nodes in the graph.
*/
ArrayList<NodeType> getNodes();
/**
* Returns edges originating from the node.
*/
List<EdgeType> getOutEdges(NodeType node);
/**
* Returns edge start node.
*/
NodeType getStart(EdgeType edge);
/**
* Returns string representation of the graph.
*/
String print();
/**
* Returns string representation of the graph with all assumptions along its
* edges.
*/
<A extends Assumption<A>> String printWithAssumptions(
Map<EdgeType, A> assumptions);
void setEdgeData(EdgeType edge, Object data);
/**
* Transforms the node with transformer. This will be called by solver to
* apply optimizations.
*
* @return <code>true</code> if there were changes made by transformer. While
* transformation should be always sound, it might be impossible to apply
* it in current context due to complexities of underlying structures. E.g.
* it is impossible to delete if statement test expression, while it is not
* evaluated if statement is not reachable. In this case transformer can
* return <code>false</code> and do no changes.
*/
boolean transform(NodeType node, TransformerType transformer);
}