Deluge Firmware 1.3.0
Build date: 2025.04.16
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.
20class ClipIteratorBase {
21public:
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
35private:
36 [[gnu::noinline]] void next();
37
38protected:
39 ClipArray* array;
40 ClipArray* nextArray;
41 int32_t index;
42 std::optional<ClipType> clipType;
43};
44
45template <typename ClipClass>
46class ClipIterator : public ClipIteratorBase {
47public:
48 using ClipIteratorBase::ClipIteratorBase;
49 ClipClass*& operator*() { return *(ClipClass**)array->getElementAddress(index); }
50 ClipClass** operator->() { return (ClipClass**)array->getElementAddress(index); }
51};
52
53class ClipSet {
54protected:
55 ClipSet(ClipArray* first_, ClipArray* second_) : first(first_), second(second_) {}
56 ClipArray* first;
57 ClipArray* second;
58};
59
60class AllClips : ClipSet {
61public:
63 static AllClips everywhere(Song* song);
65 static AllClips inSession(Song* song);
67 static AllClips inArrangementOnly(Song* song);
68 ClipIterator<Clip> begin();
70
71private:
72 using ClipSet::ClipSet;
73};
74
75class InstrumentClips : ClipSet {
76public:
78 static InstrumentClips everywhere(Song* song);
81
82private:
83 using ClipSet::ClipSet;
84};
85
86class AudioClips : ClipSet {
87public:
89 static AudioClips everywhere(Song* song);
92
93private:
94 using ClipSet::ClipSet;
95};
Definition clip_iterators.h:60
static AllClips inArrangementOnly(Song *song)
Definition clip_iterators.cpp:61
static AllClips inSession(Song *song)
Definition clip_iterators.cpp:57
static AllClips everywhere(Song *song)
Definition clip_iterators.cpp:53
Definition clip_iterators.h:86
static AudioClips everywhere(Song *song)
Definition clip_iterators.cpp:88
Definition clip_array.h:25
void deleteClip(InstrumentRemoval instrumentRemoval)
Definition clip_iterators.cpp:22
Definition clip_iterators.h:46
Definition clip_iterators.h:75
static InstrumentClips everywhere(Song *song)
Definition clip_iterators.cpp:75
Definition song.h:104