blob: ee21f93af957a6f24df785d268d624be0bd536e2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#include "events_ds.h"
#include <type_traits>
void EventsDS::remove(EventID event_id)
{
const auto& event_info = id_to_info.get(event_id);
if (event_info.type == Event::Type::SampleEvent)
{
auto& sample_events = channel_data_array[event_info.ch].sample_events;
auto& event = sample_events[event_info.channel_event_index];
auto& ids = id_to_group_data.get(event.group_id).event_ids;
ids.erase(std::remove(ids.begin(), ids.end(), event_id), ids.end());
if (id_to_group_data.get(event.group_id).event_ids.empty())
{
removeGroup(event.group_id, event.instrument_id);
}
auto& swap_element = sample_events.back();
id_to_info.get(swap_element.id).channel_event_index = event_info.channel_event_index;
event = swap_element;
sample_events.pop_back();
}
id_to_info.remove(event_id);
}
Event::Type EventsDS::getType(EventID event_id) const
{
return id_to_info.get(event_id).type;
}
std::size_t EventsDS::numberOfEvents(channel_t ch) const
{
auto& channel_data = channel_data_array[ch];
return channel_data.sample_events.size();
}
const EventGroupIDs& EventsDS::getSampleEventGroupIDsOf(InstrumentID instrument_id) const
{
return instruments_sample_event_group_ids[instrument_id];
}
const EventIDs& EventsDS::getEventIDsOf(EventGroupID event_group_id) const
{
return id_to_group_data.get(event_group_id).event_ids;
}
void EventsDS::startAddingNewGroup(InstrumentID instrument_id)
{
if (current_group_id.valid() && id_to_group_data.get(current_group_id).event_ids.empty())
{
removeGroup(current_group_id, current_groups_instrument_id);
}
current_group_id = id_to_group_data.emplace();
if (instrument_id.valid())
{
current_groups_instrument_id = instrument_id;
auto& group_ids = instruments_sample_event_group_ids[instrument_id];
group_ids.push_back(current_group_id);
id_to_group_data.get(current_group_id).instrument_index = group_ids.size() - 1;
}
else
{
current_groups_instrument_id.invalidate();
}
}
void EventsDS::removeGroup(EventGroupID group_id, InstrumentID instrument_id)
{
if (group_id == current_group_id)
{
current_group_id.invalidate();
current_groups_instrument_id.invalidate();
}
if (instrument_id.valid())
{
auto instrument_index = id_to_group_data.get(group_id).instrument_index;
auto& ids = instruments_sample_event_group_ids[instrument_id];
id_to_group_data.get(ids.back()).instrument_index = instrument_index;
ids[instrument_index] = ids.back();
ids.pop_back();
}
id_to_group_data.remove(group_id);
}
|