4#ifndef QMULTIMEDIA_RANGES_P_H
5#define QMULTIMEDIA_RANGES_P_H
18#include <QtCore/qtconfigmacros.h>
20#include <QtMultimedia/private/qiteratorfacade_p.h>
22#ifdef __cpp_lib_ranges
35#ifdef __cpp_lib_ranges
72inline constexpr auto all_of = [](
auto &&range,
auto predicate) {
73 return std::all_of(
std::begin(range),
std::end(range),
std::move(predicate));
76inline constexpr auto any_of = [](
auto &&range,
auto predicate) {
77 return std::any_of(
std::begin(range),
std::end(range),
std::move(predicate));
80inline constexpr auto none_of = [](
auto &&range,
auto predicate) {
81 return std::none_of(
std::begin(range),
std::end(range),
std::move(predicate));
84inline constexpr auto for_each = [](
auto &&range,
auto func) {
85 return std::for_each(
std::begin(range),
std::end(range),
std::move(func));
88inline constexpr auto copy = [](
auto &&in,
auto out) {
89 return std::copy(
std::begin(in),
std::end(in),
std::move(out));
92inline constexpr auto fill = [](
auto &&range,
const auto &value) {
93 return std::fill(
std::begin(range),
std::end(range), value);
96inline constexpr auto find = [](
auto &&range,
const auto &value) {
97 return std::find(
std::begin(range),
std::end(range), value);
100inline constexpr auto find_if = [](
auto &&range,
auto predicate) {
101 return std::find_if(
std::begin(range),
std::end(range),
std::move(predicate));
104template <
typename Iterator>
117 template <
typename Range,
typename T,
typename Comp =
std::
less<>>
118 auto operator()(Range &&range,
const T &value, Comp comp = {})
const
120 return std::lower_bound(
std::begin(range),
std::end(range), value,
std::move(comp));
126 template <
typename Range,
typename T,
typename Comp =
std::
less<>>
127 auto operator()(Range &&range,
const T &value, Comp comp = {})
const
129 return std::upper_bound(
std::begin(range),
std::end(range), value,
std::move(comp));
135 template <
typename Range,
typename T,
typename Comp =
std::
less<>>
136 auto operator()(Range &&range,
const T &value, Comp comp = {})
const
138 auto [b, e] =
std::equal_range(
std::begin(range),
std::end(range), value,
std::move(comp));
139 return subrange<
decltype(b)>{ b, e };
145 template <
typename Range,
typename Comp =
std::
less<>>
148 auto it =
std::max_element(
std::begin(range),
std::end(range),
std::move(comp));
152 template <
typename Range>
155 auto it =
std::max_element(
std::begin(range),
std::end(range));
162 template <
typename Range,
typename Comp =
std::
less<>>
165 return std::max_element(
std::begin(range),
std::end(range),
std::move(comp));
168 template <
typename Range>
171 return std::max_element(
std::begin(range),
std::end(range));
177 template <
typename Range,
typename Comp =
std::
less<>>
180 auto it =
std::min_element(
std::begin(range),
std::end(range),
std::move(comp));
184 template <
typename Range>
187 auto it =
std::min_element(
std::begin(range),
std::end(range));
194 template <
typename Range,
typename Comp =
std::
less<>>
197 return std::min_element(
std::begin(range),
std::end(range),
std::move(comp));
200 template <
typename Range>
203 return std::min_element(
std::begin(range),
std::end(range));
209 template <
typename Range,
typename Comp =
std::
less<>>
212 std::sort(
std::begin(range),
std::end(range),
std::move(comp));
215 template <
typename Range>
218 std::sort(
std::begin(range),
std::end(range));
224 template <
typename Range,
typename Comp =
std::
less<>>
227 std::stable_sort(
std::begin(range),
std::end(range),
std::move(comp));
230 template <
typename Range>
233 std::stable_sort(
std::begin(range),
std::end(range));
239 template <
typename Range1,
typename Range2,
typename Pred =
std::
equal_to<>>
240 bool operator()(Range1 &&lhs, Range2 &&rhs, Pred pred = {})
const
242 return std::equal(
std::begin(lhs),
std::end(lhs),
std::begin(rhs),
std::end(rhs),
259inline constexpr auto transform = [](
auto &&range,
auto output,
auto op) {
260 return std::transform(
std::begin(range),
std::end(range),
std::move(output),
261 [op =
std::move(op)](
const auto &x) {
262 return std::invoke(op, x);
268#if __cpp_lib_ranges_contains >= 202207L
272inline constexpr auto contains = [](
auto &&range,
const auto &value) {
273 return std::find(
std::begin(range),
std::end(range), value) !=
std::end(range);
278#if __cpp_lib_ranges_to_container >= 202202L
284template <
typename Container>
289template <
typename Container,
typename Range>
292 return Container(
std::begin(range),
std::end(range));
295template <
template <
class...>
class Container>
300template <
template <
class...>
class Container,
class Range>
303 return Container<ranges::range_value_t<Range>>(std::begin(range), std::end(range));
308template <
typename Container,
typename Range>
309Container
to(Range &&range)
311 return Container(
std::begin(range),
std::end(range));
314template <
typename Container>
320template <
template <
class...>
class Container>
323 return impl::to_adaptor_template_template<Container>{};
331#ifdef __cpp_lib_ranges
340template <
typename Range>
343 using BaseIt =
decltype(
std::begin(
std::declval<Range &>()));
344 using KeyReference =
decltype((*
std::declval<BaseIt>()).first);
348 :
public IteratorFacade<iterator, KeyValue, std::input_iterator_tag, KeyReference>
353 constexpr explicit iterator(BaseIt it) : m_it(
std::move(it)) { }
355 using reference = KeyReference;
356 constexpr reference dereference()
const {
return (*m_it).first; }
357 constexpr void increment() { ++m_it; }
358 constexpr bool equals(
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 &>()));
373 using ValueReference =
decltype((*
std::declval<BaseIt>()).second);
377 :
public IteratorFacade<iterator, MappedValue, std::input_iterator_tag, ValueReference>
382 constexpr explicit iterator(BaseIt it) : m_it(
std::move(it)) { }
384 using reference = ValueReference;
385 constexpr reference dereference()
const {
return (*m_it).second; }
386 constexpr void increment() { ++m_it; }
387 constexpr bool equals(
const iterator &o)
const {
return m_it == o.m_it; }
393 constexpr explicit ValuesView(Range &range) : m_range(range) { }
394 constexpr iterator
begin()
const {
return iterator{
std::begin(m_range) }; }
395 constexpr iterator
end()
const {
return iterator{
std::end(m_range) }; }
401template <
typename Range>
404template <
typename Range>
407template <
typename Container,
typename Predicate>
410 using BaseIt =
decltype(
std::begin(
std::declval<Container &>()));
411 using ElementReference =
decltype(*
std::declval<BaseIt>());
415 :
public IteratorFacade<iterator, ElementValue, std::input_iterator_tag, ElementReference>
421 constexpr void advance()
423 while (m_it != m_end && !m_pred(*m_it))
428 using reference = ElementReference;
430 constexpr iterator(BaseIt it, BaseIt end, Predicate pred)
431 : m_it(
std::move(it)), m_end(
std::move(end)), m_pred(
std::move(pred))
436 constexpr reference dereference()
const {
return *m_it; }
437 constexpr void increment()
442 constexpr bool equals(
const iterator &o)
const {
return m_it == o.m_it; };
445 Container &m_container;
450 : m_container(container), m_pred(
std::move(pred))
457 std::begin(m_container),
458 std::end(m_container),
463 constexpr iterator
end()
const
466 std::end(m_container),
467 std::end(m_container),
473template <
typename Predicate>
482template <
typename Container,
typename Predicate>
485 return FilterView<
const Container, Predicate>(container,
std::move(adaptor.pred));
488template <
typename Range,
typename Transform>
491 using BaseIt =
decltype(
std::begin(
std::declval<Range &>()));
495 class iterator :
public IteratorFacade<iterator, TransformedValue, std::input_iterator_tag,
499 Transform m_transform;
502 using reference = TransformedValue;
504 constexpr iterator(BaseIt it, Transform transform)
505 : m_it(
std::move(it)), m_transform(
std::move(transform))
509 constexpr reference dereference()
const {
return std::invoke(m_transform, *m_it); }
510 constexpr void increment() { ++m_it; }
511 constexpr void decrement() { --m_it; }
512 constexpr bool equals(
const iterator &o)
const {
return m_it == o.m_it; }
516 Transform m_transform;
520 : m_range(range), m_transform(
std::move(transform))
524 constexpr iterator
begin()
const {
return iterator{
std::begin(m_range), m_transform }; }
525 constexpr iterator
end()
const {
return iterator{
std::end(m_range), m_transform }; }
528template <
typename Transform>
534template <
typename Container,
typename Transform>
537 return TransformView<
const Container, Transform>(container,
std::move(adaptor.transform));
542template <
typename Container,
typename Predicate>
543constexpr auto filter(
const Container &container, Predicate pred)
548template <
typename Predicate>
554template <
typename Container,
typename Transform>
555constexpr auto transform(
const Container &container, Transform t)
560template <
typename Transform>