File: custom_links_util.h

package info (click to toggle)
chromium 141.0.7390.107-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,246,132 kB
  • sloc: cpp: 35,264,965; ansic: 7,169,920; javascript: 4,250,185; python: 1,460,635; asm: 950,788; xml: 751,751; pascal: 187,972; sh: 89,459; perl: 88,691; objc: 79,953; sql: 53,924; cs: 44,622; fortran: 24,137; makefile: 22,313; tcl: 15,277; php: 14,018; yacc: 8,995; ruby: 7,553; awk: 3,720; lisp: 3,096; lex: 1,330; ada: 727; jsp: 228; sed: 36
file content (78 lines) | stat: -rw-r--r-- 2,455 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// 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_