5#ifndef V8_BASE_CONTAINER_UTILS_H_
6#define V8_BASE_CONTAINER_UTILS_H_
18template <
typename C,
typename T>
19bool contains(
const C& container,
const T& element) {
20 const auto e = std::end(container);
21 return std::find(std::begin(container), e, element) != e;
26template <
typename C,
typename T>
27std::optional<size_t>
index_of(
const C& container,
const T& element) {
28 const auto b = std::begin(container);
29 const auto e = std::end(container);
30 if (
auto it = std::find(b, e, element); it != e) {
31 return {std::distance(b, it)};
38template <
typename C,
typename P>
39std::optional<size_t>
index_of_if(
const C& container,
const P& predicate) {
40 const auto b = std::begin(container);
41 const auto e = std::end(container);
42 if (
auto it = std::find_if(b, e, predicate); it != e) {
43 return {std::distance(b, it)};
52inline size_t erase_at(C& container,
size_t index,
size_t count = 1) {
54 if (std::size(container) <= index)
return 0;
56 count = std::min<size_t>(count, std::distance(
start, std::end(container)));
64template <
typename C,
typename P>
65inline size_t erase_if(C& container,
const P& predicate) {
67 std::remove_if(std::begin(container), std::end(container), predicate);
68 auto count = std::distance(it, std::end(container));
69 container.erase(it, std::end(container));
74template <
typename C,
typename P>
75inline size_t count_if(
const C& container,
const P& predicate) {
76 return std::count_if(std::begin(container), std::end(container), predicate);
80template <
typename C,
typename P>
81inline bool all_of(
const C& container,
const P& predicate) {
82 return std::all_of(std::begin(container), std::end(container), predicate);
85inline bool all_of(
const C& container) {
87 std::begin(container), std::end(container),
88 [](
const auto& value) {
return static_cast<bool>(
value); });
92template <
typename C,
typename P>
93inline bool any_of(
const C& container,
const P& predicate) {
94 return std::any_of(std::begin(container), std::end(container), predicate);
97inline bool any_of(
const C& container) {
99 std::begin(container), std::end(container),
100 [](
const auto& value) {
return static_cast<bool>(
value); });
104template <
typename C,
typename P>
105inline bool none_of(
const C& container,
const P& predicate) {
106 return std::none_of(std::begin(container), std::end(container), predicate);
111inline void sort(C& container) {
112 std::sort(std::begin(container), std::end(container));
114template <
typename C,
typename Comp>
115inline void sort(C& container, Comp comp) {
116 std::sort(std::begin(container), std::end(container), comp);
122 if (std::size(container) <= 1)
return true;
123 auto b = std::begin(container);
124 const auto& value = *b;
125 return std::all_of(++b, std::end(container),
126 [&](
const auto& v) {
return v ==
value; });
131template <
typename C,
typename T>
132inline bool all_equal(
const C& container,
const T& value) {
133 return std::all_of(std::begin(container), std::end(container),
134 [&](
const auto& v) {
return v ==
value; });
139template <
typename V,
typename C>
141 v.insert(std::end(v), std::begin(container), std::end(container));
std::optional< size_t > index_of(const C &container, const T &element)
bool any_of(const C &container, const P &predicate)
bool none_of(const C &container, const P &predicate)
size_t erase_at(C &container, size_t index, size_t count=1)
bool all_equal(const C &container)
void vector_append(V &v, const C &container)
size_t count_if(const C &container, const P &predicate)
bool contains(const C &container, const T &element)
size_t erase_if(C &container, const P &predicate)
bool all_of(const C &container, const P &predicate)
std::optional< size_t > index_of_if(const C &container, const P &predicate)
#define P(name, number_of_args, result_size)
std::unique_ptr< ValueMirror > value