| // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_TARJAN_H__ | 
 | #define CHROMEOS_PLATFORM_UPDATE_ENGINE_TARJAN_H__ | 
 |  | 
 | // This is an implemenation of Tarjan's algorithm which finds all | 
 | // Strongly Connected Components in a graph. | 
 |  | 
 | // Note: a true Tarjan algorithm would find all strongly connected components | 
 | // in the graph. This implementation will only find the strongly connected | 
 | // component containing the vertex passed in. | 
 |  | 
 | #include <vector> | 
 | #include "update_engine/graph_types.h" | 
 |  | 
 | namespace chromeos_update_engine { | 
 |  | 
 | class TarjanAlgorithm { | 
 |  public: | 
 |   TarjanAlgorithm() : index_(0), required_vertex_(0) {} | 
 |  | 
 |   // 'out' is set to the result if there is one, otherwise it's untouched. | 
 |   void Execute(Vertex::Index vertex, | 
 |                Graph* graph, | 
 |                std::vector<Vertex::Index>* out); | 
 |  private: | 
 |   void Tarjan(Vertex::Index vertex, Graph* graph); | 
 |  | 
 |   Vertex::Index index_; | 
 |   Vertex::Index required_vertex_; | 
 |   std::vector<Vertex::Index> stack_; | 
 |   std::vector<std::vector<Vertex::Index> > components_; | 
 | }; | 
 |  | 
 | }  // namespace chromeos_update_engine | 
 |  | 
 | #endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_TARJAN_H__ |