icu_provider/
varule_traits.rs1use zerovec::ule::VarULE;
6
7#[cfg(feature = "alloc")]
8use zerovec::{maps::ZeroMapKV, ZeroMap, ZeroMap2d};
9
10pub trait MaybeAsVarULE {
22 type EncodedStruct: ?Sized + VarULE;
25}
26
27#[cfg(feature = "export")]
32pub trait MaybeEncodeAsVarULE: MaybeAsVarULE {
33 fn maybe_encode_as_varule(&self) -> Option<&Self::EncodedStruct>;
36}
37
38#[macro_export] macro_rules! data_struct {
41 (<$generic:ident: $bound:tt> $ty:path $(, $(#[$attr:meta])*)?) => {
42 impl<$generic: $bound> $crate::ule::MaybeAsVarULE for $ty {
43 type EncodedStruct = [()];
44 }
45 $($(#[$attr])*)?
46 impl<$generic: $bound> $crate::ule::MaybeEncodeAsVarULE for $ty {
47 fn maybe_encode_as_varule(&self) -> Option<&Self::EncodedStruct> {
48 None
49 }
50 }
51 };
52 ($ty:path $(, $(#[$attr:meta])*)?) => {
53 impl $crate::ule::MaybeAsVarULE for $ty {
54 type EncodedStruct = [()];
55 }
56 $($(#[$attr])*)?
57 impl $crate::ule::MaybeEncodeAsVarULE for $ty {
58 fn maybe_encode_as_varule(&self) -> Option<&Self::EncodedStruct> {
59 None
60 }
61 }
62 };
63 (
64 $ty:ty,
65 varule: $varule:ty,
66 $(#[$attr:meta])*
67 encode_as_varule: $encode_as_varule:expr
68 ) => {
69 impl<'data> $crate::ule::MaybeAsVarULE for $ty {
70 type EncodedStruct = $varule;
71 }
72 $(#[$attr])*
73 impl<'data> $crate::ule::MaybeEncodeAsVarULE for $ty {
74 fn maybe_encode_as_varule(&self) -> Option<&Self::EncodedStruct> {
75 fn bind_lifetimes<F>(f: F) -> F where F: for<'data> Fn(&'data $ty) -> &'data $varule { f }
77 Some(bind_lifetimes($encode_as_varule)(self))
78 }
79 }
80 };
81}
82
83#[cfg(feature = "alloc")]
86impl<'a, K0, V> MaybeAsVarULE for ZeroMap<'a, K0, V>
87where
88 K0: ZeroMapKV<'a>,
89 V: ZeroMapKV<'a>,
90 K0: ?Sized,
91 V: ?Sized,
92{
93 type EncodedStruct = [()];
94}
95
96#[cfg(feature = "alloc")]
97#[cfg(feature = "export")]
98impl<'a, K0, V> MaybeEncodeAsVarULE for ZeroMap<'a, K0, V>
99where
100 K0: ZeroMapKV<'a>,
101 V: ZeroMapKV<'a>,
102 K0: ?Sized,
103 V: ?Sized,
104{
105 fn maybe_encode_as_varule(&self) -> Option<&Self::EncodedStruct> {
106 None
107 }
108}
109
110#[cfg(feature = "alloc")]
111impl<'a, K0, K1, V> MaybeAsVarULE for ZeroMap2d<'a, K0, K1, V>
112where
113 K0: ZeroMapKV<'a>,
114 K1: ZeroMapKV<'a>,
115 V: ZeroMapKV<'a>,
116 K0: ?Sized,
117 K1: ?Sized,
118 V: ?Sized,
119{
120 type EncodedStruct = [()];
121}
122
123#[cfg(feature = "alloc")]
124#[cfg(feature = "export")]
125impl<'a, K0, K1, V> MaybeEncodeAsVarULE for ZeroMap2d<'a, K0, K1, V>
126where
127 K0: ZeroMapKV<'a>,
128 K1: ZeroMapKV<'a>,
129 V: ZeroMapKV<'a>,
130 K0: ?Sized,
131 K1: ?Sized,
132 V: ?Sized,
133{
134 fn maybe_encode_as_varule(&self) -> Option<&Self::EncodedStruct> {
135 None
136 }
137}
138
139impl<T, const N: usize> MaybeAsVarULE for [T; N] {
140 type EncodedStruct = [()];
141}
142
143#[cfg(feature = "export")]
144impl<T, const N: usize> MaybeEncodeAsVarULE for [T; N] {
145 fn maybe_encode_as_varule(&self) -> Option<&Self::EncodedStruct> {
146 None
147 }
148}
149
150impl MaybeAsVarULE for u16 {
151 type EncodedStruct = [()];
152}
153
154#[cfg(feature = "export")]
155impl MaybeEncodeAsVarULE for u16 {
156 fn maybe_encode_as_varule(&self) -> Option<&Self::EncodedStruct> {
157 None
158 }
159}