| // 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_ |