Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1395)

Unified Diff: sync/syncable/parent_child_index.cc

Issue 2130453004: [Sync] Move //sync to //components/sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sync/syncable/parent_child_index.h ('k') | sync/syncable/parent_child_index_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sync/syncable/parent_child_index.cc
diff --git a/sync/syncable/parent_child_index.cc b/sync/syncable/parent_child_index.cc
deleted file mode 100644
index 6d1be8b5c940b439ecf0bfcbfe09af6be9a0a8b5..0000000000000000000000000000000000000000
--- a/sync/syncable/parent_child_index.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "sync/syncable/parent_child_index.h"
-
-#include <memory>
-
-#include "base/stl_util.h"
-#include "sync/syncable/entry_kernel.h"
-#include "sync/syncable/syncable_id.h"
-
-namespace syncer {
-namespace syncable {
-
-bool ChildComparator::operator()(const EntryKernel* a,
- const EntryKernel* b) const {
- const UniquePosition& a_pos = a->ref(UNIQUE_POSITION);
- const UniquePosition& b_pos = b->ref(UNIQUE_POSITION);
-
- if (a_pos.IsValid() && b_pos.IsValid()) {
- // Position is important to this type.
- return a_pos.LessThan(b_pos);
- } else if (a_pos.IsValid() && !b_pos.IsValid()) {
- // TODO(rlarocque): Remove this case.
- // An item with valid position as sibling of one with invalid position.
- // We should not support this, but the tests rely on it. For now, just
- // move all invalid position items to the right.
- return true;
- } else if (!a_pos.IsValid() && b_pos.IsValid()) {
- // TODO(rlarocque): Remove this case.
- // Mirror of the above case.
- return false;
- } else {
- // Position doesn't matter.
- DCHECK(!a->ref(UNIQUE_POSITION).IsValid());
- DCHECK(!b->ref(UNIQUE_POSITION).IsValid());
- // Sort by META_HANDLE to ensure consistent order for testing.
- return a->ref(META_HANDLE) < b->ref(META_HANDLE);
- }
-}
-
-ParentChildIndex::ParentChildIndex() {
- // Pre-allocate these two vectors to the number of model types.
- model_type_root_ids_.resize(MODEL_TYPE_COUNT);
- type_root_child_sets_.resize(MODEL_TYPE_COUNT);
-}
-
-ParentChildIndex::~ParentChildIndex() {}
-
-bool ParentChildIndex::ShouldInclude(const EntryKernel* entry) {
- // This index excludes deleted items and the root item. The root
- // item is excluded so that it doesn't show up as a child of itself.
- return !entry->ref(IS_DEL) && !entry->ref(ID).IsRoot();
-}
-
-bool ParentChildIndex::Insert(EntryKernel* entry) {
- DCHECK(ShouldInclude(entry));
-
- OrderedChildSetRef siblings = nullptr;
- const Id& parent_id = entry->ref(PARENT_ID);
- ModelType model_type = entry->GetModelType();
-
- if (ShouldUseParentId(parent_id, model_type)) {
- // Hierarchical type, lookup child set in the map.
- DCHECK(!parent_id.IsNull());
- ParentChildrenMap::iterator it = parent_children_map_.find(parent_id);
- if (it != parent_children_map_.end()) {
- siblings = it->second;
- } else {
- siblings = OrderedChildSetRef(new OrderedChildSet());
- parent_children_map_.insert(std::make_pair(parent_id, siblings));
- }
- } else {
- // Non-hierarchical type, return a pre-defined collection by type.
- siblings = GetOrCreateModelTypeChildSet(model_type);
- }
-
- // If this is one of type root folder for a non-hierarchical type, associate
- // its ID with the model type and the type's pre-defined child set with the
- // type root ID.
- // TODO(stanisc): crbug/438313: Just TypeSupportsHierarchy condition should
- // theoretically be sufficient but in practice many tests don't properly
- // initialize entries so TypeSupportsHierarchy ends up failing. Consider
- // tweaking TypeSupportsHierarchy and fixing all related test code.
- if (parent_id.IsRoot() && entry->ref(IS_DIR) &&
- syncer::IsRealDataType(model_type) &&
- !TypeSupportsHierarchy(model_type)) {
- const Id& type_root_id = entry->ref(ID);
-
- // If the entry exists in the map it must already have the same
- // model type specific child set. It's possible another type root exists
- // in parent_children_map_, but that's okay as the new type root will
- // point to the same OrderedChildSet. As such, we just blindly store the
- // new type root ID and associate it to the (possibly existing) child set.
- model_type_root_ids_[model_type] = type_root_id;
- parent_children_map_.insert(std::make_pair(
- type_root_id, GetOrCreateModelTypeChildSet(model_type)));
- }
-
- // Finally, insert the entry in the child set.
- return siblings->insert(entry).second;
-}
-
-// Like the other containers used to help support the syncable::Directory, this
-// one does not own any EntryKernels. This function removes references to the
-// given EntryKernel but does not delete it.
-void ParentChildIndex::Remove(EntryKernel* e) {
- OrderedChildSetRef siblings = nullptr;
- ModelType model_type = e->GetModelType();
- const Id& parent_id = e->ref(PARENT_ID);
- bool should_erase = false;
- ParentChildrenMap::iterator sibling_iterator;
-
- if (ShouldUseParentId(parent_id, model_type)) {
- // Hierarchical type, lookup child set in the map.
- DCHECK(!parent_id.IsNull());
- sibling_iterator = parent_children_map_.find(parent_id);
- DCHECK(sibling_iterator != parent_children_map_.end());
- siblings = sibling_iterator->second;
- should_erase = true;
- } else {
- // Non-hierarchical type, return a pre-defined child set by type.
- siblings = type_root_child_sets_[model_type];
- }
-
- OrderedChildSet::iterator j = siblings->find(e);
- DCHECK(j != siblings->end());
-
- // Erase the entry from the child set.
- siblings->erase(j);
- // If the set is now empty and isn't shareable with |type_root_child_sets_|,
- // erase it from the map.
- if (siblings->empty() && should_erase) {
- parent_children_map_.erase(sibling_iterator);
- }
-}
-
-bool ParentChildIndex::Contains(EntryKernel *e) const {
- const OrderedChildSetRef siblings = GetChildSet(e);
- return siblings && siblings->count(e) > 0;
-}
-
-const OrderedChildSet* ParentChildIndex::GetChildren(const Id& id) const {
- DCHECK(!id.IsNull());
-
- ParentChildrenMap::const_iterator parent = parent_children_map_.find(id);
- if (parent == parent_children_map_.end()) {
- return nullptr;
- }
-
- OrderedChildSetRef children = parent->second;
- // The expectation is that the function returns nullptr instead of an empty
- // child set
- if (children && children->empty())
- children = nullptr;
- return children.get();
-}
-
-const OrderedChildSet* ParentChildIndex::GetChildren(EntryKernel* e) const {
- return GetChildren(e->ref(ID));
-}
-
-const OrderedChildSet* ParentChildIndex::GetSiblings(EntryKernel* e) const {
- // This implies the entry is in the index.
- DCHECK(Contains(e));
- const OrderedChildSetRef siblings = GetChildSet(e);
- DCHECK(siblings && !siblings->empty());
- return siblings.get();
-}
-
-/* static */
-bool ParentChildIndex::ShouldUseParentId(const Id& parent_id,
- ModelType model_type) {
- // For compatibility with legacy unit tests, in addition to hierarchical
- // entries, this returns true any entries directly under root and for entries
- // of UNSPECIFIED model type.
- return parent_id.IsRoot() || TypeSupportsHierarchy(model_type) ||
- !syncer::IsRealDataType(model_type);
-}
-
-const OrderedChildSetRef ParentChildIndex::GetChildSet(EntryKernel* e) const {
- ModelType model_type = e->GetModelType();
-
- const Id& parent_id = e->ref(PARENT_ID);
- if (ShouldUseParentId(parent_id, model_type)) {
- // Hierarchical type, lookup child set in the map.
- ParentChildrenMap::const_iterator it = parent_children_map_.find(parent_id);
- if (it == parent_children_map_.end())
- return nullptr;
- return it->second;
- }
-
- // Non-hierarchical type, return a collection indexed by type.
- return GetModelTypeChildSet(model_type);
-}
-
-const OrderedChildSetRef ParentChildIndex::GetModelTypeChildSet(
- ModelType model_type) const {
- return type_root_child_sets_[model_type];
-}
-
-OrderedChildSetRef ParentChildIndex::GetOrCreateModelTypeChildSet(
- ModelType model_type) {
- if (!type_root_child_sets_[model_type])
- type_root_child_sets_[model_type] =
- OrderedChildSetRef(new OrderedChildSet());
- return type_root_child_sets_[model_type];
-}
-
-const Id& ParentChildIndex::GetModelTypeRootId(ModelType model_type) const {
- return model_type_root_ids_[model_type];
-}
-
-} // namespace syncable
-} // namespace syncer
« no previous file with comments | « sync/syncable/parent_child_index.h ('k') | sync/syncable/parent_child_index_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698