// Copyright (c) 2011, 2015 Kiel University and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0.
//
// SPDX-License-Identifier: EPL-2.0

// Package intermediate contains the processors run between ELK Layered's five // main phases.
package intermediate import ( basegraph ) // ProcessPortSides makes every port side-fixed. It is the direct counterpart // of ELK 0.8.1's PortSideProcessor and deliberately visits layerless nodes // before layered nodes. func ( *layered.LGraphArena, layered.LGraphID) { := .Graph() for , := range .LayerlessNodes { processNodePortSides(, ) } for , := range .Layers { for , := range .Layer().Nodes { processNodePortSides(, ) } } } func processNodePortSides( *layered.LGraphArena, layered.LNodeID) { := .Node() := basegraph.Get(&.Properties, layered.PortConstraintsOption) if .IsSideFixed() { for , := range .Ports { if .Port().Side == layered.UndefinedSide { SetPortSide(, ) } } return } for , := range .Ports { SetPortSide(, ) } basegraph.Set(&.Properties, layered.PortConstraintsOption, layered.PortConstraintsFixedSide) } // SetPortSide places input ports west and output ports east. A port connected // to an external-port dummy inherits that dummy's side instead. func ( *layered.LGraphArena, layered.LPortID) { := .Port() if , := basegraph.TryGet(&.Properties, layered.PortDummy); { .SetPortSide(, basegraph.Get(&.Node().Properties, layered.ExternalPortSide)) return } if len(.IncomingEdges)-len(.OutgoingEdges) < 0 { .SetPortSide(, layered.EastSide) } else { .SetPortSide(, layered.WestSide) } }