recursive trait impls
This commit is contained in:
parent
f688dbe225
commit
a1e2111e6d
1 changed files with 25 additions and 48 deletions
|
@ -1,66 +1,43 @@
|
|||
use dasp_sample::{FromSample, Sample, U24, U48};
|
||||
|
||||
pub trait AsSample<S>
|
||||
pub trait AsSample<F>
|
||||
where
|
||||
S: Sample,
|
||||
Self: Sized,
|
||||
{
|
||||
fn as_sample(self) -> S;
|
||||
}
|
||||
|
||||
impl<S> AsSample<S> for u8
|
||||
where
|
||||
S: Sample + FromSample<u8>,
|
||||
{
|
||||
fn as_sample(self) -> S {
|
||||
self.to_sample()
|
||||
fn _prepare(self) -> F;
|
||||
fn as_sample<S: Sample + FromSample<F>>(self) -> S {
|
||||
Sample::from_sample(self._prepare())
|
||||
}
|
||||
}
|
||||
|
||||
impl<S> AsSample<S> for [u8; 2]
|
||||
where
|
||||
S: Sample + FromSample<u16>,
|
||||
{
|
||||
fn as_sample(self) -> S {
|
||||
(((self[0] as u16) << 8) | self[1] as u16).to_sample()
|
||||
impl AsSample<u8> for u8 {
|
||||
fn _prepare(self) -> u8 {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<S> AsSample<S> for [u8; 3]
|
||||
where
|
||||
S: Sample + FromSample<U24>,
|
||||
{
|
||||
fn as_sample(self) -> S {
|
||||
(((U24::from(self[0])) << 16.into())
|
||||
| (U24::from(self[1]) << 8.into())
|
||||
| U24::from(self[2]))
|
||||
.to_sample()
|
||||
impl AsSample<u16> for [u8; 2] {
|
||||
fn _prepare(self) -> u16 {
|
||||
((self[0]._prepare() as u16) << 8) | self[1] as u16
|
||||
}
|
||||
}
|
||||
|
||||
impl<S> AsSample<S> for [u8; 4]
|
||||
where
|
||||
S: Sample + FromSample<u32>,
|
||||
{
|
||||
fn as_sample(self) -> S {
|
||||
(((self[0] as u32) << 24)
|
||||
| ((self[1] as u32) << 16)
|
||||
| ((self[2] as u32) << 8)
|
||||
| self[3] as u32)
|
||||
.to_sample()
|
||||
impl AsSample<U24> for [u8; 3] {
|
||||
fn _prepare(self) -> U24 {
|
||||
(U24::from([self[0], self[1]]._prepare()) << 8.into()) | U24::from(self[2])
|
||||
}
|
||||
}
|
||||
|
||||
impl<S> AsSample<S> for [u8; 6]
|
||||
where
|
||||
S: Sample + FromSample<U48>,
|
||||
{
|
||||
fn as_sample(self) -> S {
|
||||
((U48::from(self[0]) << 40u8.into())
|
||||
| (U48::from(self[1]) << 32u8.into())
|
||||
| (U48::from(self[2]) << 24u8.into())
|
||||
| (U48::from(self[3]) << 16u8.into())
|
||||
| (U48::from(self[4]) << 8u8.into())
|
||||
| U48::from(self[3]))
|
||||
.to_sample()
|
||||
impl AsSample<u32> for [u8; 4] {
|
||||
fn _prepare(self) -> u32 {
|
||||
(([self[0], self[1], self[2]]._prepare().inner() as u32) << 8) | self[3] as u32
|
||||
}
|
||||
}
|
||||
|
||||
impl AsSample<U48> for [u8; 6] {
|
||||
fn _prepare(self) -> U48 {
|
||||
((U48::from([self[0], self[1], self[2], self[3]]._prepare()) << 16u8.into())
|
||||
| (U48::from(self[4]) << 8u8.into()))
|
||||
| U48::from(self[5])
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue