blob: 1486053fdc39f32292d3bf1a2fd9f3c543b9898f [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_NTP_TILES_CUSTOM_LINKS_UTIL_H_
#define COMPONENTS_NTP_TILES_CUSTOM_LINKS_UTIL_H_
#include <algorithm>
#include <vector>
#include "url/gurl.h"
namespace ntp_tiles::custom_links_util {
// Moves the specified link from its current index and inserts it at
// |new_pos|. Returns false and does nothing if |url| is invalid, |url| does not
// exist in the list, or |new_pos| is invalid/already the current index.
template <typename T>
bool ReorderLink(std::vector<T>& current_links,
std::optional<std::vector<T>>& previous_links,
const GURL& url,
size_t new_pos) {
if (!url.is_valid() || new_pos < 0 || new_pos >= current_links.size()) {
return false;
}
auto curr_it = std::ranges::find(current_links, url, &T::url);
if (curr_it == current_links.end()) {
return false;
}
auto new_it = current_links.begin() + new_pos;
if (new_it == curr_it) {
return false;
}
previous_links = current_links;
// If the new position is to the left of the current position, left rotate the
// range [new_pos, curr_pos] until the link is first.
if (new_it < curr_it) {
std::rotate(new_it, curr_it, curr_it + 1);
}
// If the new position is to the right, we only need to left rotate the range
// [curr_pos, new_pos] once so that the link is last.
else {
std::rotate(curr_it, curr_it + 1, new_it + 1);
}
return true;
}
// Restores the previous state of the list of links. Used to undo the previous
// action (add, edit, delete, etc.). Returns false and does nothing if there is
// no previous state to restore.
template <typename T>
bool UndoAction(std::vector<T>& current_links,
std::optional<std::vector<T>>& previous_links) {
if (!previous_links.has_value()) {
return false;
}
// Replace the current links with the previous state.
current_links = *previous_links;
previous_links = std::nullopt;
return true;
}
/// Returns an iterator into |custom_links|.
template <typename T>
std::vector<T>::iterator FindLinkWithUrl(std::vector<T>& current_links,
const GURL& url) {
return std::ranges::find(current_links, url, &T::url);
}
} // namespace ntp_tiles::custom_links_util
#endif // COMPONENTS_NTP_TILES_CUSTOM_LINKS_UTIL_H_