jdk/src/share/classes/javax/imageio/spi/DigraphNode.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/imageio/spi/DigraphNode.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2000 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package javax.imageio.spi;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * A node in a directed graph.  In addition to an arbitrary
+ * <code>Object</code> containing user data associated with the node,
+ * each node maintains a <code>Set</code>s of nodes which are pointed
+ * to by the current node (available from <code>getOutNodes</code>).
+ * The in-degree of the node (that is, number of nodes that point to
+ * the current node) may be queried.
+ *
+ */
+class DigraphNode implements Cloneable, Serializable {
+
+    /** The data associated with this node. */
+    protected Object data;
+
+    /**
+     * A <code>Set</code> of neighboring nodes pointed to by this
+     * node.
+     */
+    protected Set outNodes = new HashSet();
+
+    /** The in-degree of the node. */
+    protected int inDegree = 0;
+
+    /**
+     * A <code>Set</code> of neighboring nodes that point to this
+     * node.
+     */
+    private Set inNodes = new HashSet();
+
+    public DigraphNode(Object data) {
+        this.data = data;
+    }
+
+    /** Returns the <code>Object</code> referenced by this node. */
+    public Object getData() {
+        return data;
+    }
+
+    /**
+     * Returns an <code>Iterator</code> containing the nodes pointed
+     * to by this node.
+     */
+    public Iterator getOutNodes() {
+        return outNodes.iterator();
+    }
+
+    /**
+     * Adds a directed edge to the graph.  The outNodes list of this
+     * node is updated and the in-degree of the other node is incremented.
+     *
+     * @param node a <code>DigraphNode</code>.
+     *
+     * @return <code>true</code> if the node was not previously the
+     * target of an edge.
+     */
+    public boolean addEdge(DigraphNode node) {
+        if (outNodes.contains(node)) {
+            return false;
+        }
+
+        outNodes.add(node);
+        node.inNodes.add(this);
+        node.incrementInDegree();
+        return true;
+    }
+
+    /**
+     * Returns <code>true</code> if an edge exists between this node
+     * and the given node.
+     *
+     * @param node a <code>DigraphNode</code>.
+     *
+     * @return <code>true</code> if the node is the target of an edge.
+     */
+    public boolean hasEdge(DigraphNode node) {
+        return outNodes.contains(node);
+    }
+
+    /**
+     * Removes a directed edge from the graph.  The outNodes list of this
+     * node is updated and the in-degree of the other node is decremented.
+     *
+     * @return <code>true</code> if the node was previously the target
+     * of an edge.
+     */
+    public boolean removeEdge(DigraphNode node) {
+        if (!outNodes.contains(node)) {
+            return false;
+        }
+
+        outNodes.remove(node);
+        node.inNodes.remove(this);
+        node.decrementInDegree();
+        return true;
+    }
+
+    /**
+     * Removes this node from the graph, updating neighboring nodes
+     * appropriately.
+     */
+    public void dispose() {
+        Object[] inNodesArray = inNodes.toArray();
+        for(int i=0; i<inNodesArray.length; i++) {
+            DigraphNode node = (DigraphNode) inNodesArray[i];
+            node.removeEdge(this);
+        }
+
+        Object[] outNodesArray = outNodes.toArray();
+        for(int i=0; i<outNodesArray.length; i++) {
+            DigraphNode node = (DigraphNode) outNodesArray[i];
+            removeEdge(node);
+        }
+    }
+
+    /** Returns the in-degree of this node. */
+    public int getInDegree() {
+        return inDegree;
+    }
+
+    /** Increments the in-degree of this node. */
+    private void incrementInDegree() {
+        ++inDegree;
+    }
+
+    /** Decrements the in-degree of this node. */
+    private void decrementInDegree() {
+        --inDegree;
+    }
+}