object_rainbow/impls/
array.rs1use std::ops::Mul;
2
3use typenum::ToUInt;
4
5use crate::{
6 sequence::{PlainCollection, VecLike},
7 *,
8};
9
10impl<T: InlineOutput, const N: usize> ToOutput for [T; N] {
11 fn to_output(&self, output: &mut impl Output) {
12 T::slice_to_output(self, output);
13 }
14}
15
16impl<T: InlineOutput, const N: usize> InlineOutput for [T; N] {}
17
18impl<T: ListHashes, const N: usize> ListHashes for [T; N] {
19 fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
20 self.iter_list_hashes(f);
21 }
22}
23
24impl<T: Topological, const N: usize> Topological for [T; N] {
25 fn traverse(&self, visitor: &mut impl PointVisitor) {
26 self.iter_traverse(visitor);
27 }
28}
29
30impl<T: Tagged, const N: usize> Tagged for [T; N] {
31 const TAGS: Tags = T::TAGS;
32}
33
34impl<T: Size, const N: usize> Size for [T; N]
35where
36 typenum::generic_const_mappings::Const<N>:
37 ToUInt<Output: Unsigned + Mul<T::Size, Output: Unsigned>>,
38{
39 const SIZE: usize = T::SIZE * N;
40 type Size =
41 <<typenum::generic_const_mappings::Const<N> as ToUInt>::Output as Mul<T::Size>>::Output;
42}
43
44impl<T: ParseInline<I>, const N: usize, I: ParseInput> Parse<I> for [T; N] {
45 fn parse(input: I) -> crate::Result<Self> {
46 ParseInline::parse_as_inline(input)
47 }
48}
49
50impl<T: ParseInline<I>, const N: usize, I: ParseInput> ParseInline<I> for [T; N] {
51 fn parse_inline(input: &mut I) -> crate::Result<Self> {
52 input.parse_array()
53 }
54}
55
56impl<T: ByteOrd + InlineOutput, const N: usize> ByteOrd for [T; N] {
57 fn bytes_cmp(&self, other: &Self) -> Ordering {
58 self.iter_bytes_cmp(other)
59 }
60}
61
62impl<T, const N: usize> MaybeHasNiche for [T; N]
63where
64 typenum::generic_const_mappings::Const<N>: ToUInt<Output: ArrayLength>,
65 GenericArray<T, <typenum::generic_const_mappings::Const<N> as ToUInt>::Output>: MaybeHasNiche,
66{
67 type MnArray =
68 <GenericArray<T, <typenum::generic_const_mappings::Const<N> as ToUInt>::Output> as MaybeHasNiche>::MnArray;
69}
70
71#[test]
72fn byte_array_niche() {
73 assert_eq!(
74 None::<(GenericArray<u8, typenum::U2>, bool)>.vec(),
75 [0, 0, 2],
76 );
77 assert_eq!(None::<([u8; 2], bool)>.vec(), [0, 0, 2]);
78}
79
80impl<T, const N: usize> PlainCollection for [T; N] {}
81impl<T, const N: usize> VecLike for [T; N] {}