clack_common/events/io/
buffer.rs1use crate::events::UnknownEvent;
2use crate::events::event_types::TransportEvent;
3use crate::events::io::implementation::{InputEventBuffer, OutputEventBuffer};
4use crate::events::io::{InputEvents, OutputEvents, TryPushError};
5use crate::utils::{check_clap_size_overflow, usize_to_clap_size};
6use clap_sys::events::clap_event_header;
7use core::mem::MaybeUninit;
8use std::fmt::{Debug, Formatter};
9use std::ops::{Index, Range};
10
11#[repr(C, align(8))]
12#[derive(Copy, Clone)]
13struct AlignedEventHeader(clap_event_header);
14
15pub struct EventBuffer {
52 headers: Vec<MaybeUninit<AlignedEventHeader>>, indexes: Vec<usize>,
54}
55
56#[inline]
57pub(crate) fn byte_index_to_value_index<T>(size: usize) -> usize {
58 let type_size = size_of::<T>();
59 if type_size == 0 {
60 0
61 } else {
62 size.div_ceil(type_size)
63 }
64}
65
66impl EventBuffer {
67 #[inline]
69 pub const fn new() -> Self {
70 Self {
71 headers: Vec::new(),
72 indexes: Vec::new(),
73 }
74 }
75
76 #[inline]
86 pub fn with_capacity(events: usize) -> Self {
87 Self {
88 headers: Vec::with_capacity(events * size_of::<TransportEvent>()),
90 indexes: Vec::with_capacity(events),
91 }
92 }
93
94 pub fn clear(&mut self) {
98 self.indexes.clear();
99 self.headers.clear();
100 }
101
102 #[inline]
104 pub fn len(&self) -> u32 {
105 #[allow(clippy::cast_possible_truncation)] {
107 self.indexes.len() as u32
108 }
109 }
110
111 #[inline]
113 pub fn is_empty(&self) -> bool {
114 self.indexes.is_empty()
115 }
116
117 pub fn get(&self, index: u32) -> Option<&UnknownEvent> {
121 let header_index = *self.indexes.get(index as usize)?;
122 let event = unsafe { self.headers[header_index].assume_init_ref() };
125 let event_size = event.0.size as usize;
126 let header_end_index =
127 byte_index_to_value_index::<AlignedEventHeader>(event_size) + header_index;
128
129 let event = &self.headers[header_index..header_end_index];
130
131 let event_bytes =
133 unsafe { core::slice::from_raw_parts(event.as_ptr() as *const u8, event_size) };
134
135 Some(unsafe { UnknownEvent::from_bytes_unchecked(event_bytes) })
137 }
138
139 #[inline]
141 pub fn iter(&self) -> EventBufferIter<'_> {
142 EventBufferIter {
143 buffer: self,
144 range: 0..self.len(),
145 }
146 }
147
148 pub fn sort(&mut self) {
152 self.indexes.sort_unstable_by_key(|i| {
154 let event = unsafe { self.headers[*i].assume_init_ref() };
157 event.0.time
158 })
159 }
160
161 pub fn insert<E: AsRef<UnknownEvent> + ?Sized>(&mut self, event: &E, position: usize) {
167 let index = self.append_header_data(event.as_ref());
168 self.indexes.insert(position, index);
169 }
170
171 pub fn push_all<'a, E: AsRef<UnknownEvent> + ?Sized + 'a>(
173 &mut self,
174 events: impl IntoIterator<Item = &'a E>,
175 ) {
176 for e in events {
177 self.push(e);
178 }
179 }
180
181 pub fn push<E: AsRef<UnknownEvent> + ?Sized>(&mut self, event: &E) {
185 check_clap_size_overflow(self.indexes.len().saturating_add(1));
187
188 let index = self.append_header_data(event.as_ref());
189 self.indexes.push(index);
190 }
191
192 #[inline]
196 pub fn as_input(&self) -> InputEvents<'_> {
197 InputEvents::from_buffer(self)
198 }
199
200 #[inline]
204 pub fn as_output(&mut self) -> OutputEvents<'_> {
205 OutputEvents::from_buffer(self)
206 }
207
208 fn append_header_data(&mut self, event: &UnknownEvent) -> usize {
209 let index = self.headers.len();
210 let event_bytes = event.as_bytes();
211 let bytes = self.allocate_mut(event_bytes.len());
212
213 bytes.copy_from_slice(event_bytes);
215 index
216 }
217
218 fn allocate_mut(&mut self, byte_size: usize) -> &mut [u8] {
219 let previous_len = self.headers.len();
220 let headers_size = byte_index_to_value_index::<AlignedEventHeader>(byte_size);
221 self.headers
222 .resize(previous_len + headers_size, MaybeUninit::zeroed());
223
224 let new_elements = &mut self.headers[previous_len..];
226
227 let new_bytes = unsafe {
229 core::slice::from_raw_parts_mut(
230 new_elements.as_mut_ptr() as *mut u8,
231 size_of_val(new_elements),
232 )
233 };
234
235 &mut new_bytes[..byte_size]
237 }
238}
239
240impl<'a> IntoIterator for &'a EventBuffer {
241 type Item = &'a UnknownEvent;
242 type IntoIter = EventBufferIter<'a>;
243
244 #[inline]
245 fn into_iter(self) -> Self::IntoIter {
246 self.iter()
247 }
248}
249
250impl InputEventBuffer for EventBuffer {
251 #[inline]
252 fn len(&self) -> u32 {
253 EventBuffer::len(self)
254 }
255
256 #[inline]
257 fn get(&self, index: u32) -> Option<&UnknownEvent> {
258 EventBuffer::get(self, index)
259 }
260}
261
262impl OutputEventBuffer for EventBuffer {
263 fn try_push(&mut self, event: &UnknownEvent) -> Result<(), TryPushError> {
264 self.push(event);
265
266 Ok(())
267 }
268}
269
270impl Default for EventBuffer {
271 #[inline]
272 fn default() -> Self {
273 Self::new()
274 }
275}
276
277impl Debug for EventBuffer {
278 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
279 let mut list = f.debug_list();
280 for event in self {
281 if let Some(event) = event.as_core_event() {
282 list.entry(&event);
283 } else {
284 list.entry(&event);
285 }
286 }
287
288 list.finish()
289 }
290}
291
292const INDEX_ERROR: &str = "Indexed EventBuffer out of bounds";
293
294impl Index<usize> for EventBuffer {
295 type Output = UnknownEvent;
296
297 #[inline]
298 fn index(&self, index: usize) -> &Self::Output {
299 self.get(usize_to_clap_size(index)).expect(INDEX_ERROR)
300 }
301}
302
303pub struct EventBufferIter<'a> {
305 buffer: &'a EventBuffer,
306 range: Range<u32>,
307}
308
309impl<'a> Iterator for EventBufferIter<'a> {
310 type Item = &'a UnknownEvent;
311
312 fn next(&mut self) -> Option<Self::Item> {
313 let next_index = self.range.next()?;
314 self.buffer.get(next_index)
315 }
316}
317
318#[cfg(test)]
319mod test {
320 use crate::events::Event;
321 use crate::events::event_types::MidiEvent;
322 use crate::events::io::EventBuffer;
323
324 #[test]
325 fn it_works() {
326 let event_0 = MidiEvent::new(0, 0, [0; 3]);
327 let event_1 = MidiEvent::new(1, 0, [1; 3]);
328 let event_2 = MidiEvent::new(2, 0, [2; 3]);
329 let event_3 = MidiEvent::new(3, 0, [3; 3]);
330
331 let events_1 = [event_1, event_2];
332 let events_2 = [event_0, event_3];
333
334 let mut buffer = EventBuffer::new();
335 buffer.push_all(
336 [events_1, events_2]
337 .iter()
338 .flatten()
339 .map(|e| e.as_unknown()),
340 );
341
342 buffer.sort();
343
344 assert_eq!(Some(&event_0), buffer.get(0).unwrap().as_event());
345 assert_eq!(Some(&event_1), buffer.get(1).unwrap().as_event());
346 assert_eq!(Some(&event_2), buffer.get(2).unwrap().as_event());
347 assert_eq!(Some(&event_3), buffer.get(3).unwrap().as_event());
348 }
349}