1use core::hint::unreachable_unchecked;
8use core::marker::PhantomData;
9use core::mem::MaybeUninit;
10
11use crate::{Constrained, Encodable, Encode, EncodeError, Unconstrained, Wire};
12
13pub enum Never {}
15
16impl Unconstrained for Never {}
17
18pub struct EncodableNever<W> {
20 _never: Never,
21 _phantom: PhantomData<W>,
22}
23
24impl<W: Wire + Constrained> Encodable for EncodableNever<W> {
25 type Encoded = W;
26}
27
28unsafe impl<E: ?Sized, W: Wire + Constrained> Encode<E> for EncodableNever<W> {
29 fn encode(
30 self,
31 _: &mut E,
32 _: &mut MaybeUninit<Self::Encoded>,
33 _: W::Constraint,
34 ) -> Result<(), EncodeError> {
35 unsafe { unreachable_unchecked() }
38 }
39}