From cca66b9ec4e494c1d919bff0f71a820d8afab1fa Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 20:24:48 +0200 Subject: Adding upstream version 1.2.2. Signed-off-by: Daniel Baumann --- src/3rdparty/adaptagrams/libavoid/hyperedgetree.h | 143 ++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 src/3rdparty/adaptagrams/libavoid/hyperedgetree.h (limited to 'src/3rdparty/adaptagrams/libavoid/hyperedgetree.h') diff --git a/src/3rdparty/adaptagrams/libavoid/hyperedgetree.h b/src/3rdparty/adaptagrams/libavoid/hyperedgetree.h new file mode 100644 index 0000000..91c30ad --- /dev/null +++ b/src/3rdparty/adaptagrams/libavoid/hyperedgetree.h @@ -0,0 +1,143 @@ +/* + * vim: ts=4 sw=4 et tw=0 wm=0 + * + * libavoid - Fast, Incremental, Object-avoiding Line Router + * + * Copyright (C) 2011-2014 Monash University + * + * 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. + * See the file LICENSE.LGPL distributed with the library. + * + * Licensees holding a valid commercial license may use this file in + * accordance with the commercial license agreement provided with the + * library. + * + * 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. + * + * Author(s): Michael Wybrow +*/ + +#ifndef AVOID_HYPEREDGETREE_H +#define AVOID_HYPEREDGETREE_H + +#include +#include +#include +#include +#include + +#include "libavoid/geomtypes.h" + +//#define MAJOR_HYPEREDGE_IMPROVEMENT_DEBUG + +namespace Avoid { + +// These classes are not intended for public use. +// They are used to represent a hyperedge as a tree that certain +// transformations can be easily performed on to improve the routing +// of the hyperedge. + +class JunctionRef; +class ConnRef; +class HyperedgeShiftSegment; +class VertInf; +class Router; + +struct HyperedgeTreeEdge; +struct HyperedgeTreeNode; + +typedef std::map + JunctionHyperedgeTreeNodeMap; +typedef std::set JunctionSet; +typedef std::list JunctionRefList; +typedef std::list ConnRefList; + +class CmpNodesInDim; + +typedef std::set OrderedHENodeSet; + +struct HyperedgeTreeNode +{ + HyperedgeTreeNode(); + ~HyperedgeTreeNode(); + + void deleteEdgesExcept(HyperedgeTreeEdge *ignored); + bool removeOtherJunctionsFrom(HyperedgeTreeEdge *ignored, + JunctionSet &treeRoots); + void outputEdgesExcept(FILE *fp, HyperedgeTreeEdge *ignored); + void disconnectEdge(HyperedgeTreeEdge *edge); + void spliceEdgesFrom(HyperedgeTreeNode *oldNode); + void writeEdgesToConns(HyperedgeTreeEdge *ignored, size_t pass); + void addConns(HyperedgeTreeEdge *ignored, Router *router, + ConnRefList& oldConns, ConnRef *conn); + void updateConnEnds(HyperedgeTreeEdge *ignored, bool forward, + ConnRefList& changedConns); + void listJunctionsAndConnectors(HyperedgeTreeEdge *ignored, + JunctionRefList& junctions, ConnRefList& connectors); + bool isImmovable(void) const; + void validateHyperedge(const HyperedgeTreeEdge *ignored, + const size_t dist) const; + + std::list edges; + JunctionRef *junction; + Point point; + OrderedHENodeSet *shiftSegmentNodeSet; + VertInf *finalVertex; + bool isConnectorSource; + bool isPinDummyEndpoint; + bool visited; +}; + +struct HyperedgeTreeEdge +{ + HyperedgeTreeEdge(HyperedgeTreeNode *node1, HyperedgeTreeNode *node2, + ConnRef *conn); + + HyperedgeTreeNode *followFrom(HyperedgeTreeNode *from) const; + bool zeroLength(void) const; + void splitFromNodeAtPoint(HyperedgeTreeNode *source, const Point& point); + bool hasOrientation(const size_t dimension) const; + void outputNodesExcept(FILE *file, HyperedgeTreeNode *ignored); + void deleteNodesExcept(HyperedgeTreeNode *ignored); + bool removeOtherJunctionsFrom(HyperedgeTreeNode *ignored, + JunctionSet &treeRoots); + void writeEdgesToConns(HyperedgeTreeNode *ignored, size_t pass); + void addConns(HyperedgeTreeNode *ignored, Router *router, + ConnRefList& oldConns); + void updateConnEnds(HyperedgeTreeNode *ignored, bool forward, + ConnRefList& changedConns); + void disconnectEdge(void); + void replaceNode(HyperedgeTreeNode *oldNode, + HyperedgeTreeNode *newNode); + void listJunctionsAndConnectors(HyperedgeTreeNode *ignored, + JunctionRefList& junctions, ConnRefList& connectors); + void validateHyperedge(const HyperedgeTreeNode *ignored, + const size_t dist) const; + + std::pair ends; + ConnRef *conn; + bool hasFixedRoute; +}; + + +typedef std::map VertexNodeMap; + + +class CmpNodesInDim +{ + public: + CmpNodesInDim(const size_t dim); + bool operator()(const HyperedgeTreeNode *lhs, + const HyperedgeTreeNode *rhs) const; + private: + const size_t m_dimension; +}; + +} + +#endif -- cgit v1.2.3