4#ifndef QMULTIMEDIA_RANGES_P_H
5#define QMULTIMEDIA_RANGES_P_H
18#include <QtCore/qtconfigmacros.h>
20#ifdef __cpp_lib_ranges
32#ifdef __cpp_lib_ranges
69inline constexpr auto all_of = [](
auto &&range,
auto predicate) {
70 return std::all_of(
std::begin(range),
std::end(range),
std::move(predicate));
73inline constexpr auto any_of = [](
auto &&range,
auto predicate) {
74 return std::any_of(
std::begin(range),
std::end(range),
std::move(predicate));
77inline constexpr auto none_of = [](
auto &&range,
auto predicate) {
78 return std::none_of(
std::begin(range),
std::end(range),
std::move(predicate));
81inline constexpr auto for_each = [](
auto &&range,
auto func) {
82 return std::for_each(
std::begin(range),
std::end(range),
std::move(func));
85inline constexpr auto copy = [](
auto &&in,
auto out) {
86 return std::copy(
std::begin(in),
std::end(in),
std::move(out));
89inline constexpr auto fill = [](
auto &&range,
const auto &value) {
90 return std::fill(
std::begin(range),
std::end(range), value);
93inline constexpr auto find = [](
auto &&range,
const auto &value) {
94 return std::find(
std::begin(range),
std::end(range), value);
97inline constexpr auto find_if = [](
auto &&range,
auto predicate) {
98 return std::find_if(
std::begin(range),
std::end(range),
std::move(predicate));
101template <
typename Iterator>
114 template <
typename Range,
typename T,
typename Comp =
std::
less<>>
115 auto operator()(Range &&range,
const T &value, Comp comp = {})
const
117 return std::lower_bound(
std::begin(range),
std::end(range), value,
std::move(comp));
123 template <
typename Range,
typename T,
typename Comp =
std::
less<>>
124 auto operator()(Range &&range,
const T &value, Comp comp = {})
const
126 return std::upper_bound(
std::begin(range),
std::end(range), value,
std::move(comp));
132 template <
typename Range,
typename T,
typename Comp =
std::
less<>>
133 auto operator()(Range &&range,
const T &value, Comp comp = {})
const
135 auto [b, e] =
std::equal_range(
std::begin(range),
std::end(range), value,
std::move(comp));
136 return subrange<
decltype(b)>{ b, e };
142 template <
typename Range,
typename Comp =
std::
less<>>
145 auto it =
std::max_element(
std::begin(range),
std::end(range),
std::move(comp));
149 template <
typename Range>
152 auto it =
std::max_element(
std::begin(range),
std::end(range));
159 template <
typename Range,
typename Comp =
std::
less<>>
162 return std::max_element(
std::begin(range),
std::end(range),
std::move(comp));
165 template <
typename Range>
168 return std::max_element(
std::begin(range),
std::end(range));
174 template <
typename Range,
typename Comp =
std::
less<>>
177 auto it =
std::min_element(
std::begin(range),
std::end(range),
std::move(comp));
181 template <
typename Range>
184 auto it =
std::min_element(
std::begin(range),
std::end(range));
191 template <
typename Range,
typename Comp =
std::
less<>>
194 return std::min_element(
std::begin(range),
std::end(range),
std::move(comp));
197 template <
typename Range>
200 return std::min_element(
std::begin(range),
std::end(range));
206 template <
typename Range,
typename Comp =
std::
less<>>
209 std::sort(
std::begin(range),
std::end(range),
std::move(comp));
212 template <
typename Range>
215 std::sort(
std::begin(range),
std::end(range));
221 template <
typename Range,
typename Comp =
std::
less<>>
224 std::stable_sort(
std::begin(range),
std::end(range),
std::move(comp));
227 template <
typename Range>
230 std::stable_sort(
std::begin(range),
std::end(range));
236 template <
typename Range1,
typename Range2,
typename Pred =
std::
equal_to<>>
237 bool operator()(Range1 &&lhs, Range2 &&rhs, Pred pred = {})
const
239 return std::equal(
std::begin(lhs),
std::end(lhs),
std::begin(rhs),
std::end(rhs),
256inline constexpr auto transform = [](
auto &&range,
auto output,
auto op) {
257 return std::transform(
std::begin(range),
std::end(range),
std::move(output),
258 [op =
std::move(op)](
const auto &x) {
259 return std::invoke(op, x);
265#if __cpp_lib_ranges_contains >= 202207L
269inline constexpr auto contains = [](
auto &&range,
const auto &value) {
270 return std::find(
std::begin(range),
std::end(range), value) !=
std::end(range);
275#if __cpp_lib_ranges_to_container >= 202202L
281template <
typename Container>
286template <
typename Container,
typename Range>
289 return Container(
std::begin(range),
std::end(range));
292template <
template <
class...>
class Container>
297template <
template <
class...>
class Container,
class Range>
300 return Container<ranges::range_value_t<Range>>(std::begin(range), std::end(range));
305template <
typename Container,
typename Range>
306Container
to(Range &&range)
308 return Container(
std::begin(range),
std::end(range));
311template <
typename Container>
317template <
template <
class...>
class Container>
320 return impl::to_adaptor_template_template<Container>{};
328#ifdef __cpp_lib_ranges
337template <
typename Range>
340 using BaseIt =
decltype(
std::begin(
std::declval<Range &>()));
347 using iterator_category =
std::input_iterator_tag;
349 std::remove_cv_t<std::remove_reference_t<
decltype((*std::declval<BaseIt>()).first)>>;
350 using difference_type =
std::ptrdiff_t;
351 using pointer =
const value_type *;
352 using reference =
decltype((*
std::declval<BaseIt>()).first);
354 constexpr explicit iterator(BaseIt it) : m_it(
std::move(it)) { }
355 constexpr reference operator*()
const {
return (*m_it).first; }
356 constexpr iterator &operator++() { ++m_it;
return *
this; }
357 constexpr bool operator==(
const iterator &o)
const {
return m_it == o.m_it; }
358 constexpr bool operator!=(
const iterator &o)
const {
return m_it != o.m_it; }
364 constexpr explicit KeysView(Range &range) : m_range(range) { }
365 constexpr iterator
begin()
const {
return iterator{
std::begin(m_range) }; }
366 constexpr iterator
end()
const {
return iterator{
std::end(m_range) }; }
369template <
typename Range>
372 using BaseIt =
decltype(
std::begin(
std::declval<Range &>()));
379 using iterator_category =
std::input_iterator_tag;
381 std::remove_cv_t<std::remove_reference_t<
decltype((*std::declval<BaseIt>()).second)>>;
382 using difference_type =
std::ptrdiff_t;
383 using pointer =
const value_type *;
384 using reference =
decltype((*
std::declval<BaseIt>()).second);
386 constexpr explicit iterator(BaseIt it) : m_it(
std::move(it)) { }
387 constexpr reference operator*()
const {
return (*m_it).second; }
388 constexpr iterator &operator++() { ++m_it;
return *
this; }
389 constexpr bool operator==(
const iterator &o)
const {
return m_it == o.m_it; }
390 constexpr bool operator!=(
const iterator &o)
const {
return m_it != o.m_it; }
396 constexpr explicit ValuesView(Range &range) : m_range(range) { }
397 constexpr iterator
begin()
const {
return iterator{
std::begin(m_range) }; }
398 constexpr iterator
end()
const {
return iterator{
std::end(m_range) }; }
404template <
typename Range>
407template <
typename Range>
410template <
typename Container,
typename Predicate>
413 using BaseIt =
decltype(
std::begin(
std::declval<Container &>()));
421 constexpr void advance()
423 while (m_it != m_end && !m_pred(*m_it))
428 using iterator_category =
std::input_iterator_tag;
429 using value_type = std::remove_cv_t<std::remove_reference_t<
decltype(*std::declval<BaseIt>())>>;
430 using difference_type =
std::ptrdiff_t;
431 using pointer =
const value_type *;
432 using reference =
decltype(*
std::declval<BaseIt>());
434 constexpr iterator(BaseIt it, BaseIt end, Predicate pred)
435 : m_it(
std::move(it)), m_end(
std::move(end)), m_pred(
std::move(pred))
440 constexpr auto operator*()
const ->
decltype(*m_it) {
return *m_it; }
442 constexpr iterator &operator++()
449 constexpr bool operator==(
const iterator &other)
const {
return m_it == other.m_it; }
450 constexpr bool operator!=(
const iterator &other)
const {
return m_it != other.m_it; }
453 Container &m_container;
458 : m_container(container), m_pred(
std::move(pred))
465 std::begin(m_container),
466 std::end(m_container),
471 constexpr iterator
end()
const
474 std::end(m_container),
475 std::end(m_container),
481template <
typename Predicate>
490template <
typename Container,
typename Predicate>
493 return FilterView<
const Container, Predicate>(container,
std::move(adaptor.pred));
496template <
typename Range,
typename Transform>
499 using BaseIt =
decltype(
std::begin(
std::declval<Range &>()));
504 Transform m_transform;
507 using value_type = std::remove_cv_t<std::remove_reference_t<
508 decltype(std::invoke(std::declval<Transform>(), *std::declval<BaseIt>()))>>;
509 using reference = value_type;
510 using pointer =
void;
511 using difference_type =
std::ptrdiff_t;
512 using iterator_category =
std::input_iterator_tag;
514 constexpr iterator(BaseIt it, Transform transform)
515 : m_it(
std::move(it)), m_transform(
std::move(transform))
519 constexpr value_type operator*()
const {
return std::invoke(m_transform, *m_it); }
520 constexpr iterator &operator++() { ++m_it;
return *
this; }
521 constexpr bool operator==(
const iterator &other)
const {
return m_it == other.m_it; }
522 constexpr bool operator!=(
const iterator &other)
const {
return m_it != other.m_it; }
526 Transform m_transform;
530 : m_range(range), m_transform(
std::move(transform))
534 constexpr iterator
begin()
const {
return iterator{
std::begin(m_range), m_transform }; }
535 constexpr iterator
end()
const {
return iterator{
std::end(m_range), m_transform }; }
538template <
typename Transform>
544template <
typename Container,
typename Transform>
547 return TransformView<
const Container, Transform>(container,
std::move(adaptor.transform));
552template <
typename Container,
typename Predicate>
553constexpr auto filter(
const Container &container, Predicate pred)
558template <
typename Predicate>
564template <
typename Container,
typename Transform>
565constexpr auto transform(
const Container &container, Transform t)
570template <
typename Transform>