1use super::vecs::{MutableZeroVecLike, ZeroVecLike};
6use crate::ule::vartuple::VarTupleULE;
7use crate::ule::*;
8use crate::vecs::{VarZeroSlice, VarZeroVec};
9use crate::zerovec::{ZeroSlice, ZeroVec};
10use alloc::boxed::Box;
11
12pub trait ZeroMapKV<'a> {
19 type Container: MutableZeroVecLike<
21 'a,
22 Self,
23 SliceVariant = Self::Slice,
24 GetType = Self::GetType,
25 OwnedType = Self::OwnedType,
26 > + Sized;
27 type Slice: ZeroVecLike<Self, GetType = Self::GetType> + ?Sized;
28 type GetType: ?Sized + 'static;
33 type OwnedType: 'static;
41}
42
43macro_rules! impl_sized_kv {
44 ($ty:path) => {
45 impl<'a> ZeroMapKV<'a> for $ty {
46 type Container = ZeroVec<'a, $ty>;
47 type Slice = ZeroSlice<$ty>;
48 type GetType = <$ty as AsULE>::ULE;
49 type OwnedType = $ty;
50 }
51 };
52}
53
54impl<'a> ZeroMapKV<'a> for u8 {
type Container = ZeroVec<'a, u8>;
type Slice = ZeroSlice<u8>;
type GetType = <u8 as AsULE>::ULE;
type OwnedType = u8;
}impl_sized_kv!(u8);
55impl<'a> ZeroMapKV<'a> for u16 {
type Container = ZeroVec<'a, u16>;
type Slice = ZeroSlice<u16>;
type GetType = <u16 as AsULE>::ULE;
type OwnedType = u16;
}impl_sized_kv!(u16);
56impl<'a> ZeroMapKV<'a> for u32 {
type Container = ZeroVec<'a, u32>;
type Slice = ZeroSlice<u32>;
type GetType = <u32 as AsULE>::ULE;
type OwnedType = u32;
}impl_sized_kv!(u32);
57impl<'a> ZeroMapKV<'a> for u64 {
type Container = ZeroVec<'a, u64>;
type Slice = ZeroSlice<u64>;
type GetType = <u64 as AsULE>::ULE;
type OwnedType = u64;
}impl_sized_kv!(u64);
58impl<'a> ZeroMapKV<'a> for u128 {
type Container = ZeroVec<'a, u128>;
type Slice = ZeroSlice<u128>;
type GetType = <u128 as AsULE>::ULE;
type OwnedType = u128;
}impl_sized_kv!(u128);
59impl<'a> ZeroMapKV<'a> for i8 {
type Container = ZeroVec<'a, i8>;
type Slice = ZeroSlice<i8>;
type GetType = <i8 as AsULE>::ULE;
type OwnedType = i8;
}impl_sized_kv!(i8);
60impl<'a> ZeroMapKV<'a> for i16 {
type Container = ZeroVec<'a, i16>;
type Slice = ZeroSlice<i16>;
type GetType = <i16 as AsULE>::ULE;
type OwnedType = i16;
}impl_sized_kv!(i16);
61impl<'a> ZeroMapKV<'a> for i32 {
type Container = ZeroVec<'a, i32>;
type Slice = ZeroSlice<i32>;
type GetType = <i32 as AsULE>::ULE;
type OwnedType = i32;
}impl_sized_kv!(i32);
62impl<'a> ZeroMapKV<'a> for i64 {
type Container = ZeroVec<'a, i64>;
type Slice = ZeroSlice<i64>;
type GetType = <i64 as AsULE>::ULE;
type OwnedType = i64;
}impl_sized_kv!(i64);
63impl<'a> ZeroMapKV<'a> for i128 {
type Container = ZeroVec<'a, i128>;
type Slice = ZeroSlice<i128>;
type GetType = <i128 as AsULE>::ULE;
type OwnedType = i128;
}impl_sized_kv!(i128);
64impl<'a> ZeroMapKV<'a> for char {
type Container = ZeroVec<'a, char>;
type Slice = ZeroSlice<char>;
type GetType = <char as AsULE>::ULE;
type OwnedType = char;
}impl_sized_kv!(char);
65impl<'a> ZeroMapKV<'a> for f32 {
type Container = ZeroVec<'a, f32>;
type Slice = ZeroSlice<f32>;
type GetType = <f32 as AsULE>::ULE;
type OwnedType = f32;
}impl_sized_kv!(f32);
66impl<'a> ZeroMapKV<'a> for f64 {
type Container = ZeroVec<'a, f64>;
type Slice = ZeroSlice<f64>;
type GetType = <f64 as AsULE>::ULE;
type OwnedType = f64;
}impl_sized_kv!(f64);
67
68impl<'a> ZeroMapKV<'a> for core::num::NonZeroU8 {
type Container = ZeroVec<'a, core::num::NonZeroU8>;
type Slice = ZeroSlice<core::num::NonZeroU8>;
type GetType = <core::num::NonZeroU8 as AsULE>::ULE;
type OwnedType = core::num::NonZeroU8;
}impl_sized_kv!(core::num::NonZeroU8);
69impl<'a> ZeroMapKV<'a> for core::num::NonZeroI8 {
type Container = ZeroVec<'a, core::num::NonZeroI8>;
type Slice = ZeroSlice<core::num::NonZeroI8>;
type GetType = <core::num::NonZeroI8 as AsULE>::ULE;
type OwnedType = core::num::NonZeroI8;
}impl_sized_kv!(core::num::NonZeroI8);
70
71impl<'a, T> ZeroMapKV<'a> for Option<T>
72where
73 Option<T>: AsULE + 'static,
74{
75 type Container = ZeroVec<'a, Option<T>>;
76 type Slice = ZeroSlice<Option<T>>;
77 type GetType = <Option<T> as AsULE>::ULE;
78 type OwnedType = Option<T>;
79}
80
81impl<'a, T> ZeroMapKV<'a> for OptionVarULE<T>
82where
83 T: VarULE + ?Sized,
84{
85 type Container = VarZeroVec<'a, OptionVarULE<T>>;
86 type Slice = VarZeroSlice<OptionVarULE<T>>;
87 type GetType = OptionVarULE<T>;
88 type OwnedType = Box<OptionVarULE<T>>;
89}
90
91impl<'a, A, B> ZeroMapKV<'a> for VarTupleULE<A, B>
92where
93 A: AsULE + 'static,
94 B: VarULE + ?Sized,
95{
96 type Container = VarZeroVec<'a, VarTupleULE<A, B>>;
97 type Slice = VarZeroSlice<VarTupleULE<A, B>>;
98 type GetType = VarTupleULE<A, B>;
99 type OwnedType = Box<VarTupleULE<A, B>>;
100}
101
102impl<'a> ZeroMapKV<'a> for str {
103 type Container = VarZeroVec<'a, str>;
104 type Slice = VarZeroSlice<str>;
105 type GetType = str;
106 type OwnedType = Box<str>;
107}
108
109impl<'a, T> ZeroMapKV<'a> for [T]
110where
111 T: ULE + AsULE<ULE = T>,
112{
113 type Container = VarZeroVec<'a, [T]>;
114 type Slice = VarZeroSlice<[T]>;
115 type GetType = [T];
116 type OwnedType = Box<[T]>;
117}
118
119impl<'a, T, const N: usize> ZeroMapKV<'a> for [T; N]
120where
121 T: AsULE + 'static,
122{
123 type Container = ZeroVec<'a, [T; N]>;
124 type Slice = ZeroSlice<[T; N]>;
125 type GetType = [T::ULE; N];
126 type OwnedType = [T; N];
127}
128
129impl<'a, T> ZeroMapKV<'a> for ZeroSlice<T>
130where
131 T: AsULE + 'static,
132{
133 type Container = VarZeroVec<'a, ZeroSlice<T>>;
134 type Slice = VarZeroSlice<ZeroSlice<T>>;
135 type GetType = ZeroSlice<T>;
136 type OwnedType = Box<ZeroSlice<T>>;
137}