Skip to content

Commit 9c1857b

Browse files
committed
remove Buffers::collect; reinstate TryFrom impls for non-nested tuples
Remove Buffers::collect, Buffer(Mut)::collect, and FromBuffers trait in favor of the standard TryFrom trait again. However, only impl TryFrom<Buffers> for non-nested tuples; do not implement it for singular Buffer(Mut) types or for arbitrarily nested tuples.
1 parent 3cc473f commit 9c1857b

File tree

4 files changed

+114
-146
lines changed

4 files changed

+114
-146
lines changed

examples/gain/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ impl Processor for GainProcessor {
115115
fn reset(&mut self) {}
116116

117117
fn process(&mut self, buffers: Buffers, events: Events) {
118-
let mut buffer = buffers.collect::<BufferMut>().unwrap();
119-
for (mut buffer, events) in buffer.split_at_events(events) {
118+
let mut buffers: (BufferMut,) = buffers.try_into().unwrap();
119+
for (mut buffer, events) in buffers.0.split_at_events(events) {
120120
for event in events {
121121
if let Data::ParamChange { id, value } = event.data {
122122
self.params.set_param(id, value);

src/buffers.rs

+2-38
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
use std::marker::PhantomData;
22
use std::ops::{Index, IndexMut, Range};
3-
use std::{array, slice};
3+
use std::slice;
44

5-
pub mod collect;
5+
pub mod convert;
66
pub mod iter;
77

88
use crate::events::Events;
9-
use collect::FromBuffers;
109
use iter::{BlockIterator, IntoBlocks, IntoSamples};
1110

1211
#[derive(Copy, Clone, Eq, PartialEq)]
@@ -108,19 +107,6 @@ impl<'a, 'b> Buffers<'a, 'b> {
108107
}
109108
}
110109

111-
#[inline]
112-
pub fn collect<B: FromBuffers<'a, 'b>>(self) -> Option<B> {
113-
let mut iter = self.into_iter();
114-
115-
let result = B::from_buffers(&mut iter)?;
116-
117-
if iter.next().is_none() {
118-
Some(result)
119-
} else {
120-
None
121-
}
122-
}
123-
124110
#[inline]
125111
pub fn slice(&mut self, range: Range<usize>) -> Option<Buffers> {
126112
if range.start > range.end || range.end > self.len {
@@ -335,17 +321,6 @@ impl<'a, 'b> Buffer<'a, 'b> {
335321
self.ptrs.len()
336322
}
337323

338-
#[inline]
339-
pub fn collect<const N: usize>(self) -> Option<[&'b [f32]; N]> {
340-
if self.channel_count() != N {
341-
return None;
342-
}
343-
344-
Some(array::from_fn(|i| unsafe {
345-
slice::from_raw_parts(self.ptrs[i].offset(self.offset), self.len)
346-
}))
347-
}
348-
349324
#[inline]
350325
pub fn samples(&self) -> iter::SampleIter<'a, 'b> {
351326
self.into_samples()
@@ -515,17 +490,6 @@ impl<'a, 'b> BufferMut<'a, 'b> {
515490
}
516491
}
517492

518-
#[inline]
519-
pub fn collect<const N: usize>(self) -> Option<[&'b mut [f32]; N]> {
520-
if self.channel_count() != N {
521-
return None;
522-
}
523-
524-
Some(array::from_fn(|i| unsafe {
525-
slice::from_raw_parts_mut(self.ptrs[i].offset(self.offset), self.len)
526-
}))
527-
}
528-
529493
#[inline]
530494
pub fn samples<'c>(&'c mut self) -> iter::SampleIterMut<'a, 'c> {
531495
self.reborrow().into_samples()

src/buffers/collect.rs

-106
This file was deleted.

src/buffers/convert.rs

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
use std::error::Error;
2+
use std::{array, fmt, slice};
3+
4+
use super::{AnyBuffer, Buffer, BufferMut, Buffers};
5+
6+
impl<'a, 'b> TryFrom<AnyBuffer<'a, 'b>> for Buffer<'a, 'b> {
7+
type Error = AnyBuffer<'a, 'b>;
8+
9+
#[inline]
10+
fn try_from(value: AnyBuffer<'a, 'b>) -> Result<Buffer<'a, 'b>, Self::Error> {
11+
match value {
12+
AnyBuffer::Const(buffer) => Ok(buffer),
13+
_ => Err(value),
14+
}
15+
}
16+
}
17+
18+
impl<'a, 'b> TryFrom<AnyBuffer<'a, 'b>> for BufferMut<'a, 'b> {
19+
type Error = AnyBuffer<'a, 'b>;
20+
21+
#[inline]
22+
fn try_from(value: AnyBuffer<'a, 'b>) -> Result<BufferMut<'a, 'b>, Self::Error> {
23+
match value {
24+
AnyBuffer::Mut(buffer) => Ok(buffer),
25+
_ => Err(value),
26+
}
27+
}
28+
}
29+
30+
impl<'a, 'b, const N: usize> TryFrom<Buffer<'a, 'b>> for [&'b [f32]; N] {
31+
type Error = Buffer<'a, 'b>;
32+
33+
#[inline]
34+
fn try_from(value: Buffer<'a, 'b>) -> Result<[&'b [f32]; N], Self::Error> {
35+
if value.channel_count() == N {
36+
Ok(array::from_fn(|i| unsafe {
37+
slice::from_raw_parts(value.ptrs[i].offset(value.offset), value.len)
38+
}))
39+
} else {
40+
Err(value)
41+
}
42+
}
43+
}
44+
45+
impl<'a, 'b, const N: usize> TryFrom<BufferMut<'a, 'b>> for [&'b mut [f32]; N] {
46+
type Error = BufferMut<'a, 'b>;
47+
48+
#[inline]
49+
fn try_from(value: BufferMut<'a, 'b>) -> Result<[&'b mut [f32]; N], Self::Error> {
50+
if value.channel_count() == N {
51+
Ok(array::from_fn(|i| unsafe {
52+
slice::from_raw_parts_mut(value.ptrs[i].offset(value.offset), value.len)
53+
}))
54+
} else {
55+
Err(value)
56+
}
57+
}
58+
}
59+
60+
#[derive(Debug)]
61+
pub struct TryFromBuffersError;
62+
63+
impl fmt::Display for TryFromBuffersError {
64+
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
65+
"buffer layout does not match".fmt(fmt)
66+
}
67+
}
68+
69+
impl Error for TryFromBuffersError {}
70+
71+
macro_rules! try_from_buffers {
72+
($($buffer:ident),*) => {
73+
impl<'a, 'b, $($buffer),*> TryFrom<Buffers<'a, 'b>> for ($($buffer,)*)
74+
where
75+
$($buffer: TryFrom<AnyBuffer<'a, 'b>>),*
76+
{
77+
type Error = TryFromBuffersError;
78+
79+
#[inline]
80+
fn try_from(value: Buffers<'a, 'b>) -> Result<Self, Self::Error> {
81+
let mut iter = value.into_iter();
82+
83+
let result = (
84+
$({
85+
let next = iter.next().ok_or(TryFromBuffersError)?;
86+
$buffer::try_from(next).map_err(|_| TryFromBuffersError)?
87+
},)*
88+
);
89+
90+
if iter.next().is_none() {
91+
Ok(result)
92+
} else {
93+
Err(TryFromBuffersError)
94+
}
95+
}
96+
}
97+
}
98+
}
99+
100+
try_from_buffers!();
101+
try_from_buffers!(B0);
102+
try_from_buffers!(B0, B1);
103+
try_from_buffers!(B0, B1, B2);
104+
try_from_buffers!(B0, B1, B2, B3);
105+
try_from_buffers!(B0, B1, B2, B3, B4);
106+
try_from_buffers!(B0, B1, B2, B3, B4, B5);
107+
try_from_buffers!(B0, B1, B2, B3, B4, B5, B6);
108+
try_from_buffers!(B0, B1, B2, B3, B4, B5, B6, B7);
109+
try_from_buffers!(B0, B1, B2, B3, B4, B5, B6, B7, B8);
110+
try_from_buffers!(B0, B1, B2, B3, B4, B5, B6, B7, B8, B9);

0 commit comments

Comments
 (0)