001: /* Soot - a J*va Optimization Framework
002: * Copyright (C) 2003 Navindra Umanee <navindra@cs.mcgill.ca>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2.1 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the
016: * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017: * Boston, MA 02111-1307, USA.
018: */
019:
020: package soot.toolkits.graph;
021:
022: import java.util.*;
023:
024: /**
025: * Represents a dominator node in DominatorTree. Usually you should
026: * use DominatorTree or DominanceFrontier to obtain information on how
027: * a node relates to other nodes instead of directly using any methods
028: * provided here.
029: *
030: * @author Navindra Umanee
031: **/
032: public class DominatorNode {
033: protected Object gode;
034: protected DominatorNode parent;
035: protected List children;
036:
037: protected DominatorNode(Object gode) {
038: this .gode = gode;
039: children = new ArrayList();
040: }
041:
042: /**
043: * Sets the parent of this node in the DominatorTree. Usually
044: * called internally.
045: **/
046: public void setParent(DominatorNode parent) {
047: this .parent = parent;
048: }
049:
050: /**
051: * Adds a child to the internal list of children of this node in
052: * tree. Usually called internally.
053: **/
054: public boolean addChild(DominatorNode child) {
055: if (children.contains(child)) {
056: return false;
057: } else {
058: children.add(child);
059: return true;
060: }
061: }
062:
063: /**
064: * Returns the node (from the original DirectedGraph) encapsulated
065: * by this DominatorNode.
066: **/
067: public Object getGode() {
068: return gode;
069: }
070:
071: /**
072: * Returns the parent of the node in the DominatorTree.
073: **/
074: public DominatorNode getParent() {
075: return parent;
076: }
077:
078: /**
079: * Returns a backed list of the children of this node in the
080: * DominatorTree.
081: **/
082: public List getChildren() {
083: return children;
084: }
085:
086: /**
087: * Returns true if this node is the head of its DominatorTree.
088: **/
089: public boolean isHead() {
090: if (parent == null)
091: return true;
092: else
093: return false;
094: }
095:
096: /**
097: * Returns true if this node is a tail of its DominatorTree.
098: **/
099: public boolean isTail() {
100: if (children.size() == 0)
101: return true;
102: else
103: return false;
104: }
105:
106: public String toString() {
107: // *** FIXME: Print info about parent and children
108: return gode.toString();
109: }
110: }
|