1use super::*;
15use crate::varzerovec::{Index16, VarZeroVecFormat};
16use core::fmt;
17use core::marker::PhantomData;
18use core::mem;
19use zerofrom::ZeroFrom;
20
21macro_rules! tuple_varule {
22 ($name:ident, $len:literal, [ $($T:ident $t:ident $T_alt: ident $i:tt),+ ]) => {
30 #[doc = concat!("VarULE type for tuples with ", $len, " elements. See module docs for more information")]
31 #[repr(transparent)]
32 #[allow(clippy::exhaustive_structs)] pub struct $name<$($T: ?Sized,)+ Format: VarZeroVecFormat = Index16> {
34 $($t: PhantomData<$T>,)+
35 multi: MultiFieldsULE<$len, Format>
41 }
42
43 impl<$($T: VarULE + ?Sized,)+ Format: VarZeroVecFormat> $name<$($T,)+ Format> {
44 $(
45 #[doc = concat!("Get field ", $i, "of this tuple")]
46 pub fn $t(&self) -> &$T {
47 unsafe {
49 self.multi.get_field::<$T>($i)
50 }
51 }
52
53
54 )+
55 }
56
57 unsafe impl<$($T: VarULE + ?Sized,)+ Format: VarZeroVecFormat> VarULE for $name<$($T,)+ Format>
71 {
72 fn validate_bytes(bytes: &[u8]) -> Result<(), UleError> {
73 let multi = <MultiFieldsULE<$len, Format> as VarULE>::parse_bytes(bytes)?;
76 $(
77 unsafe {
79 multi.validate_field::<$T>($i)?;
80 }
81 )+
82 Ok(())
83 }
84
85 unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
86 let multi = <MultiFieldsULE<$len, Format> as VarULE>::from_bytes_unchecked(bytes);
89
90 mem::transmute::<&MultiFieldsULE<$len, Format>, &Self>(multi)
93 }
94 }
95
96 impl<$($T: fmt::Debug + VarULE + ?Sized,)+ Format: VarZeroVecFormat> fmt::Debug for $name<$($T,)+ Format> {
97 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
98 ($(self.$t(),)+).fmt(f)
99 }
100 }
101
102 impl<$($T: PartialEq + VarULE + ?Sized,)+ Format: VarZeroVecFormat> PartialEq for $name<$($T,)+ Format> {
104 fn eq(&self, other: &Self) -> bool {
105
106 ($(self.$t(),)+).eq(&($(other.$t(),)+))
107 }
108 }
109
110 impl<$($T: Eq + VarULE + ?Sized,)+ Format: VarZeroVecFormat> Eq for $name<$($T,)+ Format> {}
111
112 impl<$($T: PartialOrd + VarULE + ?Sized,)+ Format: VarZeroVecFormat> PartialOrd for $name<$($T,)+ Format> {
113 fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
114 ($(self.$t(),)+).partial_cmp(&($(other.$t(),)+))
115 }
116 }
117
118 impl<$($T: Ord + VarULE + ?Sized,)+ Format: VarZeroVecFormat> Ord for $name<$($T,)+ Format> {
119 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
120 ($(self.$t(),)+).cmp(&($(other.$t(),)+))
121 }
122 }
123
124 unsafe impl<$($T,)+ $($T_alt,)+ Format> EncodeAsVarULE<$name<$($T,)+ Format>> for ( $($T_alt),+ )
130 where
131 $($T: VarULE + ?Sized,)+
132 $($T_alt: EncodeAsVarULE<$T>,)+
133 Format: VarZeroVecFormat,
134 {
135 fn encode_var_ule_as_slices<R>(&self, _: impl FnOnce(&[&[u8]]) -> R) -> R {
136 unreachable!()
138 }
139
140 #[inline]
141 fn encode_var_ule_len(&self) -> usize {
142 MultiFieldsULE::<$len, Format>::compute_encoded_len_for([$(self.$i.encode_var_ule_len()),+])
145 }
146
147 #[inline]
148 fn encode_var_ule_write(&self, dst: &mut [u8]) {
149 let lengths = [$(self.$i.encode_var_ule_len()),+];
150 let multi = MultiFieldsULE::<$len, Format>::new_from_lengths_partially_initialized(lengths, dst);
153 $(
154 unsafe {
156 multi.set_field_at::<$T, $T_alt>($i, &self.$i);
157 }
158 )+
159 }
160 }
161
162 #[cfg(feature = "alloc")]
163 impl<$($T: VarULE + ?Sized,)+ Format: VarZeroVecFormat> alloc::borrow::ToOwned for $name<$($T,)+ Format> {
164 type Owned = alloc::boxed::Box<Self>;
165 fn to_owned(&self) -> Self::Owned {
166 encode_varule_to_box(self)
167 }
168 }
169
170 impl<'a, $($T,)+ $($T_alt,)+ Format> ZeroFrom <'a, $name<$($T,)+ Format>> for ($($T_alt),+)
171 where
172 $($T: VarULE + ?Sized,)+
173 $($T_alt: ZeroFrom<'a, $T>,)+
174 Format: VarZeroVecFormat {
175 fn zero_from(other: &'a $name<$($T,)+ Format>) -> Self {
176 (
177 $($T_alt::zero_from(other.$t()),)+
178 )
179 }
180 }
181
182 #[cfg(feature = "serde")]
183 impl<$($T: serde::Serialize,)+ Format> serde::Serialize for $name<$($T,)+ Format>
184 where
185 $($T: VarULE + ?Sized,)+
186 $(for<'a> &'a $T: ZeroFrom<'a, $T>,)+
188 Format: VarZeroVecFormat
189 {
190 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer {
191 if serializer.is_human_readable() {
192 let this = (
193 $(self.$t()),+
194 );
195 <($(&$T),+) as serde::Serialize>::serialize(&this, serializer)
196 } else {
197 serializer.serialize_bytes(self.multi.as_bytes())
198 }
199 }
200 }
201
202 #[cfg(feature = "serde")]
203 impl<'de, $($T: VarULE + ?Sized,)+ Format> serde::Deserialize<'de> for alloc::boxed::Box<$name<$($T,)+ Format>>
204 where
205 $( alloc::boxed::Box<$T>: serde::Deserialize<'de>,)+
207 Format: VarZeroVecFormat {
208 fn deserialize<Des>(deserializer: Des) -> Result<Self, Des::Error> where Des: serde::Deserializer<'de> {
209 if deserializer.is_human_readable() {
210 let this = <( $(alloc::boxed::Box<$T>),+) as serde::Deserialize>::deserialize(deserializer)?;
211 let this_ref = (
212 $(&*this.$i),+
213 );
214 Ok(crate::ule::encode_varule_to_box(&this_ref))
215 } else {
216 let deserialized = <&$name<$($T,)+ Format>>::deserialize(deserializer)?;
219 Ok(deserialized.to_boxed())
220 }
221 }
222 }
223
224 #[cfg(feature = "serde")]
225 impl<'a, 'de: 'a, $($T: VarULE + ?Sized,)+ Format: VarZeroVecFormat> serde::Deserialize<'de> for &'a $name<$($T,)+ Format> {
226 fn deserialize<Des>(deserializer: Des) -> Result<Self, Des::Error> where Des: serde::Deserializer<'de> {
227 if deserializer.is_human_readable() {
228 Err(serde::de::Error::custom(
229 concat!("&", stringify!($name), " can only deserialize in zero-copy ways"),
230 ))
231 } else {
232 let bytes = <&[u8]>::deserialize(deserializer)?;
233 $name::<$($T,)+ Format>::parse_bytes(bytes).map_err(serde::de::Error::custom)
234 }
235 }
236 }
237 };
238}
239
240#[doc =
"VarULE type for tuples with 2 elements. See module docs for more information"]
#[repr(transparent)]
#[allow(clippy :: exhaustive_structs)]
pub struct Tuple2VarULE<A: ?Sized, B: ?Sized, Format: VarZeroVecFormat =
Index16> {
a: PhantomData<A>,
b: PhantomData<B>,
multi: MultiFieldsULE<2, Format>,
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, Format: VarZeroVecFormat>
Tuple2VarULE<A, B, Format> {
#[doc = "Get field 0of this tuple"]
pub fn a(&self) -> &A { unsafe { self.multi.get_field::<A>(0) } }
#[doc = "Get field 1of this tuple"]
pub fn b(&self) -> &B { unsafe { self.multi.get_field::<B>(1) } }
}
unsafe impl<A: VarULE + ?Sized, B: VarULE + ?Sized, Format: VarZeroVecFormat>
VarULE for Tuple2VarULE<A, B, Format> {
fn validate_bytes(bytes: &[u8]) -> Result<(), UleError> {
let multi =
<MultiFieldsULE<2, Format> as VarULE>::parse_bytes(bytes)?;
unsafe { multi.validate_field::<A>(0)?; }
unsafe { multi.validate_field::<B>(1)?; }
Ok(())
}
unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
let multi =
<MultiFieldsULE<2, Format> as
VarULE>::from_bytes_unchecked(bytes);
mem::transmute::<&MultiFieldsULE<2, Format>, &Self>(multi)
}
}
impl<A: fmt::Debug + VarULE + ?Sized, B: fmt::Debug + VarULE + ?Sized,
Format: VarZeroVecFormat> fmt::Debug for Tuple2VarULE<A, B, Format> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
(self.a(), self.b()).fmt(f)
}
}
impl<A: PartialEq + VarULE + ?Sized, B: PartialEq + VarULE + ?Sized,
Format: VarZeroVecFormat> PartialEq for Tuple2VarULE<A, B, Format> {
fn eq(&self, other: &Self) -> bool {
(self.a(), self.b()).eq(&(other.a(), other.b()))
}
}
impl<A: Eq + VarULE + ?Sized, B: Eq + VarULE + ?Sized,
Format: VarZeroVecFormat> Eq for Tuple2VarULE<A, B, Format> {}
impl<A: PartialOrd + VarULE + ?Sized, B: PartialOrd + VarULE + ?Sized,
Format: VarZeroVecFormat> PartialOrd for Tuple2VarULE<A, B, Format> {
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
(self.a(), self.b()).partial_cmp(&(other.a(), other.b()))
}
}
impl<A: Ord + VarULE + ?Sized, B: Ord + VarULE + ?Sized,
Format: VarZeroVecFormat> Ord for Tuple2VarULE<A, B, Format> {
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
(self.a(), self.b()).cmp(&(other.a(), other.b()))
}
}
unsafe impl<A, B, AE, BE, Format> EncodeAsVarULE<Tuple2VarULE<A, B, Format>>
for (AE, BE) where A: VarULE + ?Sized, B: VarULE + ?Sized,
AE: EncodeAsVarULE<A>, BE: EncodeAsVarULE<B>, Format: VarZeroVecFormat {
fn encode_var_ule_as_slices<R>(&self, _: impl FnOnce(&[&[u8]]) -> R)
-> R {
::core::panicking::panic("internal error: entered unreachable code")
}
#[inline]
fn encode_var_ule_len(&self) -> usize {
MultiFieldsULE::<2,
Format>::compute_encoded_len_for([self.0.encode_var_ule_len(),
self.1.encode_var_ule_len()])
}
#[inline]
fn encode_var_ule_write(&self, dst: &mut [u8]) {
let lengths =
[self.0.encode_var_ule_len(), self.1.encode_var_ule_len()];
let multi =
MultiFieldsULE::<2,
Format>::new_from_lengths_partially_initialized(lengths,
dst);
unsafe { multi.set_field_at::<A, AE>(0, &self.0); }
unsafe { multi.set_field_at::<B, BE>(1, &self.1); }
}
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, Format: VarZeroVecFormat>
alloc::borrow::ToOwned for Tuple2VarULE<A, B, Format> {
type Owned = alloc::boxed::Box<Self>;
fn to_owned(&self) -> Self::Owned { encode_varule_to_box(self) }
}
impl<'a, A, B, AE, BE, Format> ZeroFrom<'a, Tuple2VarULE<A, B, Format>> for
(AE, BE) where A: VarULE + ?Sized, B: VarULE + ?Sized,
AE: ZeroFrom<'a, A>, BE: ZeroFrom<'a, B>, Format: VarZeroVecFormat {
fn zero_from(other: &'a Tuple2VarULE<A, B, Format>) -> Self {
(AE::zero_from(other.a()), BE::zero_from(other.b()))
}
}tuple_varule!(Tuple2VarULE, 2, [ A a AE 0, B b BE 1 ]);
241#[doc =
"VarULE type for tuples with 3 elements. See module docs for more information"]
#[repr(transparent)]
#[allow(clippy :: exhaustive_structs)]
pub struct Tuple3VarULE<A: ?Sized, B: ?Sized, C: ?Sized,
Format: VarZeroVecFormat = Index16> {
a: PhantomData<A>,
b: PhantomData<B>,
c: PhantomData<C>,
multi: MultiFieldsULE<3, Format>,
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
Format: VarZeroVecFormat> Tuple3VarULE<A, B, C, Format> {
#[doc = "Get field 0of this tuple"]
pub fn a(&self) -> &A { unsafe { self.multi.get_field::<A>(0) } }
#[doc = "Get field 1of this tuple"]
pub fn b(&self) -> &B { unsafe { self.multi.get_field::<B>(1) } }
#[doc = "Get field 2of this tuple"]
pub fn c(&self) -> &C { unsafe { self.multi.get_field::<C>(2) } }
}
unsafe impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
Format: VarZeroVecFormat> VarULE for Tuple3VarULE<A, B, C, Format> {
fn validate_bytes(bytes: &[u8]) -> Result<(), UleError> {
let multi =
<MultiFieldsULE<3, Format> as VarULE>::parse_bytes(bytes)?;
unsafe { multi.validate_field::<A>(0)?; }
unsafe { multi.validate_field::<B>(1)?; }
unsafe { multi.validate_field::<C>(2)?; }
Ok(())
}
unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
let multi =
<MultiFieldsULE<3, Format> as
VarULE>::from_bytes_unchecked(bytes);
mem::transmute::<&MultiFieldsULE<3, Format>, &Self>(multi)
}
}
impl<A: fmt::Debug + VarULE + ?Sized, B: fmt::Debug + VarULE + ?Sized,
C: fmt::Debug + VarULE + ?Sized, Format: VarZeroVecFormat> fmt::Debug for
Tuple3VarULE<A, B, C, Format> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
(self.a(), self.b(), self.c()).fmt(f)
}
}
impl<A: PartialEq + VarULE + ?Sized, B: PartialEq + VarULE + ?Sized,
C: PartialEq + VarULE + ?Sized, Format: VarZeroVecFormat> PartialEq for
Tuple3VarULE<A, B, C, Format> {
fn eq(&self, other: &Self) -> bool {
(self.a(), self.b(), self.c()).eq(&(other.a(), other.b(), other.c()))
}
}
impl<A: Eq + VarULE + ?Sized, B: Eq + VarULE + ?Sized, C: Eq + VarULE +
?Sized, Format: VarZeroVecFormat> Eq for Tuple3VarULE<A, B, C, Format> {}
impl<A: PartialOrd + VarULE + ?Sized, B: PartialOrd + VarULE + ?Sized,
C: PartialOrd + VarULE + ?Sized, Format: VarZeroVecFormat> PartialOrd for
Tuple3VarULE<A, B, C, Format> {
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
(self.a(), self.b(),
self.c()).partial_cmp(&(other.a(), other.b(), other.c()))
}
}
impl<A: Ord + VarULE + ?Sized, B: Ord + VarULE + ?Sized, C: Ord + VarULE +
?Sized, Format: VarZeroVecFormat> Ord for Tuple3VarULE<A, B, C, Format> {
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
(self.a(), self.b(), self.c()).cmp(&(other.a(), other.b(), other.c()))
}
}
unsafe impl<A, B, C, AE, BE, CE, Format>
EncodeAsVarULE<Tuple3VarULE<A, B, C, Format>> for (AE, BE, CE) where
A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
AE: EncodeAsVarULE<A>, BE: EncodeAsVarULE<B>, CE: EncodeAsVarULE<C>,
Format: VarZeroVecFormat {
fn encode_var_ule_as_slices<R>(&self, _: impl FnOnce(&[&[u8]]) -> R)
-> R {
::core::panicking::panic("internal error: entered unreachable code")
}
#[inline]
fn encode_var_ule_len(&self) -> usize {
MultiFieldsULE::<3,
Format>::compute_encoded_len_for([self.0.encode_var_ule_len(),
self.1.encode_var_ule_len(), self.2.encode_var_ule_len()])
}
#[inline]
fn encode_var_ule_write(&self, dst: &mut [u8]) {
let lengths =
[self.0.encode_var_ule_len(), self.1.encode_var_ule_len(),
self.2.encode_var_ule_len()];
let multi =
MultiFieldsULE::<3,
Format>::new_from_lengths_partially_initialized(lengths,
dst);
unsafe { multi.set_field_at::<A, AE>(0, &self.0); }
unsafe { multi.set_field_at::<B, BE>(1, &self.1); }
unsafe { multi.set_field_at::<C, CE>(2, &self.2); }
}
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
Format: VarZeroVecFormat> alloc::borrow::ToOwned for
Tuple3VarULE<A, B, C, Format> {
type Owned = alloc::boxed::Box<Self>;
fn to_owned(&self) -> Self::Owned { encode_varule_to_box(self) }
}
impl<'a, A, B, C, AE, BE, CE, Format>
ZeroFrom<'a, Tuple3VarULE<A, B, C, Format>> for (AE, BE, CE) where
A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
AE: ZeroFrom<'a, A>, BE: ZeroFrom<'a, B>, CE: ZeroFrom<'a, C>,
Format: VarZeroVecFormat {
fn zero_from(other: &'a Tuple3VarULE<A, B, C, Format>) -> Self {
(AE::zero_from(other.a()), BE::zero_from(other.b()),
CE::zero_from(other.c()))
}
}tuple_varule!(Tuple3VarULE, 3, [ A a AE 0, B b BE 1, C c CE 2 ]);
242#[doc =
"VarULE type for tuples with 4 elements. See module docs for more information"]
#[repr(transparent)]
#[allow(clippy :: exhaustive_structs)]
pub struct Tuple4VarULE<A: ?Sized, B: ?Sized, C: ?Sized, D: ?Sized,
Format: VarZeroVecFormat = Index16> {
a: PhantomData<A>,
b: PhantomData<B>,
c: PhantomData<C>,
d: PhantomData<D>,
multi: MultiFieldsULE<4, Format>,
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized, D: VarULE +
?Sized, Format: VarZeroVecFormat> Tuple4VarULE<A, B, C, D, Format> {
#[doc = "Get field 0of this tuple"]
pub fn a(&self) -> &A { unsafe { self.multi.get_field::<A>(0) } }
#[doc = "Get field 1of this tuple"]
pub fn b(&self) -> &B { unsafe { self.multi.get_field::<B>(1) } }
#[doc = "Get field 2of this tuple"]
pub fn c(&self) -> &C { unsafe { self.multi.get_field::<C>(2) } }
#[doc = "Get field 3of this tuple"]
pub fn d(&self) -> &D { unsafe { self.multi.get_field::<D>(3) } }
}
unsafe impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
D: VarULE + ?Sized, Format: VarZeroVecFormat> VarULE for
Tuple4VarULE<A, B, C, D, Format> {
fn validate_bytes(bytes: &[u8]) -> Result<(), UleError> {
let multi =
<MultiFieldsULE<4, Format> as VarULE>::parse_bytes(bytes)?;
unsafe { multi.validate_field::<A>(0)?; }
unsafe { multi.validate_field::<B>(1)?; }
unsafe { multi.validate_field::<C>(2)?; }
unsafe { multi.validate_field::<D>(3)?; }
Ok(())
}
unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
let multi =
<MultiFieldsULE<4, Format> as
VarULE>::from_bytes_unchecked(bytes);
mem::transmute::<&MultiFieldsULE<4, Format>, &Self>(multi)
}
}
impl<A: fmt::Debug + VarULE + ?Sized, B: fmt::Debug + VarULE + ?Sized,
C: fmt::Debug + VarULE + ?Sized, D: fmt::Debug + VarULE + ?Sized,
Format: VarZeroVecFormat> fmt::Debug for Tuple4VarULE<A, B, C, D, Format>
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
(self.a(), self.b(), self.c(), self.d()).fmt(f)
}
}
impl<A: PartialEq + VarULE + ?Sized, B: PartialEq + VarULE + ?Sized,
C: PartialEq + VarULE + ?Sized, D: PartialEq + VarULE + ?Sized,
Format: VarZeroVecFormat> PartialEq for Tuple4VarULE<A, B, C, D, Format> {
fn eq(&self, other: &Self) -> bool {
(self.a(), self.b(), self.c(),
self.d()).eq(&(other.a(), other.b(), other.c(), other.d()))
}
}
impl<A: Eq + VarULE + ?Sized, B: Eq + VarULE + ?Sized, C: Eq + VarULE +
?Sized, D: Eq + VarULE + ?Sized, Format: VarZeroVecFormat> Eq for
Tuple4VarULE<A, B, C, D, Format> {}
impl<A: PartialOrd + VarULE + ?Sized, B: PartialOrd + VarULE + ?Sized,
C: PartialOrd + VarULE + ?Sized, D: PartialOrd + VarULE + ?Sized,
Format: VarZeroVecFormat> PartialOrd for Tuple4VarULE<A, B, C, D, Format>
{
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
(self.a(), self.b(), self.c(),
self.d()).partial_cmp(&(other.a(), other.b(), other.c(),
other.d()))
}
}
impl<A: Ord + VarULE + ?Sized, B: Ord + VarULE + ?Sized, C: Ord + VarULE +
?Sized, D: Ord + VarULE + ?Sized, Format: VarZeroVecFormat> Ord for
Tuple4VarULE<A, B, C, D, Format> {
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
(self.a(), self.b(), self.c(),
self.d()).cmp(&(other.a(), other.b(), other.c(), other.d()))
}
}
unsafe impl<A, B, C, D, AE, BE, CE, DE, Format>
EncodeAsVarULE<Tuple4VarULE<A, B, C, D, Format>> for (AE, BE, CE, DE)
where A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
D: VarULE + ?Sized, AE: EncodeAsVarULE<A>, BE: EncodeAsVarULE<B>,
CE: EncodeAsVarULE<C>, DE: EncodeAsVarULE<D>, Format: VarZeroVecFormat {
fn encode_var_ule_as_slices<R>(&self, _: impl FnOnce(&[&[u8]]) -> R)
-> R {
::core::panicking::panic("internal error: entered unreachable code")
}
#[inline]
fn encode_var_ule_len(&self) -> usize {
MultiFieldsULE::<4,
Format>::compute_encoded_len_for([self.0.encode_var_ule_len(),
self.1.encode_var_ule_len(), self.2.encode_var_ule_len(),
self.3.encode_var_ule_len()])
}
#[inline]
fn encode_var_ule_write(&self, dst: &mut [u8]) {
let lengths =
[self.0.encode_var_ule_len(), self.1.encode_var_ule_len(),
self.2.encode_var_ule_len(), self.3.encode_var_ule_len()];
let multi =
MultiFieldsULE::<4,
Format>::new_from_lengths_partially_initialized(lengths,
dst);
unsafe { multi.set_field_at::<A, AE>(0, &self.0); }
unsafe { multi.set_field_at::<B, BE>(1, &self.1); }
unsafe { multi.set_field_at::<C, CE>(2, &self.2); }
unsafe { multi.set_field_at::<D, DE>(3, &self.3); }
}
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized, D: VarULE +
?Sized, Format: VarZeroVecFormat> alloc::borrow::ToOwned for
Tuple4VarULE<A, B, C, D, Format> {
type Owned = alloc::boxed::Box<Self>;
fn to_owned(&self) -> Self::Owned { encode_varule_to_box(self) }
}
impl<'a, A, B, C, D, AE, BE, CE, DE, Format>
ZeroFrom<'a, Tuple4VarULE<A, B, C, D, Format>> for (AE, BE, CE, DE) where
A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized, D: VarULE +
?Sized, AE: ZeroFrom<'a, A>, BE: ZeroFrom<'a, B>, CE: ZeroFrom<'a, C>,
DE: ZeroFrom<'a, D>, Format: VarZeroVecFormat {
fn zero_from(other: &'a Tuple4VarULE<A, B, C, D, Format>) -> Self {
(AE::zero_from(other.a()), BE::zero_from(other.b()),
CE::zero_from(other.c()), DE::zero_from(other.d()))
}
}tuple_varule!(Tuple4VarULE, 4, [ A a AE 0, B b BE 1, C c CE 2, D d DE 3 ]);
243#[doc =
"VarULE type for tuples with 5 elements. See module docs for more information"]
#[repr(transparent)]
#[allow(clippy :: exhaustive_structs)]
pub struct Tuple5VarULE<A: ?Sized, B: ?Sized, C: ?Sized, D: ?Sized, E: ?Sized,
Format: VarZeroVecFormat = Index16> {
a: PhantomData<A>,
b: PhantomData<B>,
c: PhantomData<C>,
d: PhantomData<D>,
e: PhantomData<E>,
multi: MultiFieldsULE<5, Format>,
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized, D: VarULE +
?Sized, E: VarULE + ?Sized, Format: VarZeroVecFormat>
Tuple5VarULE<A, B, C, D, E, Format> {
#[doc = "Get field 0of this tuple"]
pub fn a(&self) -> &A { unsafe { self.multi.get_field::<A>(0) } }
#[doc = "Get field 1of this tuple"]
pub fn b(&self) -> &B { unsafe { self.multi.get_field::<B>(1) } }
#[doc = "Get field 2of this tuple"]
pub fn c(&self) -> &C { unsafe { self.multi.get_field::<C>(2) } }
#[doc = "Get field 3of this tuple"]
pub fn d(&self) -> &D { unsafe { self.multi.get_field::<D>(3) } }
#[doc = "Get field 4of this tuple"]
pub fn e(&self) -> &E { unsafe { self.multi.get_field::<E>(4) } }
}
unsafe impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
D: VarULE + ?Sized, E: VarULE + ?Sized, Format: VarZeroVecFormat> VarULE
for Tuple5VarULE<A, B, C, D, E, Format> {
fn validate_bytes(bytes: &[u8]) -> Result<(), UleError> {
let multi =
<MultiFieldsULE<5, Format> as VarULE>::parse_bytes(bytes)?;
unsafe { multi.validate_field::<A>(0)?; }
unsafe { multi.validate_field::<B>(1)?; }
unsafe { multi.validate_field::<C>(2)?; }
unsafe { multi.validate_field::<D>(3)?; }
unsafe { multi.validate_field::<E>(4)?; }
Ok(())
}
unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
let multi =
<MultiFieldsULE<5, Format> as
VarULE>::from_bytes_unchecked(bytes);
mem::transmute::<&MultiFieldsULE<5, Format>, &Self>(multi)
}
}
impl<A: fmt::Debug + VarULE + ?Sized, B: fmt::Debug + VarULE + ?Sized,
C: fmt::Debug + VarULE + ?Sized, D: fmt::Debug + VarULE + ?Sized,
E: fmt::Debug + VarULE + ?Sized, Format: VarZeroVecFormat> fmt::Debug for
Tuple5VarULE<A, B, C, D, E, Format> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
(self.a(), self.b(), self.c(), self.d(), self.e()).fmt(f)
}
}
impl<A: PartialEq + VarULE + ?Sized, B: PartialEq + VarULE + ?Sized,
C: PartialEq + VarULE + ?Sized, D: PartialEq + VarULE + ?Sized,
E: PartialEq + VarULE + ?Sized, Format: VarZeroVecFormat> PartialEq for
Tuple5VarULE<A, B, C, D, E, Format> {
fn eq(&self, other: &Self) -> bool {
(self.a(), self.b(), self.c(), self.d(),
self.e()).eq(&(other.a(), other.b(), other.c(), other.d(),
other.e()))
}
}
impl<A: Eq + VarULE + ?Sized, B: Eq + VarULE + ?Sized, C: Eq + VarULE +
?Sized, D: Eq + VarULE + ?Sized, E: Eq + VarULE + ?Sized,
Format: VarZeroVecFormat> Eq for Tuple5VarULE<A, B, C, D, E, Format> {}
impl<A: PartialOrd + VarULE + ?Sized, B: PartialOrd + VarULE + ?Sized,
C: PartialOrd + VarULE + ?Sized, D: PartialOrd + VarULE + ?Sized,
E: PartialOrd + VarULE + ?Sized, Format: VarZeroVecFormat> PartialOrd for
Tuple5VarULE<A, B, C, D, E, Format> {
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
(self.a(), self.b(), self.c(), self.d(),
self.e()).partial_cmp(&(other.a(), other.b(), other.c(),
other.d(), other.e()))
}
}
impl<A: Ord + VarULE + ?Sized, B: Ord + VarULE + ?Sized, C: Ord + VarULE +
?Sized, D: Ord + VarULE + ?Sized, E: Ord + VarULE + ?Sized,
Format: VarZeroVecFormat> Ord for Tuple5VarULE<A, B, C, D, E, Format> {
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
(self.a(), self.b(), self.c(), self.d(),
self.e()).cmp(&(other.a(), other.b(), other.c(), other.d(),
other.e()))
}
}
unsafe impl<A, B, C, D, E, AE, BE, CE, DE, EE, Format>
EncodeAsVarULE<Tuple5VarULE<A, B, C, D, E, Format>> for
(AE, BE, CE, DE, EE) where A: VarULE + ?Sized, B: VarULE + ?Sized,
C: VarULE + ?Sized, D: VarULE + ?Sized, E: VarULE + ?Sized,
AE: EncodeAsVarULE<A>, BE: EncodeAsVarULE<B>, CE: EncodeAsVarULE<C>,
DE: EncodeAsVarULE<D>, EE: EncodeAsVarULE<E>, Format: VarZeroVecFormat {
fn encode_var_ule_as_slices<R>(&self, _: impl FnOnce(&[&[u8]]) -> R)
-> R {
::core::panicking::panic("internal error: entered unreachable code")
}
#[inline]
fn encode_var_ule_len(&self) -> usize {
MultiFieldsULE::<5,
Format>::compute_encoded_len_for([self.0.encode_var_ule_len(),
self.1.encode_var_ule_len(), self.2.encode_var_ule_len(),
self.3.encode_var_ule_len(), self.4.encode_var_ule_len()])
}
#[inline]
fn encode_var_ule_write(&self, dst: &mut [u8]) {
let lengths =
[self.0.encode_var_ule_len(), self.1.encode_var_ule_len(),
self.2.encode_var_ule_len(), self.3.encode_var_ule_len(),
self.4.encode_var_ule_len()];
let multi =
MultiFieldsULE::<5,
Format>::new_from_lengths_partially_initialized(lengths,
dst);
unsafe { multi.set_field_at::<A, AE>(0, &self.0); }
unsafe { multi.set_field_at::<B, BE>(1, &self.1); }
unsafe { multi.set_field_at::<C, CE>(2, &self.2); }
unsafe { multi.set_field_at::<D, DE>(3, &self.3); }
unsafe { multi.set_field_at::<E, EE>(4, &self.4); }
}
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized, D: VarULE +
?Sized, E: VarULE + ?Sized, Format: VarZeroVecFormat>
alloc::borrow::ToOwned for Tuple5VarULE<A, B, C, D, E, Format> {
type Owned = alloc::boxed::Box<Self>;
fn to_owned(&self) -> Self::Owned { encode_varule_to_box(self) }
}
impl<'a, A, B, C, D, E, AE, BE, CE, DE, EE, Format>
ZeroFrom<'a, Tuple5VarULE<A, B, C, D, E, Format>> for (AE, BE, CE, DE, EE)
where A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
D: VarULE + ?Sized, E: VarULE + ?Sized, AE: ZeroFrom<'a, A>,
BE: ZeroFrom<'a, B>, CE: ZeroFrom<'a, C>, DE: ZeroFrom<'a, D>,
EE: ZeroFrom<'a, E>, Format: VarZeroVecFormat {
fn zero_from(other: &'a Tuple5VarULE<A, B, C, D, E, Format>) -> Self {
(AE::zero_from(other.a()), BE::zero_from(other.b()),
CE::zero_from(other.c()), DE::zero_from(other.d()),
EE::zero_from(other.e()))
}
}tuple_varule!(Tuple5VarULE, 5, [ A a AE 0, B b BE 1, C c CE 2, D d DE 3, E e EE 4 ]);
244#[doc =
"VarULE type for tuples with 6 elements. See module docs for more information"]
#[repr(transparent)]
#[allow(clippy :: exhaustive_structs)]
pub struct Tuple6VarULE<A: ?Sized, B: ?Sized, C: ?Sized, D: ?Sized, E: ?Sized,
F: ?Sized, Format: VarZeroVecFormat = Index16> {
a: PhantomData<A>,
b: PhantomData<B>,
c: PhantomData<C>,
d: PhantomData<D>,
e: PhantomData<E>,
f: PhantomData<F>,
multi: MultiFieldsULE<6, Format>,
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized, D: VarULE +
?Sized, E: VarULE + ?Sized, F: VarULE + ?Sized, Format: VarZeroVecFormat>
Tuple6VarULE<A, B, C, D, E, F, Format> {
#[doc = "Get field 0of this tuple"]
pub fn a(&self) -> &A { unsafe { self.multi.get_field::<A>(0) } }
#[doc = "Get field 1of this tuple"]
pub fn b(&self) -> &B { unsafe { self.multi.get_field::<B>(1) } }
#[doc = "Get field 2of this tuple"]
pub fn c(&self) -> &C { unsafe { self.multi.get_field::<C>(2) } }
#[doc = "Get field 3of this tuple"]
pub fn d(&self) -> &D { unsafe { self.multi.get_field::<D>(3) } }
#[doc = "Get field 4of this tuple"]
pub fn e(&self) -> &E { unsafe { self.multi.get_field::<E>(4) } }
#[doc = "Get field 5of this tuple"]
pub fn f(&self) -> &F { unsafe { self.multi.get_field::<F>(5) } }
}
unsafe impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized,
D: VarULE + ?Sized, E: VarULE + ?Sized, F: VarULE + ?Sized,
Format: VarZeroVecFormat> VarULE for
Tuple6VarULE<A, B, C, D, E, F, Format> {
fn validate_bytes(bytes: &[u8]) -> Result<(), UleError> {
let multi =
<MultiFieldsULE<6, Format> as VarULE>::parse_bytes(bytes)?;
unsafe { multi.validate_field::<A>(0)?; }
unsafe { multi.validate_field::<B>(1)?; }
unsafe { multi.validate_field::<C>(2)?; }
unsafe { multi.validate_field::<D>(3)?; }
unsafe { multi.validate_field::<E>(4)?; }
unsafe { multi.validate_field::<F>(5)?; }
Ok(())
}
unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
let multi =
<MultiFieldsULE<6, Format> as
VarULE>::from_bytes_unchecked(bytes);
mem::transmute::<&MultiFieldsULE<6, Format>, &Self>(multi)
}
}
impl<A: fmt::Debug + VarULE + ?Sized, B: fmt::Debug + VarULE + ?Sized,
C: fmt::Debug + VarULE + ?Sized, D: fmt::Debug + VarULE + ?Sized,
E: fmt::Debug + VarULE + ?Sized, F: fmt::Debug + VarULE + ?Sized,
Format: VarZeroVecFormat> fmt::Debug for
Tuple6VarULE<A, B, C, D, E, F, Format> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
(self.a(), self.b(), self.c(), self.d(), self.e(), self.f()).fmt(f)
}
}
impl<A: PartialEq + VarULE + ?Sized, B: PartialEq + VarULE + ?Sized,
C: PartialEq + VarULE + ?Sized, D: PartialEq + VarULE + ?Sized,
E: PartialEq + VarULE + ?Sized, F: PartialEq + VarULE + ?Sized,
Format: VarZeroVecFormat> PartialEq for
Tuple6VarULE<A, B, C, D, E, F, Format> {
fn eq(&self, other: &Self) -> bool {
(self.a(), self.b(), self.c(), self.d(), self.e(),
self.f()).eq(&(other.a(), other.b(), other.c(), other.d(),
other.e(), other.f()))
}
}
impl<A: Eq + VarULE + ?Sized, B: Eq + VarULE + ?Sized, C: Eq + VarULE +
?Sized, D: Eq + VarULE + ?Sized, E: Eq + VarULE + ?Sized, F: Eq + VarULE +
?Sized, Format: VarZeroVecFormat> Eq for
Tuple6VarULE<A, B, C, D, E, F, Format> {}
impl<A: PartialOrd + VarULE + ?Sized, B: PartialOrd + VarULE + ?Sized,
C: PartialOrd + VarULE + ?Sized, D: PartialOrd + VarULE + ?Sized,
E: PartialOrd + VarULE + ?Sized, F: PartialOrd + VarULE + ?Sized,
Format: VarZeroVecFormat> PartialOrd for
Tuple6VarULE<A, B, C, D, E, F, Format> {
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
(self.a(), self.b(), self.c(), self.d(), self.e(),
self.f()).partial_cmp(&(other.a(), other.b(), other.c(),
other.d(), other.e(), other.f()))
}
}
impl<A: Ord + VarULE + ?Sized, B: Ord + VarULE + ?Sized, C: Ord + VarULE +
?Sized, D: Ord + VarULE + ?Sized, E: Ord + VarULE + ?Sized, F: Ord +
VarULE + ?Sized, Format: VarZeroVecFormat> Ord for
Tuple6VarULE<A, B, C, D, E, F, Format> {
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
(self.a(), self.b(), self.c(), self.d(), self.e(),
self.f()).cmp(&(other.a(), other.b(), other.c(), other.d(),
other.e(), other.f()))
}
}
unsafe impl<A, B, C, D, E, F, AE, BE, CE, DE, EE, FE, Format>
EncodeAsVarULE<Tuple6VarULE<A, B, C, D, E, F, Format>> for
(AE, BE, CE, DE, EE, FE) where A: VarULE + ?Sized, B: VarULE + ?Sized,
C: VarULE + ?Sized, D: VarULE + ?Sized, E: VarULE + ?Sized, F: VarULE +
?Sized, AE: EncodeAsVarULE<A>, BE: EncodeAsVarULE<B>,
CE: EncodeAsVarULE<C>, DE: EncodeAsVarULE<D>, EE: EncodeAsVarULE<E>,
FE: EncodeAsVarULE<F>, Format: VarZeroVecFormat {
fn encode_var_ule_as_slices<R>(&self, _: impl FnOnce(&[&[u8]]) -> R)
-> R {
::core::panicking::panic("internal error: entered unreachable code")
}
#[inline]
fn encode_var_ule_len(&self) -> usize {
MultiFieldsULE::<6,
Format>::compute_encoded_len_for([self.0.encode_var_ule_len(),
self.1.encode_var_ule_len(), self.2.encode_var_ule_len(),
self.3.encode_var_ule_len(), self.4.encode_var_ule_len(),
self.5.encode_var_ule_len()])
}
#[inline]
fn encode_var_ule_write(&self, dst: &mut [u8]) {
let lengths =
[self.0.encode_var_ule_len(), self.1.encode_var_ule_len(),
self.2.encode_var_ule_len(), self.3.encode_var_ule_len(),
self.4.encode_var_ule_len(), self.5.encode_var_ule_len()];
let multi =
MultiFieldsULE::<6,
Format>::new_from_lengths_partially_initialized(lengths,
dst);
unsafe { multi.set_field_at::<A, AE>(0, &self.0); }
unsafe { multi.set_field_at::<B, BE>(1, &self.1); }
unsafe { multi.set_field_at::<C, CE>(2, &self.2); }
unsafe { multi.set_field_at::<D, DE>(3, &self.3); }
unsafe { multi.set_field_at::<E, EE>(4, &self.4); }
unsafe { multi.set_field_at::<F, FE>(5, &self.5); }
}
}
impl<A: VarULE + ?Sized, B: VarULE + ?Sized, C: VarULE + ?Sized, D: VarULE +
?Sized, E: VarULE + ?Sized, F: VarULE + ?Sized, Format: VarZeroVecFormat>
alloc::borrow::ToOwned for Tuple6VarULE<A, B, C, D, E, F, Format> {
type Owned = alloc::boxed::Box<Self>;
fn to_owned(&self) -> Self::Owned { encode_varule_to_box(self) }
}
impl<'a, A, B, C, D, E, F, AE, BE, CE, DE, EE, FE, Format>
ZeroFrom<'a, Tuple6VarULE<A, B, C, D, E, F, Format>> for
(AE, BE, CE, DE, EE, FE) where A: VarULE + ?Sized, B: VarULE + ?Sized,
C: VarULE + ?Sized, D: VarULE + ?Sized, E: VarULE + ?Sized, F: VarULE +
?Sized, AE: ZeroFrom<'a, A>, BE: ZeroFrom<'a, B>, CE: ZeroFrom<'a, C>,
DE: ZeroFrom<'a, D>, EE: ZeroFrom<'a, E>, FE: ZeroFrom<'a, F>,
Format: VarZeroVecFormat {
fn zero_from(other: &'a Tuple6VarULE<A, B, C, D, E, F, Format>) -> Self {
(AE::zero_from(other.a()), BE::zero_from(other.b()),
CE::zero_from(other.c()), DE::zero_from(other.d()),
EE::zero_from(other.e()), FE::zero_from(other.f()))
}
}tuple_varule!(Tuple6VarULE, 6, [ A a AE 0, B b BE 1, C c CE 2, D d DE 3, E e EE 4, F f FE 5 ]);
245
246#[cfg(test)]
247mod tests {
248 use super::*;
249 use crate::varzerovec::{Index16, Index32, Index8, VarZeroVecFormat};
250 use crate::VarZeroSlice;
251 use crate::VarZeroVec;
252
253 #[test]
254 fn test_pairvarule_validate() {
255 let vec: Vec<(&str, &[u8])> = vec![("a", b"b"), ("foo", b"bar"), ("lorem", b"ipsum\xFF")];
256 let zerovec: VarZeroVec<Tuple2VarULE<str, [u8]>> = (&vec).into();
257 let bytes = zerovec.as_bytes();
258 let zerovec2 = VarZeroVec::parse_bytes(bytes).unwrap();
259 assert_eq!(zerovec, zerovec2);
260
261 let zerovec3 = VarZeroVec::<Tuple2VarULE<str, str>>::parse_bytes(bytes);
264 assert!(zerovec3.is_err());
265
266 #[cfg(feature = "serde")]
267 for val in zerovec.iter() {
268 crate::ule::test_utils::assert_serde_roundtrips::<Tuple2VarULE<str, [u8]>>(val);
270 }
271 }
272 fn test_tripleule_validate_inner<Format: VarZeroVecFormat>() {
273 let vec: Vec<(&str, &[u8], VarZeroVec<str>)> = vec![
274 ("a", b"b", (&vec!["a", "b", "c"]).into()),
275 ("foo", b"bar", (&vec!["baz", "quux"]).into()),
276 (
277 "lorem",
278 b"ipsum\xFF",
279 (&vec!["dolor", "sit", "amet"]).into(),
280 ),
281 ];
282 let zerovec: VarZeroVec<Tuple3VarULE<str, [u8], VarZeroSlice<str>, Format>> = (&vec).into();
283 let bytes = zerovec.as_bytes();
284 let zerovec2 = VarZeroVec::parse_bytes(bytes).unwrap();
285 assert_eq!(zerovec, zerovec2);
286
287 let zerovec3 = VarZeroVec::<Tuple3VarULE<VarZeroSlice<str>, [u8], VarZeroSlice<str>, Format>>::parse_bytes(bytes);
290 assert!(zerovec3.is_err());
291
292 #[cfg(feature = "serde")]
293 for val in zerovec.iter() {
294 crate::ule::test_utils::assert_serde_roundtrips::<
296 Tuple3VarULE<str, [u8], VarZeroSlice<str>, Format>,
297 >(val);
298 }
299 }
300
301 #[test]
302 fn test_tripleule_validate() {
303 test_tripleule_validate_inner::<Index8>();
304 test_tripleule_validate_inner::<Index16>();
305 test_tripleule_validate_inner::<Index32>();
306 }
307}