Mercurial > projects > dwt-addons
diff dwtx/draw2d/graph/SpanningTreeVisitor.d @ 98:95307ad235d9
Added Draw2d code, still work in progress
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sun, 03 Aug 2008 00:52:14 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwtx/draw2d/graph/SpanningTreeVisitor.d Sun Aug 03 00:52:14 2008 +0200 @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2003, 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module dwtx.draw2d.graph.SpanningTreeVisitor; + +import dwt.dwthelper.utils; +import dwtx.draw2d.graph.GraphVisitor; +import dwtx.draw2d.graph.Edge; +import dwtx.draw2d.graph.Node; +import dwtx.draw2d.graph.EdgeList; + +/** + * A base class for visitors which operate on the graphs spanning tree used to induce rank + * assignments. + * @author Randy Hudson + * @since 2.1.2 + */ +abstract class SpanningTreeVisitor : GraphVisitor { + +Edge getParentEdge(Node node) { + return cast(Edge)node.workingData[1]; +} + +EdgeList getSpanningTreeChildren(Node node) { + return cast(EdgeList)node.workingData[0]; +} + +protected Node getTreeHead(Edge edge) { + if (getParentEdge(edge.source) is edge) + return edge.target; + return edge.source; +} + +Node getTreeParent(Node node) { + Edge e = getParentEdge(node); + if (e is null) + return null; + return e.opposite(node); +} + +protected Node getTreeTail(Edge edge) { + if (getParentEdge(edge.source) is edge) + return edge.source; + return edge.target; +} + +void setParentEdge(Node node, Edge edge) { + node.workingData[1] = edge; +} + +}