From: <cpm...@us...> - 2008-03-09 19:28:17
|
Revision: 5526 http://pcgen.svn.sourceforge.net/pcgen/?rev=5526&view=rev Author: cpmeister Date: 2008-03-09 12:28:20 -0700 (Sun, 09 Mar 2008) Log Message: ----------- Refactored code, Changed Graphs to use Set instead of List, and improved Graph hierarchy Modified Paths: -------------- branches/cdom/code/src/java/pcgen/base/graph/command/PruneUnconnectedToNodeCommand.java branches/cdom/code/src/java/pcgen/base/graph/core/AbstractIdentityEdgeMapGraph.java branches/cdom/code/src/java/pcgen/base/graph/core/AbstractListMapGraph.java branches/cdom/code/src/java/pcgen/base/graph/core/AbstractSetMapGraph.java branches/cdom/code/src/java/pcgen/base/graph/core/DefaultDirectionalGraphEdge.java branches/cdom/code/src/java/pcgen/base/graph/core/DefaultDirectionalHyperEdge.java branches/cdom/code/src/java/pcgen/base/graph/core/DefaultHyperEdge.java branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalEdge.java branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalGraph.java branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalHyperEdge.java branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalIdentityEdgeMapGraph.java branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalListMapGraph.java branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalSetMapGraph.java branches/cdom/code/src/java/pcgen/base/graph/core/Graph.java branches/cdom/code/src/java/pcgen/base/graph/core/GraphEdge.java branches/cdom/code/src/java/pcgen/base/graph/core/GraphUtilities.java branches/cdom/code/src/java/pcgen/base/graph/core/NonDirectionalEdge.java branches/cdom/code/src/java/pcgen/base/graph/core/SimpleListGraph.java branches/cdom/code/src/java/pcgen/base/graph/visitor/DirectedNodeWeightCalculation.java branches/cdom/code/src/java/pcgen/base/util/ListSet.java branches/cdom/code/src/java/pcgen/cdom/enumeration/ObjectKey.java branches/cdom/code/src/java/pcgen/cdom/graph/AbstractPCGraphEdge.java branches/cdom/code/src/java/pcgen/cdom/graph/PCGenGraph.java branches/cdom/code/src/java/pcgen/cdom/helper/ChosenChoiceSet.java branches/cdom/code/src/java/pcgen/cdom/helper/ListChoiceSet.java branches/cdom/code/src/java/pcgen/rules/context/ConsolidatedGraphCommitStrategy.java branches/cdom/code/src/java/pcgen/rules/context/GraphContext.java branches/cdom/code/src/java/pcgen/rules/context/ListContext.java branches/cdom/code/src/java/pcgen/rules/context/LoadContext.java branches/cdom/code/src/java/pcgen/rules/persistence/TokenSupport.java branches/cdom/code/src/java/plugin/pretokens/test/PreSpellDescriptorTester.java branches/cdom/code/src/java/plugin/pretokens/test/PreSpellSchoolSubTester.java branches/cdom/code/src/java/plugin/pretokens/test/PreSpellSchoolTester.java branches/cdom/code/src/java/plugin/qualifier/skill/ClassToken.java branches/cdom/code/src/java/plugin/qualifier/skill/CrossClassToken.java branches/cdom/code/src/java/plugin/qualifier/skill/ExclusiveToken.java branches/cdom/code/src/java/plugin/qualifier/skill/NoRankToken.java branches/cdom/code/src/java/plugin/qualifier/skill/NotClassToken.java branches/cdom/code/src/java/plugin/qualifier/skill/NotCrossClassToken.java branches/cdom/code/src/java/plugin/qualifier/skill/NotExclusiveToken.java branches/cdom/code/src/java/plugin/qualifier/stat/RemoveToken.java branches/cdom/code/src/java/plugin/qualifier/weaponprof/DeityWeaponToken.java Added Paths: ----------- branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalGraphEdge.java branches/cdom/code/src/java/pcgen/base/graph/core/EdgeFactory.java branches/cdom/code/src/java/pcgen/base/graph/core/HyperEdge.java branches/cdom/code/src/java/plugin/qualifier/AbstractQualifierToken.java branches/cdom/code/src/java/plugin/qualifier/skill/SkillTokenUtilities.java Modified: branches/cdom/code/src/java/pcgen/base/graph/command/PruneUnconnectedToNodeCommand.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/command/PruneUnconnectedToNodeCommand.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/command/PruneUnconnectedToNodeCommand.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -142,8 +142,8 @@ * Must copy the arrays, because we are going to mutate them, and they * are not guaranteed to be value semantic by the Graph Interface */ - List<ET> edgeList = new ArrayList<ET>(graph.getEdgeList()); - List<N> nodeList = new ArrayList<N>(graph.getNodeList()); + List<ET> edgeList = new ArrayList<ET>(graph.getEdges()); + List<N> nodeList = new ArrayList<N>(graph.getNodes()); edgeList.removeAll(dfta.getVisitedEdges()); nodeList.removeAll(dfta.getVisitedNodes()); /* Modified: branches/cdom/code/src/java/pcgen/base/graph/core/AbstractIdentityEdgeMapGraph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/AbstractIdentityEdgeMapGraph.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/AbstractIdentityEdgeMapGraph.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -21,12 +21,15 @@ package pcgen.base.graph.core; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import pcgen.base.util.IdentityHashSet; +import pcgen.util.SharedHashSet; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -211,11 +214,11 @@ * Node's .hashCode() method) for AbstractIdentityEdgeMapGraph to maintain * proper operation. * - * @see pcgen.base.graph.core.Graph#getNodeList() + * @see pcgen.base.graph.core.Graph#getNodes() */ - public List<N> getNodeList() + public Set<N> getNodes() { - return new ArrayList<N>(nodeMap.keySet()); + return new SharedHashSet<N>(nodeMap.keySet()); } /** @@ -227,11 +230,11 @@ * are returned BY REFERENCE, and modification of the returned Edges will * modify the Edges contained within the AbstractIdentityEdgeMapGraph. * - * @see pcgen.base.graph.core.Graph#getEdgeList() + * @see pcgen.base.graph.core.Graph#getEdges() */ - public List<ET> getEdgeList() + public Set<ET> getEdges() { - return new ArrayList<ET>(edgeSet); + return new SharedHashSet<ET>(edgeSet); } /** @@ -329,11 +332,13 @@ * * @see pcgen.base.graph.core.Graph#getAdjacentEdges(java.lang.Object) */ - public List<ET> getAdjacentEdges(N gn) + public Set<ET> getAdjacentEdges(N gn) { // implicitly returns null if gn is not in the nodeEdgeMap Set<ET> s = nodeEdgeMap.get(gn); - return s == null ? null : new ArrayList<ET>(s); + if(s == null) + return Collections.emptySet(); + return new SharedHashSet<ET>(s); } /** @@ -392,7 +397,7 @@ return false; } Graph<N, ET> otherGraph = (Graph<N, ET>) other; - List<N> otherNodeList = otherGraph.getNodeList(); + Set<N> otherNodeList = otherGraph.getNodes(); int thisNodeSize = nodeMap.size(); if (thisNodeSize != otherNodeList.size()) { @@ -402,7 +407,7 @@ return false; } // (potentially wasteful, but defensive copy) - otherNodeList = new ArrayList<N>(otherNodeList); + otherNodeList = new HashSet<N>(otherNodeList); if (otherNodeList.retainAll(nodeMap.keySet())) { // Some nodes are not identical @@ -416,7 +421,7 @@ System.err.println("1- " + o.hashCode() + " " + o); } System.err.println("?!?"); - ArrayList<N> al2 = new ArrayList<N>(otherGraph.getNodeList()); + ArrayList<N> al2 = new ArrayList<N>(otherGraph.getNodes()); al2.removeAll(otherNodeList); for (Object o : al2) { @@ -432,7 +437,7 @@ return false; } // Here, the node lists are identical... - List<ET> otherEdgeList = otherGraph.getEdgeList(); + Set<ET> otherEdgeList = otherGraph.getEdges(); int thisEdgeSize = edgeSet.size(); if (thisEdgeSize != otherEdgeList.size()) { @@ -442,7 +447,7 @@ return false; } // (potentially wasteful, but defensive copy) - otherEdgeList = new ArrayList<ET>(otherEdgeList); + otherEdgeList = new HashSet<ET>(otherEdgeList); if (otherEdgeList.retainAll(edgeSet)) { // Other Graph contains extra edges Modified: branches/cdom/code/src/java/pcgen/base/graph/core/AbstractListMapGraph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/AbstractListMapGraph.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/AbstractListMapGraph.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -19,12 +19,14 @@ */ package pcgen.base.graph.core; -import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import pcgen.base.util.ListSet; +import pcgen.util.SharedHashSet; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -77,7 +79,7 @@ /** * The List of nodes contained in this Graph. */ - private final List<N> nodeList; + private final ListSet<N> nodeList; /** * The List of edges contained in this Graph. An edge must be connected to a @@ -85,7 +87,7 @@ * whether this addition is done implicitly by addEdge [it is in * AbstractListMapGraph] or whether it is explicit). */ - private final List<ET> edgeList; + private final ListSet<ET> edgeList; /** * A Map indicating which nodes are connected to which edges. This is @@ -107,8 +109,8 @@ public AbstractListMapGraph() { super(); - edgeList = new ArrayList<ET>(); - nodeList = new ArrayList<N>(); + edgeList = new ListSet<ET>(); + nodeList = new ListSet<N>(); gcs = new GraphChangeSupport<N, ET>(this); nodeEdgeMap = new HashMap<N, Set<ET>>(); } @@ -234,11 +236,11 @@ * .hashCode() method) for AbstractListMapGraph to maintain proper * operation. * - * @see pcgen.base.graph.core.Graph#getNodeList() + * @see pcgen.base.graph.core.Graph#getNodes() */ - public List<N> getNodeList() + public Set<N> getNodes() { - return new ArrayList<N>(nodeList); + return new SharedHashSet<N>(nodeList); } /** @@ -250,11 +252,11 @@ * modification of the returned Edges will modify the Edges contained within * the AbstractListMapGraph. * - * @see pcgen.base.graph.core.Graph#getEdgeList() + * @see pcgen.base.graph.core.Graph#getEdges() */ - public List<ET> getEdgeList() + public Set<ET> getEdges() { - return new ArrayList<ET>(edgeList); + return new SharedHashSet<ET>(edgeList); } /** @@ -353,7 +355,9 @@ { // implicitly returns null if gn is not in the nodeEdgeMap Set<ET> s = nodeEdgeMap.get(gn); - return s == null ? null : new HashSet<ET>(s); + if(s == null) + return Collections.emptySet(); + return new SharedHashSet<ET>(s); } /** @@ -412,7 +416,7 @@ return false; } Graph<N, ET> otherGraph = (Graph<N, ET>) other; - List<N> otherNodeList = otherGraph.getNodeList(); + Set<N> otherNodeList = otherGraph.getNodes(); int thisNodeSize = nodeList.size(); if (thisNodeSize != otherNodeList.size()) { @@ -420,7 +424,7 @@ return false; } // (potentially wasteful, but defensive copy) - otherNodeList = new ArrayList<N>(otherNodeList); + otherNodeList = new HashSet<N>(otherNodeList); if (otherNodeList.retainAll(nodeList)) { // Some nodes are not identical @@ -430,7 +434,7 @@ return false; } // Here, the node lists are identical... - List<ET> otherEdgeList = otherGraph.getEdgeList(); + Set<ET> otherEdgeList = otherGraph.getEdges(); int thisEdgeSize = edgeList.size(); if (thisEdgeSize != otherEdgeList.size()) { @@ -438,7 +442,7 @@ return false; } // (potentially wasteful, but defensive copy) - otherEdgeList = new ArrayList<ET>(otherEdgeList); + otherEdgeList = new HashSet<ET>(otherEdgeList); if (otherEdgeList.retainAll(edgeList)) { // Other Graph contains extra edges Modified: branches/cdom/code/src/java/pcgen/base/graph/core/AbstractSetMapGraph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/AbstractSetMapGraph.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/AbstractSetMapGraph.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import pcgen.util.SharedHashSet; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -223,11 +224,11 @@ * must not alter the hash code (as returned by the Node's .hashCode() * method) for AbstractSetMapGraph to maintain proper operation. * - * @see pcgen.base.graph.core.Graph#getNodeList() + * @see pcgen.base.graph.core.Graph#getNodes() */ - public List<N> getNodeList() + public Set<N> getNodes() { - return new ArrayList<N>(nodeMap.keySet()); + return new SharedHashSet<N>(nodeMap.keySet()); } /** @@ -239,11 +240,11 @@ * modification of the returned Edges will modify the Edges contained within * the AbstractSetMapGraph. * - * @see pcgen.base.graph.core.Graph#getEdgeList() + * @see pcgen.base.graph.core.Graph#getEdges() */ - public List<ET> getEdgeList() + public Set<ET> getEdges() { - return new ArrayList<ET>(edgeSet); + return new SharedHashSet<ET>(edgeSet); } /** @@ -402,7 +403,7 @@ return false; } Graph<N, ET> otherGraph = (Graph<N, ET>) other; - List<N> otherNodeList = otherGraph.getNodeList(); + Set<N> otherNodeList = otherGraph.getNodes(); int thisNodeSize = nodeMap.size(); if (thisNodeSize != otherNodeList.size()) { @@ -412,7 +413,7 @@ return false; } // (potentially wasteful, but defensive copy) - otherNodeList = new ArrayList<N>(otherNodeList); + otherNodeList = new HashSet<N>(otherNodeList); if (otherNodeList.retainAll(nodeMap.keySet())) { // Some nodes are not identical @@ -426,7 +427,7 @@ System.err.println("1- " + o.hashCode() + " " + o); } System.err.println("?!?"); - ArrayList<N> al2 = new ArrayList<N>(otherGraph.getNodeList()); + ArrayList<N> al2 = new ArrayList<N>(otherGraph.getNodes()); al2.removeAll(otherNodeList); for (Object o : al2) { @@ -442,7 +443,7 @@ return false; } // Here, the node lists are identical... - List<ET> otherEdgeList = otherGraph.getEdgeList(); + Set<ET> otherEdgeList = otherGraph.getEdges(); int thisEdgeSize = edgeSet.size(); if (thisEdgeSize != otherEdgeList.size()) { @@ -452,7 +453,7 @@ return false; } // (potentially wasteful, but defensive copy) - otherEdgeList = new ArrayList<ET>(otherEdgeList); + otherEdgeList = new HashSet<ET>(otherEdgeList); if (otherEdgeList.retainAll(edgeSet)) { // Other Graph contains extra edges Modified: branches/cdom/code/src/java/pcgen/base/graph/core/DefaultDirectionalGraphEdge.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DefaultDirectionalGraphEdge.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DefaultDirectionalGraphEdge.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.List; +import java.util.Set; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -29,7 +30,7 @@ * is an edge of a Graph which is connected to two (and only two) GraphNodes. */ public class DefaultDirectionalGraphEdge<N> extends DefaultGraphEdge<N> - implements DirectionalEdge<N> + implements DirectionalGraphEdge<N> { /** @@ -94,9 +95,9 @@ * * @see pcgen.base.graph.core.DirectionalEdge#getSourceNodes() */ - public List<N> getSinkNodes() + public Set<N> getSinkNodes() { - return Collections.singletonList(getNodeAt(1)); + return Collections.singleton(getNodeAt(1)); } /** @@ -111,9 +112,9 @@ * * @see pcgen.base.graph.core.DirectionalEdge#getSourceNodes() */ - public List<N> getSourceNodes() + public Set<N> getSourceNodes() { - return Collections.singletonList(getNodeAt(0)); + return Collections.singleton(getNodeAt(0)); } } \ No newline at end of file Modified: branches/cdom/code/src/java/pcgen/base/graph/core/DefaultDirectionalHyperEdge.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DefaultDirectionalHyperEdge.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DefaultDirectionalHyperEdge.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -21,7 +21,11 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Set; +import pcgen.base.util.ListSet; +import pcgen.util.SharedHashSet; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -40,277 +44,284 @@ public class DefaultDirectionalHyperEdge<N> implements DirectionalHyperEdge<N> { - /** - * The List of source Nodes to which this DefaultDirectionalHyperEdge is - * connected. - * - * In normal operation, this List must not be empty (should be enforced in - * object construction). This List may be null if the - * DefaultDirectionalHyperEdge has no source Nodes. - */ - private final List<N> sourceNodes; + /** + * The List of source Nodes to which this DefaultDirectionalHyperEdge is + * connected. + * + * In normal operation, this List must not be empty (should be enforced in + * object construction). This List may be null if the + * DefaultDirectionalHyperEdge has no source Nodes. + */ + private final ListSet<N> sourceNodes; + /** + * The List of sink Nodes to which this DefaultDirectionalHyperEdge is + * connected. + * + * In normal operation, this List must not be null or empty (should be + * enforced in object construction). + */ + private final ListSet<N> sinkNodes; - /** - * The List of sink Nodes to which this DefaultDirectionalHyperEdge is - * connected. - * - * In normal operation, this List must not be null or empty (should be - * enforced in object construction). - */ - private final List<N> sinkNodes; + /** + * Constructs a DefaultDirectionalHyperEdge with the given Nodes as source + * Nodes and Sink Nodes. Either parameter individually may be null or an + * empty Collection; the only restriction is that both Collections cannot be + * null or empty. (A DefaultDirectionalHyperEdge must connect to at least + * one Node) + * + * @param sourceN + * The Collection of source Nodes for this + * DefaultDirectionalHyperEdge. + * @param sinkN + * The Collection of source Nodes for this + * DefaultDirectionalHyperEdge. + */ + public DefaultDirectionalHyperEdge(Collection<N> sourceN, + Collection<N> sinkN) + { + super(); + if (sourceN == null && sinkN == null) + { + throw new IllegalArgumentException( + "Both Collections to DefaultDirectionalGraphEdge cannot be null"); + } + /* + * Copy before length check for thread safety + */ + if (sourceN == null || sourceN.isEmpty()) + { + sourceNodes = null; + } + else + { + sourceNodes = new ListSet<N>(sourceN.size()); + sourceNodes.addAll(sourceN); + for (N node : sourceNodes) + { + if (node == null) + { + throw new IllegalArgumentException( + "Source Node List contains null"); + } + } + } + if (sinkN == null || sinkN.isEmpty()) + { + sinkNodes = null; + } + else + { + sinkNodes = new ListSet<N>(sinkN.size()); + sinkNodes.addAll(sinkN); + for (N node : sinkNodes) + { + if (node == null) + { + throw new IllegalArgumentException( + "Sink Node List contains null"); + } + } + } + if (sourceNodes == null && sinkNodes == null) + { + throw new IllegalArgumentException( + "GraphNode List of DefaultHyperEdge cannot be empty"); + } + } - /** - * Constructs a DefaultDirectionalHyperEdge with the given Nodes as source - * Nodes and Sink Nodes. Either parameter individually may be null or an - * empty Collection; the only restriction is that both Collections cannot be - * null or empty. (A DefaultDirectionalHyperEdge must connect to at least - * one Node) - * - * @param sourceN - * The Collection of source Nodes for this - * DefaultDirectionalHyperEdge. - * @param sinkN - * The Collection of source Nodes for this - * DefaultDirectionalHyperEdge. - */ - public DefaultDirectionalHyperEdge(Collection<N> sourceN, - Collection<N> sinkN) - { - super(); - if (sourceN == null && sinkN == null) - { - throw new IllegalArgumentException( - "Both Collections to DefaultDirectionalGraphEdge cannot be null"); - } - /* - * Copy before length check for thread safety - */ - if (sourceN == null || sourceN.isEmpty()) - { - sourceNodes = null; - } - else - { - sourceNodes = new ArrayList<N>(sourceN.size()); - sourceNodes.addAll(sourceN); - for (N node : sourceNodes) - { - if (node == null) - { - throw new IllegalArgumentException( - "Source Node List contains null"); - } - } - } - if (sinkN == null || sinkN.isEmpty()) - { - sinkNodes = null; - } - else - { - sinkNodes = new ArrayList<N>(sinkN.size()); - sinkNodes.addAll(sinkN); - for (N node : sinkNodes) - { - if (node == null) - { - throw new IllegalArgumentException( - "Sink Node List contains null"); - } - } - } - if (sourceNodes == null && sinkNodes == null) - { - throw new IllegalArgumentException( - "GraphNode List of DefaultHyperEdge cannot be empty"); - } - } + /** + * Returns the Node at the given index. + * + * @see pcgen.base.graph.core.Edge#getNodeAt(int) + */ + public N getNodeAt(int i) + { + if (sourceNodes != null && i < sourceNodes.size()) + { + return sourceNodes.get(i); + } + if (sinkNodes != null) + { + int index = sourceNodes == null ? i : i - sourceNodes.size(); + return sinkNodes.get(index); + } + throw new IndexOutOfBoundsException(); + } - /** - * Returns the Node at the given index. - * - * @see pcgen.base.graph.core.Edge#getNodeAt(int) - */ - public N getNodeAt(int i) - { - if (sourceNodes != null && i < sourceNodes.size()) - { - return sourceNodes.get(i); - } - if (sinkNodes != null) - { - int index = sourceNodes == null ? i : i - sourceNodes.size(); - return sinkNodes.get(index); - } - throw new IndexOutOfBoundsException(); - } + /** + * Returns a List of the Nodes which are adjacent (connected) to this + * DefaultDirectionalHyperEdge. + * + * Ownership of the returned List is transferred to the calling Object. No + * reference to the List Object is maintained by + * DefaultDirectionalHyperEdge. However, the Edges contained in the List are + * returned BY REFERENCE, and modification of the returned Edges will modify + * the Edges contained within the DefaultDirectionalHyperEdge. + * + * @see pcgen.base.graph.core.Edge#getAdjacentNodes() + */ + public List<N> getAdjacentNodes() + { + ArrayList<N> returnList = new ArrayList<N>(getAdjacentNodeCount()); + if (sourceNodes != null) + { + returnList.addAll(sourceNodes); + } + if (sinkNodes != null) + { + returnList.addAll(sinkNodes); + } + return returnList; + } - /** - * Returns a List of the Nodes which are adjacent (connected) to this - * DefaultDirectionalHyperEdge. - * - * Ownership of the returned List is transferred to the calling Object. No - * reference to the List Object is maintained by - * DefaultDirectionalHyperEdge. However, the Edges contained in the List are - * returned BY REFERENCE, and modification of the returned Edges will modify - * the Edges contained within the DefaultDirectionalHyperEdge. - * - * @see pcgen.base.graph.core.Edge#getAdjacentNodes() - */ - public List<N> getAdjacentNodes() - { - ArrayList<N> returnList = new ArrayList<N>(getAdjacentNodeCount()); - if (sourceNodes != null) - { - returnList.addAll(sourceNodes); - } - if (sinkNodes != null) - { - returnList.addAll(sinkNodes); - } - return returnList; - } + /** + * Returns true if the given Node is adjacent (connected) to this + * DefaultDirectionalHyperEdge. + * + * @see pcgen.base.graph.core.Edge#isAdjacentNode(java.lang.Object) + */ + public boolean isAdjacentNode(N gn) + { + if (sourceNodes != null && sourceNodes.contains(gn)) + { + return true; + } + if (sinkNodes != null && sinkNodes.contains(gn)) + { + return true; + } + return false; + } - /** - * Returns true if the given Node is adjacent (connected) to this - * DefaultDirectionalHyperEdge. - * - * @see pcgen.base.graph.core.Edge#isAdjacentNode(java.lang.Object) - */ - public boolean isAdjacentNode(N gn) - { - if (sourceNodes != null && sourceNodes.contains(gn)) - { - return true; - } - if (sinkNodes != null && sinkNodes.contains(gn)) - { - return true; - } - return false; - } + /* + * FIXME TODO This is DECEPTIVE, given that it does not return what one + * would expect to be able to use in getNodeAt :( + * + * The question is accuracy vs. storage vs. ??? Should the List that is + * storing items here really store a special object that has a key for + * source/sink/both and the items? What does that mean for the speed of the + * get lists? Should the source/sink/both be a separate list/array? + */ + /** + * Returns a count of the number of adjacent (connected) Nodes to this + * DefaultDirectionalHyperEdge. + * + * @see pcgen.base.graph.core.Edge#getAdjacentNodeCount() + */ + public int getAdjacentNodeCount() + { + if (sourceNodes == null) + { + return sinkNodes.size(); + } + else if (sinkNodes == null) + { + return sourceNodes.size(); + } + // Neither is null + int size = sourceNodes.size(); + for (N node : sinkNodes) + { + if (!sourceNodes.contains(node)) + { + size++; + } + } + return size; + } - /* - * FIXME TODO This is DECEPTIVE, given that it does not return what one - * would expect to be able to use in getNodeAt :( - * - * The question is accuracy vs. storage vs. ??? Should the List that is - * storing items here really store a special object that has a key for - * source/sink/both and the items? What does that mean for the speed of the - * get lists? Should the source/sink/both be a separate list/array? - */ + /** + * Returns a bitmask indicating the interface type of the given Node with + * respect to this DefaultDirectionalHyperEdge. + * + * @see pcgen.base.graph.core.DirectionalEdge#getNodeInterfaceType(java.lang.Object) + */ + public int getNodeInterfaceType(N node) + { + int type = 0; + if (sourceNodes != null && sourceNodes.contains(node)) + { + type |= DirectionalEdge.SOURCE; + } + if (sinkNodes != null && sinkNodes.contains(node)) + { + type |= DirectionalEdge.SINK; + } + return type; + } - /** - * Returns a count of the number of adjacent (connected) Nodes to this - * DefaultDirectionalHyperEdge. - * - * @see pcgen.base.graph.core.Edge#getAdjacentNodeCount() - */ - public int getAdjacentNodeCount() - { - if (sourceNodes == null) - { - return sinkNodes.size(); - } - else if (sinkNodes == null) - { - return sourceNodes.size(); - } - // Neither is null - int size = sourceNodes.size(); - for (N node : sinkNodes) - { - if (!sourceNodes.contains(node)) - { - size++; - } - } - return size; - } + /** + * Returns a List of the sink Nodes of this DefaultDirectionalHyperEdge. + * Will return null if there are no sink Nodes. + * + * Ownership of the returned List is transferred to the calling Object. No + * reference to the List Object is maintained by + * DefaultDirectionalHyperEdge. However, the Edges contained in the List are + * returned BY REFERENCE, and modification of the returned Edges will modify + * the Edges contained within the DefaultDirectionalHyperEdge. + * + * @see pcgen.base.graph.core.DirectionalEdge#getSinkNodes() + */ + public Set<N> getSinkNodes() + { + if (sinkNodes == null) + { + return Collections.emptySet(); + } + return new SharedHashSet<N>(sinkNodes); + } - /** - * Returns a bitmask indicating the interface type of the given Node with - * respect to this DefaultDirectionalHyperEdge. - * - * @see pcgen.base.graph.core.DirectionalEdge#getNodeInterfaceType(java.lang.Object) - */ - public int getNodeInterfaceType(N node) - { - int type = 0; - if (sourceNodes != null && sourceNodes.contains(node)) - { - type |= DirectionalEdge.SOURCE; - } - if (sinkNodes != null && sinkNodes.contains(node)) - { - type |= DirectionalEdge.SINK; - } - return type; - } + /** + * Returns a List of the source Nodes of this DefaultDirectionalHyperEdge. + * Will return null if there are no source Nodes. + * + * Ownership of the returned List is transferred to the calling Object. No + * reference to the List Object is maintained by + * DefaultDirectionalHyperEdge. However, the Nodes contained in the List are + * returned BY REFERENCE, and modification of the returned Nodes will modify + * the Nodes contained within the DefaultDirectionalHyperEdge. + * + * @see pcgen.base.graph.core.DirectionalEdge#getSourceNodes() + */ + public Set<N> getSourceNodes() + { + if (sourceNodes == null) + { + return Collections.emptySet(); + } + return new SharedHashSet<N>(sourceNodes); + } - /** - * Returns a List of the sink Nodes of this DefaultDirectionalHyperEdge. - * Will return null if there are no sink Nodes. - * - * Ownership of the returned List is transferred to the calling Object. No - * reference to the List Object is maintained by - * DefaultDirectionalHyperEdge. However, the Edges contained in the List are - * returned BY REFERENCE, and modification of the returned Edges will modify - * the Edges contained within the DefaultDirectionalHyperEdge. - * - * @see pcgen.base.graph.core.DirectionalEdge#getSinkNodes() - */ - public List<N> getSinkNodes() - { - return sinkNodes == null ? null : new ArrayList<N>(sinkNodes); - } + /** + * Creates a replacement DefaultDirectionalHyperEdge with the given Nodes as + * source Nodes and Sink Nodes. Either parameter individually may be null or + * an empty Collection; the only restriction is that both Collections cannot + * be null or empty. (A DefaultDirectionalHyperEdge must connect to at least + * one Node) + * + * @see pcgen.base.graph.core.DirectionalHyperEdge#createReplacementEdge(java.util.Collection, + * java.util.Collection) + */ + public DefaultDirectionalHyperEdge<N> createReplacementEdge( + Collection<N> gn1, Collection<N> gn2) + { + if (gn1 == null) + { + throw new IllegalArgumentException( + "Incoming Collection to createReplacementEdge in DefaultGraphEdge cannot be null"); + } + if (gn2 == null) + { + throw new IllegalArgumentException( + "Outgoing Collection to createReplacementEdge in DefaultGraphEdge cannot be null"); + } + // Not thread safe to test this before copying the list... + if (gn1.size() != 1 && gn2.size() != 1) + { + throw new IllegalArgumentException( + "Collection Lengths to createReplacementEdge in DefaultGraphEdge must be 1 each"); + } + return new DefaultDirectionalHyperEdge<N>(gn1, gn2); + } - /** - * Returns a List of the source Nodes of this DefaultDirectionalHyperEdge. - * Will return null if there are no source Nodes. - * - * Ownership of the returned List is transferred to the calling Object. No - * reference to the List Object is maintained by - * DefaultDirectionalHyperEdge. However, the Nodes contained in the List are - * returned BY REFERENCE, and modification of the returned Nodes will modify - * the Nodes contained within the DefaultDirectionalHyperEdge. - * - * @see pcgen.base.graph.core.DirectionalEdge#getSourceNodes() - */ - public List<N> getSourceNodes() - { - return sourceNodes == null ? null : new ArrayList<N>(sourceNodes); - } - - /** - * Creates a replacement DefaultDirectionalHyperEdge with the given Nodes as - * source Nodes and Sink Nodes. Either parameter individually may be null or - * an empty Collection; the only restriction is that both Collections cannot - * be null or empty. (A DefaultDirectionalHyperEdge must connect to at least - * one Node) - * - * @see pcgen.base.graph.core.DirectionalHyperEdge#createReplacementEdge(java.util.Collection, - * java.util.Collection) - */ - public DefaultDirectionalHyperEdge<N> createReplacementEdge( - Collection<N> gn1, Collection<N> gn2) - { - if (gn1 == null) - { - throw new IllegalArgumentException( - "Incoming Collection to createReplacementEdge in DefaultGraphEdge cannot be null"); - } - if (gn2 == null) - { - throw new IllegalArgumentException( - "Outgoing Collection to createReplacementEdge in DefaultGraphEdge cannot be null"); - } - // Not thread safe to test this before copying the list... - if (gn1.size() != 1 && gn2.size() != 1) - { - throw new IllegalArgumentException( - "Collection Lengths to createReplacementEdge in DefaultGraphEdge must be 1 each"); - } - return new DefaultDirectionalHyperEdge<N>(gn1, gn2); - } -} \ No newline at end of file +} Modified: branches/cdom/code/src/java/pcgen/base/graph/core/DefaultHyperEdge.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DefaultHyperEdge.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DefaultHyperEdge.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import pcgen.util.SharedArrayList; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -30,7 +31,7 @@ * HyperEdge. As a HyperEdge, a DefaultHyperEdge can be connected to any * non-zero number of GraphNodes. */ -public class DefaultHyperEdge<N> implements NonDirectionalEdge<N> +public class DefaultHyperEdge<N> implements NonDirectionalEdge<N>, HyperEdge<N> { /** @@ -101,7 +102,7 @@ */ public List<N> getAdjacentNodes() { - return new ArrayList<N>(nodes); + return new SharedArrayList<N>(nodes); } /** @@ -137,6 +138,7 @@ * * @see pcgen.base.graph.core.NonDirectionalEdge#createReplacementEdge(java.util.Collection) */ + @Deprecated public DefaultHyperEdge<N> createReplacementEdge(Collection<N> gn1) { return new DefaultHyperEdge<N>(gn1); Modified: branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalEdge.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalEdge.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalEdge.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -19,7 +19,7 @@ */ package pcgen.base.graph.core; -import java.util.List; +import java.util.Set; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -69,12 +69,12 @@ * * @return A List of the Source Nodes of this DirectionalEdge */ - public List<N> getSourceNodes(); + public Set<N> getSourceNodes(); /** * Returns a List of the Sink Nodes of this DirectionalEdge. * * @return A List of the Sink Nodes of this DirectionalEdge */ - public List<N> getSinkNodes(); + public Set<N> getSinkNodes(); } \ No newline at end of file Modified: branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalGraph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalGraph.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalGraph.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -19,7 +19,7 @@ */ package pcgen.base.graph.core; -import java.util.List; +import java.util.Set; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -42,7 +42,7 @@ * The Node for which to return the inward Edges. * @return The List of Edges for which the given Node is a sink Node. */ - public List<ET> getInwardEdgeList(N v); + public Set<ET> getInwardEdgeSet(N v); /** * Returns a List of the Edges for which the given Node is a source Node in @@ -52,7 +52,7 @@ * The Node for which to return the outward Edges. * @return The List of Edges for which the given Node is a source Node. */ - public List<ET> getOutwardEdgeList(N v); + public Set<ET> getOutwardEdgeSet(N v); /** * Returns true if the given Node is connected to any Edge in this Added: branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalGraphEdge.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalGraphEdge.java (rev 0) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalGraphEdge.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -0,0 +1,31 @@ +/* + * DirectionalGraphEdge.java + * Copyright 2008 (C) Connor Petty <mis...@gm...> + * + * 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; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on Mar 6, 2008, 7:29:44 PM + */ + +package pcgen.base.graph.core; + +/** + * + * @author Connor Petty <mis...@gm...> + */ +public interface DirectionalGraphEdge<T> extends GraphEdge<T>, DirectionalEdge<T> +{ + +} Modified: branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalHyperEdge.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalHyperEdge.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalHyperEdge.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -46,6 +46,7 @@ * DirectionalHyperEdge * @return A Replacement DirectionalHyperEdge connected to the given Nodes */ + @Deprecated public DirectionalHyperEdge<N> createReplacementEdge(Collection<N> gn1, Collection<N> gn2); Modified: branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalIdentityEdgeMapGraph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalIdentityEdgeMapGraph.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalIdentityEdgeMapGraph.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -20,9 +20,9 @@ */ package pcgen.base.graph.core; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -89,16 +89,16 @@ * are returned BY REFERENCE, and modification of the returned Edges will * modify the Edges contained within the DirectionalIdentityEdgeMapGraph. * - * @see pcgen.base.graph.core.DirectionalGraph#getInwardEdgeList(java.lang.Object) + * @see pcgen.base.graph.core.DirectionalGraph#getInwardEdgeSet(java.lang.Object) */ - public List<ET> getInwardEdgeList(N v) + public Set<ET> getInwardEdgeSet(N v) { - List<ET> adjacentEdgeList = super.getAdjacentEdges(v); + Set<ET> adjacentEdgeList = super.getAdjacentEdges(v); if (adjacentEdgeList == null) { - return null; + return Collections.emptySet(); } - List<ET> inwardEdgeList = new LinkedList<ET>(); + Set<ET> inwardEdgeList = new HashSet<ET>(); for (ET edge : adjacentEdgeList) { if ((edge.getNodeInterfaceType(v) & DirectionalEdge.SINK) != 0) @@ -118,16 +118,16 @@ * are returned BY REFERENCE, and modification of the returned Edges will * modify the Edges contained within the DirectionalIdentityEdgeMapGraph. * - * @see pcgen.base.graph.core.DirectionalGraph#getOutwardEdgeList(java.lang.Object) + * @see pcgen.base.graph.core.DirectionalGraph#getOutwardEdgeSet(java.lang.Object) */ - public List<ET> getOutwardEdgeList(N v) + public Set<ET> getOutwardEdgeSet(N v) { - List<ET> adjacentEdgeList = super.getAdjacentEdges(v); + Set<ET> adjacentEdgeList = super.getAdjacentEdges(v); if (adjacentEdgeList == null) { - return null; + return Collections.emptySet(); } - List<ET> outwardEdgeList = new ArrayList<ET>(); + Set<ET> outwardEdgeList = new HashSet<ET>(); for (ET edge : adjacentEdgeList) { if ((edge.getNodeInterfaceType(v) & DirectionalEdge.SOURCE) != 0) @@ -145,7 +145,7 @@ */ public boolean hasInwardEdge(N v) { - List<ET> adjacentEdgeList = super.getAdjacentEdges(v); + Set<ET> adjacentEdgeList = super.getAdjacentEdges(v); if (adjacentEdgeList == null) { return false; @@ -168,7 +168,7 @@ */ public boolean hasOutwardEdge(N v) { - List<ET> adjacentEdgeList = super.getAdjacentEdges(v); + Set<ET> adjacentEdgeList = super.getAdjacentEdges(v); if (adjacentEdgeList == null) { return false; Modified: branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalListMapGraph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalListMapGraph.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalListMapGraph.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -19,9 +19,8 @@ */ package pcgen.base.graph.core; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; +import java.util.Collections; +import java.util.HashSet; import java.util.Set; /** @@ -88,16 +87,16 @@ * modification of the returned Edges will modify the Edges contained within * the DirectionalListMapGraph. * - * @see pcgen.base.graph.core.DirectionalGraph#getInwardEdgeList(java.lang.Object) + * @see pcgen.base.graph.core.DirectionalGraph#getInwardEdgeSet(java.lang.Object) */ - public List<ET> getInwardEdgeList(N v) + public Set<ET> getInwardEdgeSet(N v) { Set<ET> adjacentEdgeList = super.getAdjacentEdges(v); if (adjacentEdgeList == null) { - return null; + return Collections.emptySet(); } - List<ET> inwardEdgeList = new LinkedList<ET>(); + Set<ET> inwardEdgeList = new HashSet<ET>(); for (ET edge : adjacentEdgeList) { if ((edge.getNodeInterfaceType(v) & DirectionalEdge.SINK) != 0) @@ -117,16 +116,16 @@ * modification of the returned Edges will modify the Edges contained within * the DirectionalListMapGraph. * - * @see pcgen.base.graph.core.DirectionalGraph#getOutwardEdgeList(java.lang.Object) + * @see pcgen.base.graph.core.DirectionalGraph#getOutwardEdgeSet(java.lang.Object) */ - public List<ET> getOutwardEdgeList(N v) + public Set<ET> getOutwardEdgeSet(N v) { Set<ET> adjacentEdgeList = super.getAdjacentEdges(v); if (adjacentEdgeList == null) { - return null; + return Collections.emptySet(); } - List<ET> outwardEdgeList = new ArrayList<ET>(); + Set<ET> outwardEdgeList = new HashSet<ET>(); for (ET edge : adjacentEdgeList) { if ((edge.getNodeInterfaceType(v) & DirectionalEdge.SOURCE) != 0) Modified: branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalSetMapGraph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalSetMapGraph.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/DirectionalSetMapGraph.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -19,9 +19,7 @@ */ package pcgen.base.graph.core; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; +import java.util.HashSet; import java.util.Set; /** @@ -86,14 +84,14 @@ * modification of the returned Edges will modify the Edges contained within * the DirectionalSetMapGraph. * - * @see pcgen.base.graph.core.DirectionalGraph#getInwardEdgeList(java.lang.Object) + * @see pcgen.base.graph.core.DirectionalGraph#getInwardEdgeSet(java.lang.Object) */ - public List<ET> getInwardEdgeList(N v) { + public Set<ET> getInwardEdgeSet(N v) { Set<ET> adjacentEdgeList = super.getAdjacentEdges(v); if (adjacentEdgeList == null) { return null; } - List<ET> inwardEdgeList = new LinkedList<ET>(); + Set<ET> inwardEdgeList = new HashSet<ET>(); for (ET edge : adjacentEdgeList) { if ((edge.getNodeInterfaceType(v) & DirectionalEdge.SINK) != 0) { inwardEdgeList.add(edge); @@ -111,14 +109,14 @@ * modification of the returned Edges will modify the Edges contained within * the DirectionalSetMapGraph. * - * @see pcgen.base.graph.core.DirectionalGraph#getOutwardEdgeList(java.lang.Object) + * @see pcgen.base.graph.core.DirectionalGraph#getOutwardEdgeSet(java.lang.Object) */ - public List<ET> getOutwardEdgeList(N v) { + public Set<ET> getOutwardEdgeSet(N v) { Set<ET> adjacentEdgeList = super.getAdjacentEdges(v); if (adjacentEdgeList == null) { return null; } - List<ET> outwardEdgeList = new ArrayList<ET>(); + Set<ET> outwardEdgeList = new HashSet<ET>(); for (ET edge : adjacentEdgeList) { if ((edge.getNodeInterfaceType(v) & DirectionalEdge.SOURCE) != 0) { outwardEdgeList.add(edge); Added: branches/cdom/code/src/java/pcgen/base/graph/core/EdgeFactory.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/EdgeFactory.java (rev 0) +++ branches/cdom/code/src/java/pcgen/base/graph/core/EdgeFactory.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -0,0 +1,55 @@ +/* + * EdgeFactory.java + * Copyright 2008 (C) Connor Petty <mis...@gm...> + * + * 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; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on Mar 6, 2008, 7:20:10 PM + */ +package pcgen.base.graph.core; + +import java.util.Collection; + +/** + * + * @author Connor Petty <mis...@gm...> + */ +public final class EdgeFactory +{ + + public static final <T> GraphEdge<T> createGraphEdge(T node1, + T node2) + { + return new DefaultGraphEdge<T>(node1, node2); + } + + public static final <T> DirectionalGraphEdge<T> createDirectionalGraphEdge(T node1, + T node2) + { + return new DefaultDirectionalGraphEdge<T>(node1, node2); + } + + public static final <T> HyperEdge<T> createHyperEdge(Collection<T> nodeArray) + { + return new DefaultHyperEdge<T>(nodeArray); + } + + public static final <T> DirectionalHyperEdge<T> createDirectionalHyperEdge(Collection<T> na1, + Collection<T> na2) + { + return new DefaultDirectionalHyperEdge(na1, na2); + } + +} Modified: branches/cdom/code/src/java/pcgen/base/graph/core/Graph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/Graph.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/Graph.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -21,6 +21,7 @@ import java.util.Collection; import java.util.List; +import java.util.Set; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -123,7 +124,7 @@ * * @return A List of the Nodes in this Graph */ - public List<N> getNodeList(); + public Set<N> getNodes(); /** * Returns a List of the Edges in this Graph. Will return an Empty List (not @@ -131,7 +132,7 @@ * * @return A List of the Edges in this Graph */ - public List<ET> getEdgeList(); + public Set<ET> getEdges(); /** * Removes the given Node from the Graph. @@ -166,14 +167,14 @@ /** * Returns a Set of the Edges that are adjacent (connected) to the given - * Node. Returns null if the given Node is not present in the Graph. + * Node. * * @param v * The Node for which the adjacent Edges should be returned. * @return A Set of the Edges that are adjacent (connected) to the given * Node. */ - public Collection<ET> getAdjacentEdges(N v); + public Set<ET> getAdjacentEdges(N v); /** * Adds a new GraphChangeListener to receive GraphChangeEvents Modified: branches/cdom/code/src/java/pcgen/base/graph/core/GraphEdge.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/GraphEdge.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/GraphEdge.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -56,5 +56,6 @@ * The second Node to be connected to the replacement GraphEdge. * @return The replacement GraphEdge. */ + @Deprecated public GraphEdge<N> createReplacementEdge(N gn1, N gn2); } \ No newline at end of file Modified: branches/cdom/code/src/java/pcgen/base/graph/core/GraphUtilities.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/GraphUtilities.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/GraphUtilities.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -107,8 +107,7 @@ private static <A, ET extends DirectionalEdge<A>> void accumulateDescendentNodes( DirectionalGraph<A, ET> graph, A node, Collection<A> descendents) { - List<ET> children = graph.getOutwardEdgeList(node); - for (ET edge : children) + for (ET edge : graph.getOutwardEdgeSet(node)) { List<A> graphNodes = edge.getAdjacentNodes(); for (A gn : graphNodes) Added: branches/cdom/code/src/java/pcgen/base/graph/core/HyperEdge.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/HyperEdge.java (rev 0) +++ branches/cdom/code/src/java/pcgen/base/graph/core/HyperEdge.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -0,0 +1,31 @@ +/* + * HyperEdge.java + * Copyright 2008 (C) Connor Petty <mis...@gm...> + * + * 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; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on Mar 6, 2008, 7:35:39 PM + */ + +package pcgen.base.graph.core; + +/** + * + * @author Connor Petty <mis...@gm...> + */ +public interface HyperEdge<T> extends Edge<T> +{ + +} Modified: branches/cdom/code/src/java/pcgen/base/graph/core/NonDirectionalEdge.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/NonDirectionalEdge.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/NonDirectionalEdge.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -29,6 +29,7 @@ * NonDirectionalEdge places no contract on the number of Nodes to which it can * be connected, other than it must be greater than zero. */ +@Deprecated public interface NonDirectionalEdge<N> extends Edge<N> { /** @@ -45,5 +46,5 @@ * @return A 'replacement' Edge for this NonDirectionalEdge which is * connected to the given Nodes. */ - public NonDirectionalEdge<N> createReplacementEdge(Collection<N> gn1); + public NonDirectionalEdge<N> createReplacementEdge(Collection<N> gn1); } \ No newline at end of file Modified: branches/cdom/code/src/java/pcgen/base/graph/core/SimpleListGraph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/SimpleListGraph.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/core/SimpleListGraph.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -159,11 +159,11 @@ * modification of the returned Nodes will modify the nodes contained within * the SimpleListGraph. * - * @see pcgen.base.graph.core.Graph#getNodeList() + * @see pcgen.base.graph.core.Graph#getNodes() */ - public List<N> getNodeList() + public Set<N> getNodes() { - return new ArrayList<N>(nodeList); + return new HashSet<N>(nodeList); } /** @@ -175,11 +175,11 @@ * modification of the returned Edges will modify the Edges contained within * the SimpleListGraph. * - * @see pcgen.base.graph.core.Graph#getEdgeList() + * @see pcgen.base.graph.core.Graph#getEdges() */ - public List<ET> getEdgeList() + public Set<ET> getEdges() { - return new ArrayList<ET>(edgeList); + return new HashSet<ET>(edgeList); } /** @@ -325,28 +325,28 @@ return false; } Graph<N, ET> otherGraph = (Graph<N, ET>) other; - List<N> otherNodeList = otherGraph.getNodeList(); + Set<N> otherNodeList = otherGraph.getNodes(); int thisNodeSize = nodeList.size(); if (thisNodeSize != otherNodeList.size()) { return false; } // (potentially wasteful, but defensive copy) - otherNodeList = new ArrayList<N>(otherNodeList); + otherNodeList = new HashSet<N>(otherNodeList); if (otherNodeList.retainAll(nodeList)) { // Other Graph contains extra nodes return false; } // Here, the node lists are identical... - List<ET> otherEdgeList = otherGraph.getEdgeList(); + Set<ET> otherEdgeList = otherGraph.getEdges(); int thisEdgeSize = edgeList.size(); if (thisEdgeSize != otherEdgeList.size()) { return false; } // (potentially wasteful, but defensive copy) - otherEdgeList = new ArrayList<ET>(otherEdgeList); + otherEdgeList = new HashSet<ET>(otherEdgeList); // possible that the Other Graph contains extra edges return !otherEdgeList.retainAll(edgeList); } Modified: branches/cdom/code/src/java/pcgen/base/graph/visitor/DirectedNodeWeightCalculation.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/visitor/DirectedNodeWeightCalculation.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/graph/visitor/DirectedNodeWeightCalculation.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -18,7 +18,7 @@ package pcgen.base.graph.visitor; import java.util.IdentityHashMap; -import java.util.List; +import java.util.Set; import pcgen.base.graph.core.DirectionalEdge; import pcgen.base.graph.core.DirectionalGraph; @@ -193,13 +193,13 @@ { loopDetect = currentNodeCount; } - for (N node : workingGraph.getNodeList()) + for (N node : workingGraph.getNodes()) { - if (!workingGraph.getInwardEdgeList(node).isEmpty()) + if (!workingGraph.getInwardEdgeSet(node).isEmpty()) { continue; } - List<ET> inEdges = relevantGraph.getInwardEdgeList(node); + Set<ET> inEdges = relevantGraph.getInwardEdgeSet(node); int weight; if (inEdges.isEmpty()) { @@ -214,7 +214,7 @@ } } nodeWeightMap.put(node, Integer.valueOf(weight)); - for (ET edge : workingGraph.getOutwardEdgeList(node)) + for (ET edge : workingGraph.getOutwardEdgeSet(node)) { int edgeWeight = getEdgeWeight(weight, edge); edgeWeightMap.put(edge, Integer.valueOf(edgeWeight)); Modified: branches/cdom/code/src/java/pcgen/base/util/ListSet.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/util/ListSet.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/base/util/ListSet.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -19,7 +19,7 @@ */ package pcgen.base.util; -import java.util.AbstractSet; +import java.util.AbstractList; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; @@ -33,7 +33,7 @@ * Set. This is most useful to minimize the memory footprint for very small sets * where search time will not be a concern. */ -public class ListSet<T> extends AbstractSet<T> implements Set<T> +public class ListSet<T> extends AbstractList<T> implements Set<T> { /** @@ -245,4 +245,11 @@ } return false; } + + @Override + public T get(int index) + { + return list.get(index); + } + } Modified: branches/cdom/code/src/java/pcgen/cdom/enumeration/ObjectKey.java =================================================================== --- branches/cdom/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-03-09 16:10:45 UTC (rev 5525) +++ branches/cdom/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-03-09 19:28:20 UTC (rev 5526) @@ -43,13 +43,13 @@ import pcgen.cdom.helper.ChoiceSet; import pcgen.cdom.inst.CDOMAlignment; import pcgen.cdom.inst.CDOMArmorProf; +import pcgen.cdom.inst.CDOMDeity; import pcgen.cdom.inst.CDOMEquipment; import pcgen.cdom.inst.CDOMPCClass; import pcgen.cdom.inst.CDOMShieldProf; import pcgen.cdom.inst.CDOMSizeAdjustment; import pcgen.cdom.inst.CDOMStat; import pcgen.cdom.inst.CDOMWeaponProf; -import pcgen.core.Deity; import pcgen.util.enumeration.DefaultTriState; import pcgen.util.enumeration.Load; import pcgen.util.enumeration.Visibility; @@ -186,7 +186,7 @@ public... [truncated message content] |