OGDF » Developer's Guide » Porting Guide » Foxglove
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 file ogdf/basic/internal/config_autogen.h has moved from ${PROJECT_BINARY_DIR}/include/ to ${PROJECT_BINARY_DIR}/include/ogdf-{release,debug}/ (depending on the build type). If you manually specify include paths for the OGDF make sure to update them accordingly such that the file can be included as before using #include <ogdf/basic/internal/config_autogen.h>. CMake users should not notice any changes.
Binaries built in debug mode now have the suffix "-debug".
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 RegisteredSets 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 Graphs in std::unique_ptrs 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.
GraphObservers are now notified when their Graph is destructed through GraphObserver::registrationChanged().
ClusterGraphObservers are now notified of their ClusterGraph being cleared through ClusterGraphObserver::clustersCleared().
HypergraphObserver::init() was deprecated in favor of reregister().
Observers and their Observables 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.