// Copyright 2020 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/query_tiles/tile.h" #include #include #include #include #include namespace query_tiles { namespace { void DeepCopyTiles(const Tile& input, Tile* out) { DCHECK(out); out->id = input.id; out->display_text = input.display_text; out->query_text = input.query_text; out->accessibility_text = input.accessibility_text; out->image_metadatas = input.image_metadatas; out->search_params = input.search_params; out->sub_tiles.clear(); for (const auto& child : input.sub_tiles) { auto entry = std::make_unique(); DeepCopyTiles(*child.get(), entry.get()); out->sub_tiles.emplace_back(std::move(entry)); } } void SerializeEntry(const Tile* entry, std::stringstream& out) { if (!entry) return; out << "entry id: " << entry->id << " query text: " << entry->query_text << " display text: " << entry->display_text << " accessibility_text: " << entry->accessibility_text << " \n"; for (const auto& image : entry->image_metadatas) out << "image url: " << image.url.possibly_invalid_spec() << " \n"; } std::string DebugStringInternal(const Tile* root) { if (!root) return std::string(); std::stringstream out; out << "Entries detail: \n"; std::map> cache; std::deque queue; queue.emplace_back(root); while (!queue.empty()) { size_t size = queue.size(); for (size_t i = 0; i < size; i++) { auto* parent = queue.front(); SerializeEntry(parent, out); queue.pop_front(); for (size_t j = 0; j < parent->sub_tiles.size(); j++) { cache[parent->id].emplace_back(parent->sub_tiles[j]->id); queue.emplace_back(parent->sub_tiles[j].get()); } } } out << "Tree table: \n"; for (auto& pair : cache) { std::string line; line += pair.first + " : ["; std::sort(pair.second.begin(), pair.second.end()); for (const auto& child : pair.second) line += " " + child; line += " ]\n"; out << line; } return out.str(); } } // namespace ImageMetadata::ImageMetadata() = default; ImageMetadata::ImageMetadata(const GURL& url) : url(url) {} ImageMetadata::~ImageMetadata() = default; ImageMetadata::ImageMetadata(const ImageMetadata& other) = default; bool ImageMetadata::operator==(const ImageMetadata& other) const { return url == other.url; } TileStats::TileStats() = default; TileStats::TileStats(base::Time last_clicked_time, double score) : last_clicked_time(last_clicked_time), score(score) {} TileStats::~TileStats() = default; TileStats::TileStats(const TileStats& other) = default; bool TileStats::operator==(const TileStats& other) const { return last_clicked_time == other.last_clicked_time && score == other.score; } bool Tile::operator==(const Tile& other) const { return id == other.id && display_text == other.display_text && query_text == other.query_text && accessibility_text == other.accessibility_text && image_metadatas.size() == other.image_metadatas.size() && sub_tiles.size() == other.sub_tiles.size() && search_params == other.search_params; } bool Tile::operator!=(const Tile& other) const { return !(*this == other); } Tile::Tile(const Tile& other) { DeepCopyTiles(other, this); } Tile::Tile() = default; Tile::Tile(Tile&& other) noexcept = default; Tile::~Tile() = default; Tile& Tile::operator=(const Tile& other) { DeepCopyTiles(other, this); return *this; } Tile& Tile::operator=(Tile&& other) noexcept = default; std::string Tile::DebugString() { return DebugStringInternal(this); } } // namespace query_tiles