DIRECTORY Graphs, Rope; GraphsImpl: CEDAR PROGRAM IMPORTS Rope EXPORTS Graphs = BEGIN OPEN Graphs; NewVertexType: PUBLIC PROC [vtr: VertexTypeRep] RETURNS [vt: VertexType] = { vt _ NEW [VertexTypeRep _ vtr]; IF vt.GetLabel = NIL THEN vt.GetLabel _ GetNoLabel; IF vt.LabelEdges = NIL THEN vt.LabelEdges _ LabelEdgesFromExpand; IF vt.CrossLabeledEdge = NIL THEN vt.CrossLabeledEdge _ CrossLabeledEdgeFromExpand; IF vt.GetIndexedNeighbor = NIL THEN vt.GetIndexedNeighbor _ GetIndexedNeighborFromExpand; IF vt.GetNeighborCount = NIL THEN vt.GetNeighborCount _ GetNeighborCountFromLabels; }; GetNoLabel: PROC [vertex: Vertex] RETURNS [label: Label] = {label _ unlabeled}; LabelEdgesFromExpand: PROC [vertex: Vertex, consume: LabelConsumer] = { PerEdge: PROC [edge: Edge, data: REF ANY] = {consume.proc[edge.label, consume.data]}; TRUSTED {vertex.type.Expand[vertex, [PerEdge]]}}; Abort: ERROR = CODE; CrossLabeledEdgeFromExpand: PROC [vertex: Vertex, edgeLabel: Label] RETURNS [neighbor: Vertex] = { PerEdge: PROC [edge: Edge, data: REF ANY] = { IF edge.label.Equal[edgeLabel] THEN {neighbor _ edge.otherSide; Abort}; }; neighbor _ NIL; TRUSTED {vertex.type.Expand[vertex, [PerEdge] !Abort => CONTINUE]}; }; GetIndexedNeighborFromExpand: PROC [vertex: Vertex, index: INT--origin 1--] RETURNS [neighbor: Vertex] = { i: INT _ 0; PerEdge: PROC [edge: Edge, data: REF ANY] = { i _ i + 1; IF index = i THEN {neighbor _ edge.otherSide; Abort}; }; neighbor _ NIL; TRUSTED {vertex.type.Expand[vertex, [PerEdge] !Abort => CONTINUE]}; }; GetNeighborCountFromLabels: PROC [vertex: Vertex] RETURNS [neighborCount: INT] = { PerLabel: PROC [edgeLabel: Label, data: REF ANY] = { neighborCount _ neighborCount + 1; }; neighborCount _ 0; TRUSTED {vertex.type.LabelEdges[vertex, [PerLabel] !Abort => CONTINUE]}; }; Setup: PROC = BEGIN END; Setup[]; END. NGraphsImpl.Mesa Last Edited by: Spreitzer, June 6, 1985 4:35:40 pm PDT Κ–– "cedar" style˜J™J™6J˜IcodešΟk œ˜K˜šΠbx œœ˜Kšœ˜ Kšœ ˜—K˜Kšœœ˜K˜šΟn œœœœ˜LKšœœ˜Kšœœœ˜3Kšœœœ&˜AKšœœœ2˜SKšœœœ6˜YKšœœœ2˜SK˜—K˜KšŸ œœœ&˜OK˜šŸœœ-˜GšŸœœœœ˜+Kšœ)˜)—Kšœ*˜1—K˜Kšœœœ˜K˜šŸœœ$œ˜bšŸœœœœ˜-Kšœœ$˜GK˜—Kšœ œ˜Kšœ1œ˜CK˜—K˜š ŸœœΟc œœ˜jKšœœ˜ šŸœœœœ˜-K˜ Kšœ œ$˜5K˜—Kšœ œ˜Kšœ1œ˜CK˜—K˜šŸœœœœ˜RšŸœœœœ˜4Kšœ"˜"K˜—Kšœ˜Kšœ6œ˜HK˜—K˜šŸœœ˜ Kš˜Kšœ˜—K˜K˜K˜Kšœ˜—…—6