audio/buf/interleaved/
iter.rs

1use core::marker;
2use core::ptr;
3
4use crate::channel::{InterleavedChannel, InterleavedChannelMut};
5
6/// An immutable iterator over an interleaved buffer.
7pub struct IterChannels<'a, T> {
8    ptr: ptr::NonNull<T>,
9    len: usize,
10    channel: usize,
11    channels: usize,
12    _marker: marker::PhantomData<&'a [T]>,
13}
14
15impl<'a, T> IterChannels<'a, T> {
16    /// Construct a new unchecked iterator.
17    ///
18    /// # Safety
19    ///
20    /// The caller must ensure that the pointed to buffer is a valid immutable
21    /// interleaved region of data.
22    pub(crate) unsafe fn new_unchecked(ptr: ptr::NonNull<T>, len: usize, channels: usize) -> Self {
23        Self {
24            ptr,
25            len,
26            channel: 0,
27            channels,
28            _marker: marker::PhantomData,
29        }
30    }
31}
32
33impl<'a, T> Iterator for IterChannels<'a, T>
34where
35    T: Copy,
36{
37    type Item = InterleavedChannel<'a, T>;
38
39    fn next(&mut self) -> Option<Self::Item> {
40        if self.channel == self.channels {
41            return None;
42        }
43
44        let channel = self.channel;
45        self.channel += 1;
46
47        unsafe {
48            Some(InterleavedChannel::new_unchecked(
49                self.ptr,
50                self.len,
51                channel,
52                self.channels,
53            ))
54        }
55    }
56}
57
58/// An mutable iterator over an interleaved buffer.
59pub struct IterChannelsMut<'a, T> {
60    ptr: ptr::NonNull<T>,
61    len: usize,
62    channel: usize,
63    channels: usize,
64    _marker: marker::PhantomData<&'a mut [T]>,
65}
66
67impl<'a, T> IterChannelsMut<'a, T> {
68    /// Construct a new unchecked iterator.
69    ///
70    /// # Safety
71    ///
72    /// The caller must ensure that the pointed to buffer is a valid mutable
73    /// interleaved region of data.
74    pub(crate) unsafe fn new_unchecked(ptr: ptr::NonNull<T>, len: usize, channels: usize) -> Self {
75        Self {
76            ptr,
77            len,
78            channel: 0,
79            channels,
80            _marker: marker::PhantomData,
81        }
82    }
83}
84
85impl<'a, T> Iterator for IterChannelsMut<'a, T>
86where
87    T: Copy,
88{
89    type Item = InterleavedChannelMut<'a, T>;
90
91    fn next(&mut self) -> Option<Self::Item> {
92        if self.channel == self.channels {
93            return None;
94        }
95
96        let channel = self.channel;
97        self.channel += 1;
98
99        unsafe {
100            Some(InterleavedChannelMut::new_unchecked(
101                self.ptr,
102                self.len,
103                channel,
104                self.channels,
105            ))
106        }
107    }
108}