Deluge Firmware
1.3.0
Build date: 2026.08.29
Toggle main menu visibility
Loading...
Searching...
No Matches
clip_iterators.h
1
#pragma once
2
3
#include <cstdint>
4
#include <optional>
5
6
#include "definitions_cxx.hpp"
7
8
#ifdef IN_UNIT_TESTS
9
#include "clip_mocks.h"
10
#include "song_mock.h"
11
#else
12
#include "deluge.h"
13
#include "model/clip/clip.h"
14
#include "model/clip/clip_array.h"
15
#include "model/song/song.h"
16
#endif
17
18
// This is an incomplete iterator, missing operator*() and operator->(): the templated iterators inherit
19
// from this and implement just those for minimal template bloat.
20
class
ClipIteratorBase {
21
public
:
22
[[gnu::noinline]] ClipIteratorBase(
ClipArray
* array_, uint32_t index_,
ClipArray
* nextArray_,
23
std::optional<ClipType> clipType_);
24
[[gnu::noinline]] ClipIteratorBase& operator++();
25
[[gnu::noinline]] ClipIteratorBase operator++(
int
);
27
[[gnu::noinline]]
void
deleteClip
(InstrumentRemoval instrumentRemoval);
28
[[gnu::noinline]]
friend
bool
operator==(
const
ClipIteratorBase& a,
const
ClipIteratorBase& b) {
29
return
(a.array == b.array) && (a.index == b.index) && (a.clipType == b.clipType);
30
}
31
[[gnu::noinline]]
friend
bool
operator!=(
const
ClipIteratorBase& a,
const
ClipIteratorBase& b) {
32
return
(a.array != b.array) || (a.index != b.index) || (a.clipType != b.clipType);
33
}
34
35
private
:
36
[[gnu::noinline]]
void
next();
37
38
protected
:
39
ClipArray
* array;
40
ClipArray
* nextArray;
41
int32_t index;
42
std::optional<ClipType> clipType;
43
};
44
45
template
<
typename
ClipClass>
46
class
ClipIterator
:
public
ClipIteratorBase {
47
public
:
48
using
ClipIteratorBase::ClipIteratorBase;
49
ClipClass*& operator*() {
return
*(ClipClass**)array->getElementAddress(index); }
50
ClipClass** operator->() {
return
(ClipClass**)array->getElementAddress(index); }
51
};
52
53
class
ClipSet {
54
protected
:
55
ClipSet(
ClipArray
* first_,
ClipArray
* second_) : first(first_), second(second_) {}
56
ClipArray
* first;
57
ClipArray
* second;
58
};
59
60
class
AllClips
: ClipSet {
61
public
:
63
static
AllClips
everywhere
(
Song
* song);
65
static
AllClips
inSession
(
Song
* song);
67
static
AllClips
inArrangementOnly
(
Song
* song);
68
ClipIterator<Clip>
begin();
69
ClipIterator<Clip>
end();
70
71
private
:
72
using
ClipSet::ClipSet;
73
};
74
75
class
InstrumentClips
: ClipSet {
76
public
:
78
static
InstrumentClips
everywhere
(
Song
* song);
79
ClipIterator<InstrumentClip>
begin();
80
ClipIterator<InstrumentClip>
end();
81
82
private
:
83
using
ClipSet::ClipSet;
84
};
85
86
class
AudioClips
: ClipSet {
87
public
:
89
static
AudioClips
everywhere
(
Song
* song);
90
ClipIterator<AudioClip>
begin();
91
ClipIterator<AudioClip>
end();
92
93
private
:
94
using
ClipSet::ClipSet;
95
};
AllClips
Definition
clip_iterators.h:60
AllClips::inArrangementOnly
static AllClips inArrangementOnly(Song *song)
Definition
clip_iterators.cpp:61
AllClips::inSession
static AllClips inSession(Song *song)
Definition
clip_iterators.cpp:57
AllClips::everywhere
static AllClips everywhere(Song *song)
Definition
clip_iterators.cpp:53
AudioClips
Definition
clip_iterators.h:86
AudioClips::everywhere
static AudioClips everywhere(Song *song)
Definition
clip_iterators.cpp:88
ClipArray
Definition
clip_array.h:25
ClipIteratorBase::deleteClip
void deleteClip(InstrumentRemoval instrumentRemoval)
Definition
clip_iterators.cpp:22
ClipIterator
Definition
clip_iterators.h:46
InstrumentClips
Definition
clip_iterators.h:75
InstrumentClips::everywhere
static InstrumentClips everywhere(Song *song)
Definition
clip_iterators.cpp:75
Song
Definition
song.h:103