| Index: components/bookmarks/browser/typed_count_sorter.cc
|
| diff --git a/components/bookmarks/browser/typed_count_sorter.cc b/components/bookmarks/browser/typed_count_sorter.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..311f13836c9253e32967967de32b26575b7f783b
|
| --- /dev/null
|
| +++ b/components/bookmarks/browser/typed_count_sorter.cc
|
| @@ -0,0 +1,83 @@
|
| +// Copyright 2016 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 "components/bookmarks/browser/typed_count_sorter.h"
|
| +
|
| +#include "components/bookmarks/browser/bookmark_client.h"
|
| +
|
| +namespace bookmarks {
|
| +
|
| +using UrlTypedCountMap = BookmarkClient::UrlTypedCountMap;
|
| +
|
| +namespace {
|
| +
|
| +using UrlNodeMap = std::map<const GURL*, const TitledUrlNode*>;
|
| +using UrlTypedCountPair = std::pair<const GURL*, int>;
|
| +using UrlTypedCountPairs = std::vector<UrlTypedCountPair>;
|
| +
|
| +// Sort functor for UrlTypedCountPairs. We sort in decreasing order of typed
|
| +// count so that the best matches will always be added to the results.
|
| +struct UrlTypedCountPairSortFunctor {
|
| + bool operator()(const UrlTypedCountPair& a,
|
| + const UrlTypedCountPair& b) const {
|
| + return a.second > b.second;
|
| + }
|
| +};
|
| +
|
| +// Extract the GURL stored in an UrlTypedCountPair and use it to look up the
|
| +// corresponding TitledUrlNode.
|
| +class UrlTypedCountPairNodeLookupFunctor {
|
| + public:
|
| + UrlTypedCountPairNodeLookupFunctor(UrlNodeMap& url_node_map)
|
| + : url_node_map_(url_node_map) {
|
| + }
|
| +
|
| + const TitledUrlNode* operator()(const UrlTypedCountPair& pair) const {
|
| + return url_node_map_[pair.first];
|
| + }
|
| +
|
| + private:
|
| + UrlNodeMap& url_node_map_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +TypedCountSorter::TypedCountSorter(BookmarkClient* client)
|
| + : client_(client) {
|
| + DCHECK(client_);
|
| +}
|
| +
|
| +TypedCountSorter::~TypedCountSorter() {}
|
| +
|
| +void TypedCountSorter::SortMatches(const TitledUrlNodeSet& matches,
|
| + TitledUrlNodes* sorted_nodes) const {
|
| + sorted_nodes->reserve(matches.size());
|
| + if (client_->SupportsTypedCountForUrls()) {
|
| + UrlNodeMap url_node_map;
|
| + UrlTypedCountMap url_typed_count_map;
|
| + for (auto node : matches) {
|
| + const GURL& url = node->GetTitledUrlNodeUrl();
|
| + url_node_map.insert(std::make_pair(&url, node));
|
| + url_typed_count_map.insert(std::make_pair(&url, 0));
|
| + }
|
| +
|
| + client_->GetTypedCountForUrls(&url_typed_count_map);
|
| +
|
| + UrlTypedCountPairs url_typed_counts;
|
| + std::copy(url_typed_count_map.begin(),
|
| + url_typed_count_map.end(),
|
| + std::back_inserter(url_typed_counts));
|
| + std::sort(url_typed_counts.begin(),
|
| + url_typed_counts.end(),
|
| + UrlTypedCountPairSortFunctor());
|
| + std::transform(url_typed_counts.begin(),
|
| + url_typed_counts.end(),
|
| + std::back_inserter(*sorted_nodes),
|
| + UrlTypedCountPairNodeLookupFunctor(url_node_map));
|
| + } else {
|
| + sorted_nodes->insert(sorted_nodes->end(), matches.begin(), matches.end());
|
| + }
|
| +}
|
| +
|
| +} // namespace bookmarks
|
|
|