macro_rules! __slice_sequence {
    (
        $(#[$($meta:meta)*])*
        $cx:ident,
        $ty:ident <T $(, $alloc:ident)?>,
        || $new:expr,
        |$vec:ident, $value:ident| $insert:expr,
        |$reserve_vec:ident, $reserve_capacity:ident| $reserve:expr,
        |$capacity:ident| $with_capacity:expr,
    ) => {
        $(#[$($meta)*])*
        impl<M, T $(, $alloc)*> $crate::en::Encode<M> for $ty<T $(, $alloc)*>
        where
            T: $crate::en::Encode<M>,
            $($alloc: Allocator,)*
        {
            const IS_BITWISE_ENCODE: bool = false;

            type Encode = Self;

            #[inline]
            fn encode<E>(&self, encoder: E) -> Result<(), E::Error>
            where
                E: $crate::en::Encoder<Mode = M>,
            {
                encoder.encode_slice(self)
            }

            #[inline]
            fn as_encode(&self) -> &Self::Encode {
                self
            }
        }

        $(#[$($meta)*])*
        impl<'de, M, A, T> $crate::de::Decode<'de, M, A> for $ty<T $(, $alloc)*>
        where
            A: $crate::alloc::Allocator,
            T: $crate::de::Decode<'de, M, A>,
        {
            const IS_BITWISE_DECODE: bool = false;

            #[inline]
            fn decode<D>(decoder: D) -> Result<Self, D::Error>
            where
                D: Decoder<'de, Mode = M, Allocator = A>,
            {
                struct Builder<'de, M, A, T>
                where
                    $($alloc: $crate::alloc::Allocator,)*
                {
                    vec: $ty<T $(, $alloc)*>,
                    _marker: core::marker::PhantomData<(M, A, &'de ())>
                }

                #[allow(unused_variables)]
                impl<'de, M, A, T> $crate::de::DecodeSliceBuilder<T, A> for Builder<'de, M, A, T>
                where
                    T: $crate::de::Decode<'de, M, A>,
                    A: $crate::alloc::Allocator,
                {
                    #[inline]
                    fn new<C>($cx: C) -> Result<Self, C::Error>
                    where
                        C: $crate::Context<Allocator = A>,
                    {
                        Ok(Builder {
                            vec: $new,
                            _marker: core::marker::PhantomData
                        })
                    }

                    #[inline]
                    fn with_capacity<C>($cx: C, $capacity: usize) -> Result<Self, C::Error>
                    where
                        C: $crate::Context<Allocator = A>,
                    {
                        Ok(Builder {
                            vec: $with_capacity,
                            _marker: core::marker::PhantomData
                        })
                    }

                    #[inline]
                    fn push<C>(&mut self, $cx: C, $value: T) -> Result<(), C::Error>
                    where
                        C: $crate::Context<Allocator = A>,
                    {
                        let $vec = &mut self.vec;
                        $insert;
                        Ok(())
                    }

                    #[inline]
                    fn reserve<C>( &mut self, $cx: C, $reserve_capacity: usize) -> Result<(), C::Error>
                    where
                        C: $crate::Context<Allocator = A>,
                    {
                        let $reserve_vec = &mut self.vec;
                        $reserve;
                        Ok(())
                    }

                    #[inline]
                    unsafe fn set_len(&mut self, len: usize) {
                        self.vec.set_len(len);
                    }

                    #[inline]
                    fn as_mut_ptr(&mut self) -> *mut T {
                        self.vec.as_mut_ptr()
                    }
                }

                let Builder { vec, _marker: core::marker::PhantomData } = decoder.decode_slice()?;
                Ok(vec)
            }
        }

        $(#[$($meta)*])*
        impl<M, T $(, $alloc)*> $crate::en::EncodePacked<M> for $ty<T $(, $alloc)*>
        where
            T: $crate::en::Encode<M>,
            $($alloc: $crate::alloc::Allocator,)*
        {
            #[inline]
            fn encode_packed<E>(&self, encoder: E) -> Result<(), E::Error>
            where
                E: $crate::en::Encoder<Mode = M>,
            {
                encoder.encode_pack_fn(|pack| {
                    $crate::en::SequenceEncoder::encode_slice(pack, self)
                })
            }
        }
    }
}

pub(crate) use __slice_sequence as slice_sequence;
