Index: src/platform/update_engine/tarjan.h |
diff --git a/src/platform/update_engine/tarjan.h b/src/platform/update_engine/tarjan.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1a80a95d56fd9fe385091d638ce37e531facdac6 |
--- /dev/null |
+++ b/src/platform/update_engine/tarjan.h |
@@ -0,0 +1,39 @@ |
+// 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__ |