audio/buf/interleaved/
iter.rs1use core::marker;
2use core::ptr;
3
4use crate::channel::{InterleavedChannel, InterleavedChannelMut};
5
6pub 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 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
58pub 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 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}