|  | // Copyright 2018 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/ntp_snippets/contextual/contextual_suggestions_result.h" | 
|  |  | 
|  | #include "components/ntp_snippets/contextual/contextual_suggestion.h" | 
|  |  | 
|  | namespace contextual_suggestions { | 
|  |  | 
|  | PeekConditions::PeekConditions() | 
|  | : confidence(1.0), | 
|  | page_scroll_percentage(0.0), | 
|  | minimum_seconds_on_page(0.0), | 
|  | maximum_number_of_peeks(0.0) {} | 
|  |  | 
|  | Cluster::Cluster() = default; | 
|  |  | 
|  | // MSVC doesn't support defaulted move constructors, so we have to define it | 
|  | // ourselves. | 
|  | Cluster::Cluster(Cluster&& other) noexcept | 
|  | : title(std::move(other.title)), | 
|  | suggestions(std::move(other.suggestions)) {} | 
|  |  | 
|  | Cluster::Cluster(const Cluster&) = default; | 
|  |  | 
|  | Cluster::~Cluster() = default; | 
|  |  | 
|  | ClusterBuilder::ClusterBuilder(const std::string& title) { | 
|  | cluster_.title = title; | 
|  | } | 
|  |  | 
|  | ClusterBuilder::ClusterBuilder(const ClusterBuilder& other) { | 
|  | cluster_.title = other.cluster_.title; | 
|  | for (const auto& suggestion : other.cluster_.suggestions) { | 
|  | AddSuggestion(SuggestionBuilder(suggestion.url) | 
|  | .Title(suggestion.title) | 
|  | .PublisherName(suggestion.publisher_name) | 
|  | .Snippet(suggestion.snippet) | 
|  | .ImageId(suggestion.image_id) | 
|  | .FaviconImageId(suggestion.favicon_image_id) | 
|  | .Build()); | 
|  | } | 
|  | } | 
|  |  | 
|  | ClusterBuilder& ClusterBuilder::AddSuggestion(ContextualSuggestion suggestion) { | 
|  | cluster_.suggestions.emplace_back(std::move(suggestion)); | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | Cluster ClusterBuilder::Build() { | 
|  | return std::move(cluster_); | 
|  | } | 
|  |  | 
|  | ContextualSuggestionsResult::ContextualSuggestionsResult() = default; | 
|  |  | 
|  | ContextualSuggestionsResult::ContextualSuggestionsResult( | 
|  | std::string peek_text, | 
|  | std::vector<Cluster> clusters, | 
|  | PeekConditions peek_conditions) | 
|  | : clusters(clusters), | 
|  | peek_text(peek_text), | 
|  | peek_conditions(peek_conditions) {} | 
|  |  | 
|  | ContextualSuggestionsResult::ContextualSuggestionsResult( | 
|  | const ContextualSuggestionsResult& other) = default; | 
|  |  | 
|  | // MSVC doesn't support defaulted move constructors, so we have to define it | 
|  | // ourselves. | 
|  | ContextualSuggestionsResult::ContextualSuggestionsResult( | 
|  | ContextualSuggestionsResult&& other) noexcept | 
|  | : clusters(std::move(other.clusters)), | 
|  | peek_text(std::move(other.peek_text)), | 
|  | peek_conditions(std::move(other.peek_conditions)) {} | 
|  |  | 
|  | ContextualSuggestionsResult::~ContextualSuggestionsResult() = default; | 
|  |  | 
|  | ContextualSuggestionsResult& ContextualSuggestionsResult::operator=( | 
|  | ContextualSuggestionsResult&& other) = default; | 
|  |  | 
|  | }  // namespace contextual_suggestions |