2#include <ossia/detail/config.hpp>
4#include <ossia/detail/string_view.hpp>
23template <
typename Vector>
24using iterator_t =
typename std::remove_reference<Vector>::type::iterator;
26template <
typename Vector,
typename Value>
27auto find(Vector&& v,
const Value& val)
noexcept
29 auto end = std::end(v);
30 for(
auto it = std::begin(v); it != end; ++it)
36template <
typename Vector,
typename Fun>
37auto find_if(Vector&& v, Fun&& fun)
39 auto end = std::end(v);
40 for(
auto it = std::begin(v); it != end; ++it)
46template <
typename Vector,
typename Value>
47auto* ptr_find(Vector&& v,
const Value& val)
noexcept
49 if constexpr(
requires { v.find(val) != v.end(); })
51 auto it = v.find(val);
52 return it != v.end() ? &it->second :
nullptr;
56 auto it = ossia::find(v, val);
57 return it != std::end(v) ? &*it :
nullptr;
61template <
typename Vector,
typename Fun>
62auto* ptr_find_if(Vector&& v, Fun&& fun)
64 auto it = ossia::find_if(v, fun);
65 return it != std::end(v) ? &*it :
nullptr;
68template <
typename Vector,
typename Value>
69bool contains(Vector&& v,
const Value& val)
noexcept
71 return ossia::find(v, val) != std::end(v);
74template <
typename Vector,
typename Value>
75void remove_one(Vector&& v,
const Value& val)
77 auto it = ossia::find(v, val);
84template <
typename Vector,
typename Function>
85void remove_one_if(Vector& v,
const Function& val)
87 auto it = ossia::find_if(v, val);
94template <
typename Vector,
typename Value>
95void remove_erase(Vector& v,
const Value& val)
97 v.erase(std::remove(v.begin(), v.end(), val), v.end());
100template <
typename Vector,
typename Function>
101void remove_erase_if(Vector& v,
const Function& val)
103 v.erase(std::remove_if(v.begin(), v.end(), val), v.end());
106template <
typename Vector,
typename Fun>
107void erase_if(Vector& r, Fun f)
109 for(
auto it = std::begin(r); it != std::end(r);)
111 it = f(*it) ? r.erase(it) : ++it;
115template <
typename Vector,
typename Fun>
116bool any_of(Vector&& v, Fun&& fun)
noexcept
118 for(
auto it = std::begin(v); it != std::end(v); ++it)
124template <
typename Vector,
typename Fun>
125auto all_of(Vector&& v, Fun&& fun)
noexcept
127 for(
auto it = std::begin(v); it != std::end(v); ++it)
133template <
typename Vector,
typename Fun>
134bool none_of(Vector&& v, Fun&& fun)
noexcept
136 for(
auto it = std::begin(v); it != std::end(v); ++it)
142template <
typename Vector,
typename Fun>
143auto remove_if(Vector&& v, Fun&& fun)
145 return std::remove_if(std::begin(v), std::end(v), std::forward<Fun>(fun));
148template <
typename Vector,
typename Fun>
149auto count_if(Vector&& v, Fun&& fun)
151 std::size_t count = 0;
153 for(
auto it = std::begin(v); it != std::end(v); ++it)
160template <
typename Vector,
typename Fun>
161auto max_element(Vector&& v, Fun&& fun)
163 return std::max_element(std::begin(v), std::end(v), std::forward<Fun>(fun));
166template <
typename Vector>
169 using value_type =
typename std::remove_cvref_t<Vector>::value_type;
170 return std::ranges::sort(v, std::less<value_type>{});
173template <
typename Vector,
typename T>
174auto fill(Vector&& v,
const T& val)
176 return std::fill(std::begin(v), std::end(v), val);
179template <
typename Vector>
180auto unique(Vector&& v)
182 return std::unique(std::begin(v), std::end(v));
185template <
typename Vector,
typename Fun>
186auto sort(Vector&& v, Fun&& fun)
188 return std::ranges::sort(v, std::forward<Fun>(fun));
191template <
typename Vector,
typename OutputIterator,
typename Fun>
192auto transform(Vector&& v, OutputIterator it, Fun f)
194 return std::transform(v.begin(), v.end(), it, f);
197template <
typename Array1,
typename Array2>
198auto equal(
const Array1& v,
const Array2& v2)
noexcept
200 return std::equal(std::begin(v), std::end(v), std::begin(v2));
203template <
typename Vector1,
typename Vector2>
204void copy(
const Vector1& source, Vector2& destination)
206 destination.reserve(destination.size() + source.size());
207 std::copy(source.begin(), source.end(), std::back_inserter(destination));
210template <
typename Vector1,
typename Vector2,
typename Pred>
211void copy_if(
const Vector1& source, Vector2& destination, Pred predicate)
213 std::copy_if(source.begin(), source.end(), std::back_inserter(destination), predicate);
216template <
typename T,
typename K>
217auto last_before(T&& container,
const K& k)
219 auto it = container.upper_bound(k);
220 if(it != container.begin())
222 std::advance(it, -1);
227template <
typename T,
typename K>
228auto find_key(T&& vec,
const K& key)
noexcept
231 vec.begin(), vec.end(), [&](
const auto& elt) { return elt.first == key; });
234template <
typename T,
typename K0,
typename K1>
235auto find_key(T&& vec,
const K0& k0,
const K1& k1)
noexcept
237 return std::find_if(vec.begin(), vec.end(), [&](
const auto& elt) {
239 return get<0>(elt) == k0 && get<1>(elt) == k1;
243template <std::
size_t N>
246 static const constexpr auto value = N;
249template <
class F, std::size_t... Is>
250void for_each_in_range(F&& func, std::index_sequence<Is...>)
252 (std::forward<F>(func)(num<Is>{}), ...);
255template <std::
size_t N,
typename F>
256void for_each_in_range(F&& func)
258 for_each_in_range(std::forward<F>(func), std::make_index_sequence<N>());
263template <
class T, std::size_t N, std::size_t... I>
264constexpr std::array<std::remove_cv_t<T>, N>
265to_array_impl(T (&a)[N], std::index_sequence<I...>)
noexcept
271template <
class T, std::
size_t N>
272constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N])
noexcept
274 return detail::to_array_impl(a, std::make_index_sequence<N>{});
277template <
typename... Args>
278constexpr std::array<
const char*,
sizeof...(Args)> make_array(Args&&... args)
noexcept
284void remove_duplicates(T& vec)
289 std::sort(vec.begin(), vec.end());
290 vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
293template <
typename T,
typename Comp>
294void remove_duplicates(T& vec, Comp comparator)
299 std::sort(vec.begin(), vec.end(), comparator);
300 vec.erase(std::unique(vec.begin(), vec.end(), comparator), vec.end());
303template <
typename Container,
typename K,
typename Comp,
typename... Args>
304auto emplace_sorted(Container& vec,
const K& k, Comp&& comp, Args&&... args)
307 auto it = std::lower_bound(vec.begin(), vec.end(), k, std::forward<Comp>(comp));
308 return vec.emplace(it, std::forward<Args>(args)...);
312 typename D,
template <
typename,
typename>
typename S,
typename T,
typename Alloc>
313auto insert_at_end(D& dest, S<T, Alloc>&& src)
316 dest.end(), std::make_move_iterator(src.begin()),
317 std::make_move_iterator(src.end()));
322void change_item_position(T& v,
size_t oldIndex,
size_t newIndex)
324 if(oldIndex > newIndex)
325 std::rotate(v.rend() - oldIndex - 1, v.rend() - oldIndex, v.rend() - newIndex);
328 v.begin() + oldIndex, v.begin() + oldIndex + 1, v.begin() + newIndex + 1);
331template <
typename Container,
typename Item>
332int index_in_container(Container& vec, Item i)
noexcept
334 auto it = std::find(vec.begin(), vec.end(), i);
336 return std::distance(vec.begin(), it);