Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
views.h
1// SPDX-FileCopyrightText: © 2025-2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <cstddef>
7#include <ranges>
8#include <utility>
9
10#include <QObject>
11
12namespace zrythm::utils::views
13{
14
15namespace detail
16{
17
19struct EnumerateAdaptor : std::ranges::range_adaptor_closure<EnumerateAdaptor>
20{
21 template <std::ranges::viewable_range Range> auto operator() (Range &&r) const
22 {
23 return std::views::zip (
24 std::views::iota (std::size_t{ 0 }), std::forward<Range> (r));
25 }
26};
27
29struct FilterNullAdaptor : std::ranges::range_adaptor_closure<FilterNullAdaptor>
30{
31 template <std::ranges::viewable_range Range> auto operator() (Range &&r) const
32 {
33 return std::forward<Range> (r) | std::views::filter ([] (const auto &ptr) {
34 return ptr != nullptr;
35 });
36 }
37};
38
44template <typename Derived>
46 : std::ranges::range_adaptor_closure<QObjectCastToAdaptor<Derived>>
47{
48 template <std::ranges::viewable_range Range> auto operator() (Range &&r) const
49 {
50 return std::forward<Range> (r)
51 | std::views::transform ([] (auto * ptr) -> Derived * {
52 return qobject_cast<Derived *> (ptr);
53 });
54 }
55};
56
61template <typename Derived>
63 : std::ranges::range_adaptor_closure<QObjectCastAndFilterAdaptor<Derived>>
64{
65 template <std::ranges::viewable_range Range> auto operator() (Range &&r) const
66 {
67 return std::forward<Range> (r) | detail::QObjectCastToAdaptor<Derived>{}
69 }
70};
71
72} // namespace detail
73
74inline constexpr detail::EnumerateAdaptor enumerate{};
75
76inline constexpr detail::FilterNullAdaptor filter_null{};
77
78template <typename Derived>
79inline constexpr detail::QObjectCastToAdaptor<Derived> qobject_cast_to{};
80
81template <typename Derived>
82inline constexpr detail::QObjectCastAndFilterAdaptor<Derived>
83 qobject_cast_and_filter{};
84
85} // namespace zrythm::utils::views
Enumerates a range with index pairs (index, element).
Definition views.h:20
Filters out null pointers from a range of pointers.
Definition views.h:30
qobject_cast + filter_null combined: returns only non-null cast results.
Definition views.h:64
Transforms a range of QObject pointers via qobject_cast.
Definition views.h:47