| // Copyright 2017 The Fuchsia 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 SRC_LEDGER_BIN_APP_MERGING_COMMON_ANCESTOR_H_ |
| #define SRC_LEDGER_BIN_APP_MERGING_COMMON_ANCESTOR_H_ |
| |
| #include <lib/fit/function.h> |
| |
| #include <functional> |
| #include <memory> |
| |
| #include "src/ledger/bin/fidl/include/types.h" |
| #include "src/ledger/bin/storage/public/page_storage.h" |
| #include "src/ledger/lib/coroutine/coroutine.h" |
| #include "src/lib/fxl/memory/ref_counted.h" |
| |
| namespace ledger { |
| |
| // Comparator for commits that order commits based on their generation, then on |
| // their id, with highest generation/highest id first. |
| struct GenerationComparator { |
| bool operator()(const std::unique_ptr<const storage::Commit>& lhs, |
| const std::unique_ptr<const storage::Commit>& rhs) const; |
| }; |
| |
| // Records the result of comparing two commits. |
| enum class CommitComparison : int { |
| // Each commit contains changes that are not present in the other commit. |
| UNORDERED, |
| // All changes present in the left commit are present in the right commit. |
| LEFT_SUBSET_OF_RIGHT, |
| // All changes present in the right commit are present in the left commit. |
| RIGHT_SUBSET_OF_LEFT, |
| // The two commits contain the same set of changes. |
| EQUIVALENT |
| }; |
| |
| // Find the set of lowest common ancestors of |left| and |right|, and returns a |
| // status, a list of ancestors, and a comparison result. If |left| is a subset |
| // of |right|, |right| a subset of |left|, or |left| and |right| are equivalent, |
| // the list of ancestors is empty and the comparison result is set to the |
| // appropriate value. Otherwise, the comparison result is set to |
| // UNCOMPARABLE. |
| storage::Status FindCommonAncestors( |
| coroutine::CoroutineHandler* handler, storage::PageStorage* storage, |
| std::unique_ptr<const storage::Commit> left, |
| std::unique_ptr<const storage::Commit> right, CommitComparison* comparison, |
| std::vector<std::unique_ptr<const storage::Commit>>* ancestors); |
| |
| } // namespace ledger |
| |
| #endif // SRC_LEDGER_BIN_APP_MERGING_COMMON_ANCESTOR_H_ |