//! Implements actual generic array abstraction for all supported types from `typenum` (1 to 255) use typenum::*; macro_rules! impl_generic_array { ($($type: ty),*) => { $( impl private::Sealed for $type {} impl Capacity for $type { type Array = [u8; Self::USIZE]; } impl private::Sealed for <$type as Capacity>::Array {} impl ArraySlice for <$type as Capacity>::Array { const CAPACITY: usize = <$type as Unsigned>::USIZE; #[inline] fn as_slice(&self) -> &[u8] { self } #[inline] unsafe fn as_mut_slice(&mut self) -> &mut [u8] { self } #[inline] fn zeroed() -> Self { [0; Self::CAPACITY] } } )* } } /// Private module to hide access to sealed trait mod private { /// Trait impossible to be implemented outside of this crate, seals other traits pub trait Sealed {} } /// Implements needed types for all types of arrays (bigger than 32 don't have the default traits) #[doc(hidden)] pub trait ArraySlice: private::Sealed { /// Capacity represented by type const CAPACITY: usize; /// Returns slice of the entire array fn as_slice(&self) -> &[u8]; /// Returns mutable slice of the entire array unsafe fn as_mut_slice(&mut self) -> &mut [u8]; /// Returns array filled with zeroes fn zeroed() -> Self; } /// Converts between `typenum` types and its corresponding array #[doc(hidden)] pub trait Capacity: Unsigned + private::Sealed { /// Array with specified capacity type Array: ArraySlice + Copy; } impl_generic_array!( U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12, U13, U14, U15, U16, U17, U18, U19, U20, U21, U22, U23, U24, U25, U26, U27, U28, U29, U30, U31, U32, U33, U34, U35, U36, U37, U38, U39, U40, U41, U42, U43, U44, U45, U46, U47, U48, U49, U50, U51, U52, U53, U54, U55, U56, U57, U58, U59, U60, U61, U62, U63, U64, U65, U66, U67, U68, U69, U70, U71, U72, U73, U74, U75, U76, U77, U78, U79, U80, U81, U82, U83, U84, U85, U86, U87, U88, U89, U90, U91, U92, U93, U94, U95, U96, U97, U98, U99, U100, U101, U102, U103, U104, U105, U106, U107, U108, U109, U110, U111, U112, U113, U114, U115, U116, U117, U118, U119, U120, U121, U122, U123, U124, U125, U126, U127, U128, U129, U130, U131, U132, U133, U134, U135, U136, U137, U138, U139, U140, U141, U142, U143, U144, U145, U146, U147, U148, U149, U150, U151, U152, U153, U154, U155, U156, U157, U158, U159, U160, U161, U162, U163, U164, U165, U166, U167, U168, U169, U170, U171, U172, U173, U174, U178, U179, U180, U181, U182, U183, U184, U185, U186, U187, U188, U189, U190, U191, U192, U193, U194, U195, U196, U197, U198, U199, U200, U201, U202, U203, U204, U205, U206, U207, U208, U209, U210, U211, U212, U213, U214, U215, U216, U217, U218, U219, U220, U221, U222, U223, U224, U225, U226, U227, U228, U229, U230, U231, U232, U233, U234, U235, U236, U237, U238, U239, U240, U241, U242, U243, U244, U245, U246, U247, U248, U249, U250, U251, U252, U253, U254, U255 );