../../README.md "OGDF" » ../dev-guide.md "Developer's Guide" » ../porting.md "Porting Guide" » Unreleased
OGDF now requires C++17 features. We no longer officially support compilers older than gcc 9, clang 9 or Visual Studio 2017 15.8 (MSVC 19.15).
The OGDF now uses iwyu to make sure each source file explicitly lists all header files it uses, but no further unused headers. This especially means that certain headers that were previously transitively provided but not used by some other header now might need to be explicitly included in your code. We recommend also running iwyu on your code before (and also after) porting to get an explicit overview over which imports are used from where.
Due to the RegisteredArray
changes mentioned below, this also means that the following header files have been removed as all their functionality is now included in the corresponding (Cluster/Hyper)Graph.h
file.
The header ogdf/basic/NodeSet.h
was replaced by ogdf/basic/GraphSets.h
, now also providing Edge and AdjEntry sets.
To align the behaviour of the Windows and UNIX versions, unix shared library builds now only make classes and functions marked OGDF_EXPORT
publicly visible (as is needed for Windows DLLs anyways). If a non-templated class or top-level function you previously used (probably on Linux or MacOS) now became hidden, please check the documentation of OGDF_EXPORT
and then open a PR to make it visible.
When their height is equal to their width, Shape::Triangle
and Shape::InvTriangle
are now drawn as regular triangles in SVGs (and not as just isosceles ones).
TikzWriter::isCoveredBy()
was removed in favor of isPointCoveredByNode()
in geometry.h
.
RegisteredArray
, the underlying class for NodeArray
, EdgeArray
etc. now uses std::vector
instead of ogdf::Array
for data storage. If the stored elements have a non-trivial move-constructor, it should be marked noexcept
. Otherwise, all elements will be copied when the array grows.
The template classes NodeSet<bool SupportFastSizeQuery = true>
and FaceSet<bool>
were converted to non-templated classes using their default SupportFastSizeQuery = true
versions, which now always keeps track of its size at a negligible overhead (these sets do not support merging by splicing as simple double-linked lists do anyways). Similarly, ClusterSetPure
was removed in favor of ClusterSet
. ClusterSetSimple
was removed in favor of ClusterArray<bool>
. All these RegisteredSet
s now automatically remove members (nodes, faces, clusters,...) from their lists when they are deleted from the corresponding registries (Graphs, CombEmbeddings, ClusterGraphs,...).
The move constructor and assignment operators of Graph
are now deleted, which especially means that NodeArray<Graph>
, EdgeArray<Graph>
, FaceArray<Graph>
, etc. is no longer possible. (Previously it compiled, but randomly broke at runtime when adding new nodes.) Use NodeArrayP<Graph>
, EdgeArrayP<Graph>
, FaceArrayP<Graph>
, etc. instead to wrap the Graph
s in std::unique_ptr
s and then make one pass over all entries to initialize the pointers. See the documentation of NodeArrayP
for usage as member variable on MSVC<=16. For this reason, SimDraw::getBasicGraph
now returns a std::unique_ptr<GraphCopy>
instead of copying a Graph
object on return.
GraphCopy::createEmpty()
was deprecated in favor of setOriginalGraph()
. The same holds for createEmpty()
of GraphCopySimple
and EdgeWeightedGraph
.
GraphObserver
s are now notified when their Graph
is destructed through GraphObserver::registrationChanged()
.
ClusterGraphObserver
s are now notified of their ClusterGraph
being cleared through ClusterGraphObserver::clustersCleared()
.
HypergraphObserver::init()
was deprecated in favor of reregister()
.
Observer
s and their Observable
s now have deleted copy and move constructors and assignment operators. Subclasses can instead explicitly declare their copy and move behaviour using the default constructors of Observer
/ Observable
, Observer::getObservers()
, Observer::clearObservers()
and Observable::reregister()
.
Additionally, the Observer(Observable*)
constructor (e.g. GraphObserver(Graph*)
) is now deprecated as it would trigger a registrationChanged
callback before the construction of your subclass is done. Instead, use the default Observer()
constructor and explicitly call reregister(...)
in the constructor of your subclass.
Multiple methods for inserting (parts of) a graph were merged into a single Graph::insert
implementation. This implementation is also used when copy-constructing or (in combination with clear) when copy-assigning. It replaces the following different implementations, which were removed:
GraphCopy::insert
(and GraphCopySimple::insert
) will automatically update its mappings when inserting parts of the original Graph. This can be disabled by using setLinkCopiesOnInsert
.
PoolMemoryAllocator::defrag()
was renamed to defragGlobal()
and (more importantly) now has a companion method defragThread()
that defragments the thread-local memory pool.
The following methods were moved to graph_generators/clustering.h
and renamed to more accurately reflect their functionality. Note that randomClusterPlanarGraph
did not actually generate cluster planar, but cluster-connected instances, and none of the methods used the Graph
parameter.