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
74inline constexpr auto all_of = [](
auto &&range,
auto predicate) {
75 return std::all_of(
std::begin(range),
std::end(range),
std::move(predicate));
78inline constexpr auto any_of = [](
auto &&range,
auto predicate) {
79 return std::any_of(
std::begin(range),
std::end(range),
std::move(predicate));
82inline constexpr auto none_of = [](
auto &&range,
auto predicate) {
83 return std::none_of(
std::begin(range),
std::end(range),
std::move(predicate));
86inline constexpr auto for_each = [](
auto &&range,
auto func) {
87 return std::for_each(
std::begin(range),
std::end(range),
std::move(func));
90inline constexpr auto copy = [](
auto &&in,
auto out) {
91 return std::copy(
std::begin(in),
std::end(in),
std::move(out));
94inline constexpr auto fill = [](
auto &&range,
const auto &value) {
95 return std::fill(
std::begin(range),
std::end(range), value);
98inline constexpr auto find = [](
auto &&range,
const auto &value) {
99 return std::find(
std::begin(range),
std::end(range), value);
102inline constexpr auto find_if = [](
auto &&range,
auto predicate) {
103 return std::find_if(
std::begin(range),
std::end(range),
std::move(predicate));
106template <
typename Iterator>
119 template <
typename Range,
typename T,
typename Comp =
std::
less<>>
120 auto operator()(Range &&range,
const T &value, Comp comp = {})
const
122 return std::lower_bound(
std::begin(range),
std::end(range), value,
std::move(comp));
128 template <
typename Range,
typename T,
typename Comp =
std::
less<>>
129 auto operator()(Range &&range,
const T &value, Comp comp = {})
const
131 return std::upper_bound(
std::begin(range),
std::end(range), value,
std::move(comp));
137 template <
typename Range,
typename T,
typename Comp =
std::
less<>>
138 auto operator()(Range &&range,
const T &value, Comp comp = {})
const
140 auto [b, e] =
std::equal_range(
std::begin(range),
std::end(range), value,
std::move(comp));
141 return subrange<
decltype(b)>{ b, e };
147 template <
typename Range,
typename Comp =
std::
less<>>
150 auto it =
std::max_element(
std::begin(range),
std::end(range),
std::move(comp));
154 template <
typename Range>
157 auto it =
std::max_element(
std::begin(range),
std::end(range));
164 template <
typename Range,
typename Comp =
std::
less<>>
167 return std::max_element(
std::begin(range),
std::end(range),
std::move(comp));
170 template <
typename Range>
173 return std::max_element(
std::begin(range),
std::end(range));
179 template <
typename Range,
typename Comp =
std::
less<>>
182 auto it =
std::min_element(
std::begin(range),
std::end(range),
std::move(comp));
186 template <
typename Range>
189 auto it =
std::min_element(
std::begin(range),
std::end(range));
196 template <
typename Range,
typename Comp =
std::
less<>>
199 return std::min_element(
std::begin(range),
std::end(range),
std::move(comp));
202 template <
typename Range>
205 return std::min_element(
std::begin(range),
std::end(range));
211 template <
typename Range,
typename Comp =
std::
less<>>
214 std::sort(
std::begin(range),
std::end(range),
std::move(comp));
217 template <
typename Range>
220 std::sort(
std::begin(range),
std::end(range));
226 template <
typename Range,
typename Comp =
std::
less<>>
229 std::stable_sort(
std::begin(range),
std::end(range),
std::move(comp));
232 template <
typename Range>
235 std::stable_sort(
std::begin(range),
std::end(range));
241 template <
typename Range1,
typename Range2,
typename Pred =
std::
equal_to<>>
242 bool operator()(Range1 &&lhs, Range2 &&rhs, Pred pred = {})
const
244 return std::equal(
std::begin(lhs),
std::end(lhs),
std::begin(rhs),
std::end(rhs),
261inline constexpr auto transform = [](
auto &&range,
auto output,
auto op) {
262 return std::transform(
std::begin(range),
std::end(range),
std::move(output),
263 [op =
std::move(op)](
const auto &x) {
264 return std::invoke(op, x);
270#if __cpp_lib_ranges_contains >= 202207L
274inline constexpr auto contains = [](
auto &&range,
const auto &value) {
275 return std::find(
std::begin(range),
std::end(range), value) !=
std::end(range);
280#if __cpp_lib_ranges_to_container >= 202202L
286template <
typename Container>
291template <
typename Container,
typename Range>
294 return Container(
std::begin(range),
std::end(range));
297template <
template <
class...>
class Container>
302template <
template <
class...>
class Container,
class Range>
305 return Container<ranges::range_value_t<Range>>(std::begin(range), std::end(range));
310template <
typename Container,
typename Range>
311Container
to(Range &&range)
313 return Container(
std::begin(range),
std::end(range));
316template <
typename Container>
322template <
template <
class...>
class Container>
325 return impl::to_adaptor_template_template<Container>{};
333#ifdef __cpp_lib_ranges
342template <
typename Range>
345 using BaseIt =
decltype(
std::begin(
std::declval<Range &>()));
346 using KeyReference =
decltype((*
std::declval<BaseIt>()).first);
350 :
public IteratorFacade<iterator, KeyValue, std::input_iterator_tag, KeyReference>
355 constexpr explicit iterator(BaseIt it) : m_it(
std::move(it)) { }
357 using reference = KeyReference;
358 constexpr reference dereference()
const {
return (*m_it).first; }
359 constexpr void increment() { ++m_it; }
360 constexpr bool equals(
const iterator &o)
const {
return m_it == o.m_it; }
366 constexpr explicit KeysView(Range &range) : m_range(range) { }
367 constexpr iterator
begin()
const {
return iterator{
std::begin(m_range) }; }
368 constexpr iterator
end()
const {
return iterator{
std::end(m_range) }; }
371template <
typename Range>
374 using BaseIt =
decltype(
std::begin(
std::declval<Range &>()));
375 using ValueReference =
decltype((*
std::declval<BaseIt>()).second);
379 :
public IteratorFacade<iterator, MappedValue, std::input_iterator_tag, ValueReference>
384 constexpr explicit iterator(BaseIt it) : m_it(
std::move(it)) { }
386 using reference = ValueReference;
387 constexpr reference dereference()
const {
return (*m_it).second; }
388 constexpr void increment() { ++m_it; }
389 constexpr bool equals(
const iterator &o)
const {
return m_it == o.m_it; }
395 constexpr explicit ValuesView(Range &range) : m_range(range) { }
396 constexpr iterator
begin()
const {
return iterator{
std::begin(m_range) }; }
397 constexpr iterator
end()
const {
return iterator{
std::end(m_range) }; }
403template <
typename Range>
406template <
typename Range>
409template <
typename Container,
typename Predicate>
412 using BaseIt =
decltype(
std::begin(
std::declval<Container &>()));
413 using ElementReference =
decltype(*
std::declval<BaseIt>());
417 :
public IteratorFacade<iterator, ElementValue, std::input_iterator_tag, ElementReference>
423 constexpr void advance()
425 while (m_it != m_end && !m_pred(*m_it))
430 using reference = ElementReference;
432 constexpr iterator(BaseIt it, BaseIt end, Predicate pred)
433 : m_it(
std::move(it)), m_end(
std::move(end)), m_pred(
std::move(pred))
438 constexpr reference dereference()
const {
return *m_it; }
439 constexpr void increment()
444 constexpr bool equals(
const iterator &o)
const {
return m_it == o.m_it; };
447 Container &m_container;
452 : m_container(container), m_pred(
std::move(pred))
459 std::begin(m_container),
460 std::end(m_container),
465 constexpr iterator
end()
const
468 std::end(m_container),
469 std::end(m_container),
475template <
typename Predicate>
484template <
typename Container,
typename Predicate>
487 return FilterView<
const Container, Predicate>(container,
std::move(adaptor.pred));
490template <
typename Range,
typename Transform>
493 using BaseIt =
decltype(
std::begin(
std::declval<Range &>()));
497 class iterator :
public IteratorFacade<iterator, TransformedValue, std::input_iterator_tag,
501 Transform m_transform;
504 using reference = TransformedValue;
506 constexpr iterator(BaseIt it, Transform transform)
507 : m_it(
std::move(it)), m_transform(
std::move(transform))
511 constexpr reference dereference()
const {
return std::invoke(m_transform, *m_it); }
512 constexpr void increment() { ++m_it; }
513 constexpr void decrement() { --m_it; }
514 constexpr bool equals(
const iterator &o)
const {
return m_it == o.m_it; }
518 Transform m_transform;
522 : m_range(range), m_transform(
std::move(transform))
526 constexpr iterator
begin()
const {
return iterator{
std::begin(m_range), m_transform }; }
527 constexpr iterator
end()
const {
return iterator{
std::end(m_range), m_transform }; }
530template <
typename Transform>
536template <
typename Container,
typename Transform>
539 return TransformView<
const Container, Transform>(container,
std::move(adaptor.transform));
544template <
typename Container,
typename Predicate>
545constexpr auto filter(
const Container &container, Predicate pred)
550template <
typename Predicate>
556template <
typename Container,
typename Transform>
557constexpr auto transform(
const Container &container, Transform t)
562template <
typename Transform>
573#if __cpp_lib_ranges_stride >= 202207L
586template <
typename Range>
592 constexpr explicit ref_view(Range &range) : m_range(range) { }
594 constexpr auto begin()
const {
return std::begin(m_range); }
595 constexpr auto end()
const {
return std::end(m_range); }
596 constexpr auto data()
const {
return std::data(m_range); }
597 constexpr auto size()
const {
return std::size(m_range); }
598 constexpr bool empty()
const {
return std::empty(m_range); }
601template <
typename Range>
604 using BaseIt =
decltype(
std::begin(
std::declval<
const Range &>()));
605 using StrideReference =
decltype(*
std::declval<BaseIt>());
609 :
public IteratorFacade<iterator, StrideValue, std::input_iterator_tag, StrideReference>
613 std::ptrdiff_t m_stride;
616 using reference = StrideReference;
618 constexpr iterator(BaseIt it, BaseIt end,
std::ptrdiff_t stride)
619 : m_it(
std::move(it)), m_end(
std::move(end)), m_stride(stride)
623 constexpr reference dereference()
const {
return *m_it; }
625 constexpr void increment()
627 for (
std::ptrdiff_t i = 0; i < m_stride && m_it != m_end; ++i)
631 constexpr bool equals(
const iterator &o)
const {
return m_it == o.m_it; }
638 constexpr StrideView(Range range,
std::ptrdiff_t n) : m_range(
std::move(range)), m_n(n) { }
640 constexpr iterator
begin()
const {
return {
std::begin(m_range),
std::end(m_range), m_n }; }
641 constexpr iterator
end()
const {
return {
std::end(m_range),
std::end(m_range), m_n }; }
645 const std::ptrdiff_t total =
std::ptrdiff_t(
std::size(m_range));
646 return (total + m_n - 1) / m_n;
648 constexpr bool empty()
const {
return std::empty(m_range); }
651 ->
decltype(*
std::begin(
std::declval<
const Range &>()))
653 return *(
std::begin(m_range) + n * m_n);
660template <
typename Range>
663 if constexpr (
std::is_lvalue_reference_v<Range>) {
664 using Container = std::remove_reference_t<Range>;
665 return StrideView<ref_view<Container>>{ ref_view<Container>{ range }, n };
672template <
typename Range>
675 return make_stride_view(
std::forward<Range>(range), adaptor
.n);
680template <
typename Range>
683 return impl::make_stride_view(
std::forward<Range>(range), n);
Combined button and popup list for selecting options.