| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | /*=========================================================================  Library:   CTK  Copyright (c) Kitware Inc.  Licensed under the Apache License, Version 2.0 (the "License");  you may not use this file except in compliance with the License.  You may obtain a copy of the License at      http://www.apache.org/licenses/LICENSE-2.0.txt  Unless required by applicable law or agreed to in writing, software  distributed under the License is distributed on an "AS IS" BASIS,  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and  limitations under the License.=========================================================================*/#ifndef __ctkDependencyGraph_h#define __ctkDependencyGraph_h// CTK includes#if !defined(NO_SYMBOL_EXPORT)#include "ctkCoreExport.h"#else#define CTK_CORE_EXPORT#endif#include <list>class ctkDependencyGraphPrivate;/// \ingroup Core/// \class ctkDependencyGraph/// \brief Class to implement a dependency graph, converted to STL instead of Qt.class CTK_CORE_EXPORT ctkDependencyGraph{public:  ctkDependencyGraph(int nvertices);  virtual ~ctkDependencyGraph();    void printAdditionalInfo()const;  void printGraph()const;    /// Get the number of vertices associated with current graph  int numberOfVertices()const;    /// Get the number of edges associated with current graph  int numberOfEdges()const;    /// Traverse graph and check for cycle  bool checkForCycle();    /// Return true if there is at least one cycle  bool cycleDetected()const;    /// If a cycle has been detected, return the origin of the cycle otherwise 0.  int cycleOrigin()const;    /// If a cycle has been detected, return the end of the cycle otherwise 0.  int cycleEnd()const;    // The traverse of the tree will print information on standard output  void setVerbose(bool verbose);    /// Insert edge  /// (from, to) indicate a relation between two vertices  /// Note also that vertex id should be >= 1  void insertEdge(int from, int to);  /// Retrieve the paths between two vertices  /// Caller is responsible to clear paths list  void findPaths(int from, int to, std::list<std::list<int>* >& paths);    /// Retrieve the path between two vertices  void findPath(int from, int to, std::list<int>& path);    /// List of edge to exclude  /// An edge is specified using its extremity  void setEdgeListToExclude(const std::list<int>& list);    /// The default implementation check if 'edge' is in the list of edge to exclude  /// See setEdgeListToExclude  virtual bool shouldExcludeEdge(int edge)const;    /// Called each time an edge is visited  virtual void processEdge(int /*from*/, int /*to*/){}    /// Perform a topological sort  /// Return false if the graph contains cycles  /// If a rootId is given, the subgraph starting at the root id is sorted  /// See cycleDetected, cycleOrigin, cycleEnd  bool topologicalSort(std::list<int>& sorted, int rootId = -1);  /// Retrieve all vertices with indegree 0  void sourceVertices(std::list<int>& sources);protected:  ctkDependencyGraphPrivate* d_ptr;private:  // Intentionally disable copy semantics  ctkDependencyGraph(const ctkDependencyGraph &);  ctkDependencyGraph &operator=(const ctkDependencyGraph &);};#endif
 |