Diffstat (limited to 'src/build/builders/core/array.rs')
| -rw-r--r-- | src/build/builders/core/array.rs | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/src/build/builders/core/array.rs b/src/build/builders/core/array.rs index f3311e5..8638fae 100644 --- a/src/build/builders/core/array.rs +++ b/src/build/builders/core/array.rs @@ -6,6 +6,7 @@ use crate::{ visitor::{Sequence, SequenceScope, Status}, ControlFlowFor, Effect, }, + DefaultBuilder, }; #[cfg(feature = "alloc")] @@ -17,6 +18,7 @@ use alloc::boxed::Box; impl<'ctx, T, const N: usize> crate::Build<'ctx> for [T; N] where T: crate::Build<'ctx>, + <T as crate::Build<'ctx>>::Builder: DefaultBuilder<'ctx>, { type Builder = Builder<'ctx, T::Builder, N>; } @@ -33,17 +35,9 @@ pub struct Builder<'ctx, B: crate::Builder<'ctx>, const N: usize> { item_err: Option<(usize, B::Error)>, } -impl<'ctx, B: crate::Builder<'ctx>, const N: usize> Default for Builder<'ctx, B, N> { - fn default() -> Self { - Self { - array: MaybeUninit::uninit(), - index: 0, - item_err: None, - } - } -} - -impl<'ctx, B: crate::Builder<'ctx>, const N: usize> crate::Builder<'ctx> for Builder<'ctx, B, N> { +impl<'ctx, B: crate::DefaultBuilder<'ctx>, const N: usize> crate::Builder<'ctx> + for Builder<'ctx, B, N> +{ type Error = ArrayError<B::Error>; type Value = [B::Value; N]; @@ -63,26 +57,34 @@ impl<'ctx, B: crate::Builder<'ctx>, const N: usize> crate::Builder<'ctx> for Bui Ok(unsafe { self.array.assume_init() }) } } -} -#[cfg(not(feature = "alloc"))] -any_trait! { - impl['a, 'ctx, B: crate::Builder<'ctx>, const N: usize] Builder<'ctx, B, N> = [ - dyn Sequence<'ctx> + 'a, - ]; + type Seed = (); + + fn from_seed(seed: Self::Seed) -> Self { + Self { + array: MaybeUninit::uninit(), + index: 0, + item_err: None, + } + } } -#[cfg(feature = "alloc")] +// #[cfg(not(feature = "alloc"))] any_trait! { - impl['a, 'ctx, B: crate::Builder<'ctx>, const N: usize] Builder<'ctx, B, N> = [ + impl['a, 'ctx, B: crate::DefaultBuilder<'ctx>, const N: usize] Builder<'ctx, B, N> = [ dyn Sequence<'ctx> + 'a, - dyn Sequence<'ctx, AsyncEffect> + 'a, - ]; + ] } -impl<'ctx, B: crate::Builder<'ctx>, const N: usize> Sequence<'ctx> - for Builder<'ctx, B, N> -{ +// #[cfg(feature = "alloc")] +// any_trait! { +// impl['a, 'ctx, B: crate::DefaultBuilder<'ctx>, const N: usize] Builder<'ctx, B, N> = [ +// dyn Sequence<'ctx> + 'a, +// dyn Sequence<'ctx, AsyncEffect> + 'a, +// ] +// } + +impl<'ctx, B: crate::DefaultBuilder<'ctx>, const N: usize> Sequence<'ctx> for Builder<'ctx, B, N> { #[inline] fn visit<'a>(&'a mut self, scope: &'a mut dyn SequenceScope<'ctx>) -> ControlFlowFor<'a> { loop { @@ -108,7 +110,8 @@ impl<'ctx, B: crate::Builder<'ctx>, const N: usize> Sequence<'ctx> // .write(value) // }; unsafe { - let ptr = (self.array.as_mut_ptr() as *mut B::Value).offset(self.index as _); + let ptr = + (self.array.as_mut_ptr() as *mut B::Value).offset(self.index as _); core::ptr::write(ptr, value); } // std::ptr::write(&mut self.array |