Diffstat (limited to 'src/build/builders/core/array.rs')
-rw-r--r--src/build/builders/core/array.rs53
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