Skip to content

Commit 17b65c3

Browse files
committed
Add some forwarding impls Hash, Ord, PartialOrd
1 parent e363d04 commit 17b65c3

File tree

5 files changed

+526
-3
lines changed

5 files changed

+526
-3
lines changed

fixed-map-derive/src/any_variants.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub(crate) fn implement(cx: &Ctxt<'_>, en: &DataEnum) -> Result<TokenStream, ()>
3232
let mut field_inits = Vec::new();
3333
let mut field_clones = Vec::new();
3434
let mut field_partial_eqs = Vec::new();
35+
let mut field_partial_not_eqs = Vec::new();
3536
let mut contains_key = Vec::new();
3637
let mut get = Vec::new();
3738
let mut get_mut = Vec::new();
@@ -48,12 +49,19 @@ pub(crate) fn implement(cx: &Ctxt<'_>, en: &DataEnum) -> Result<TokenStream, ()>
4849

4950
field_inits.push(quote!(#name: #default::default()));
5051
field_clones.push(quote!(#name: #clone::clone(&self.#name)));
52+
5153
field_partial_eqs.push(quote! {
52-
if self.#name != other.#name {
54+
if #partial_eq::ne(&self.#name, &other.#name) {
5355
return false;
5456
}
5557
});
5658

59+
field_partial_not_eqs.push(quote! {
60+
if #partial_eq::ne(&self.#name, &other.#name) {
61+
return true;
62+
}
63+
});
64+
5765
let kind = match &variant.fields {
5866
Fields::Unit => {
5967
len.push(quote!(usize::from(#option::is_some(&self.#name))));
@@ -176,6 +184,12 @@ pub(crate) fn implement(cx: &Ctxt<'_>, en: &DataEnum) -> Result<TokenStream, ()>
176184
#(#field_partial_eqs;)*
177185
true
178186
}
187+
188+
#[inline]
189+
fn ne(&self, other: &Storage<V>) -> bool {
190+
#(#field_partial_not_eqs;)*
191+
false
192+
}
179193
}
180194

181195
#[automatically_derived]

fixed-map-derive/src/context.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,18 @@ pub(crate) struct Toks {
1313
pub(crate) default: TokenStream,
1414
pub(crate) double_ended_iterator_t: TokenStream,
1515
pub(crate) eq: TokenStream,
16+
pub(crate) hash: TokenStream,
17+
pub(crate) hasher: TokenStream,
1618
pub(crate) into_iter: TokenStream,
1719
pub(crate) iterator_t: TokenStream,
1820
pub(crate) iterator_flatten: TokenStream,
1921
pub(crate) key_trait: TokenStream,
2022
pub(crate) mem: TokenStream,
2123
pub(crate) option: TokenStream,
2224
pub(crate) partial_eq: TokenStream,
25+
pub(crate) partial_ord: TokenStream,
26+
pub(crate) ordering: TokenStream,
27+
pub(crate) ord: TokenStream,
2328
pub(crate) slice_iter_mut: TokenStream,
2429
pub(crate) slice_iter: TokenStream,
2530
pub(crate) storage_trait: TokenStream,
@@ -43,13 +48,18 @@ impl Toks {
4348
default: quote!(::core::default::Default),
4449
double_ended_iterator_t: quote!(::core::iter::DoubleEndedIterator),
4550
eq: quote!(::core::cmp::Eq),
51+
hash: quote!(::core::hash::Hash),
52+
hasher: quote!(::core::hash::Hasher),
4653
into_iter: quote!(::core::iter::IntoIterator::into_iter),
4754
iterator_t: quote!(::core::iter::Iterator),
4855
iterator_flatten: quote!(::core::iter::Flatten),
4956
key_trait: quote!(#krate::key::Key),
5057
mem: quote!(::core::mem),
5158
option: quote!(::core::option::Option),
5259
partial_eq: quote!(::core::cmp::PartialEq),
60+
partial_ord: quote!(::core::cmp::PartialOrd),
61+
ordering: quote!(::core::cmp::Ordering),
62+
ord: quote!(::core::cmp::Ord),
5363
slice_iter_mut: quote!(::core::slice::IterMut),
5464
slice_iter: quote!(::core::slice::Iter),
5565
storage_trait: quote!(#krate::storage::Storage),

fixed-map-derive/src/unit_variants.rs

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@ pub(crate) fn implement(cx: &Ctxt<'_>, en: &DataEnum) -> Result<TokenStream, ()>
1414
let copy = &cx.toks.copy;
1515
let default = &cx.toks.default;
1616
let eq = &cx.toks.eq;
17+
let hash = &cx.toks.hash;
18+
let hasher = &cx.toks.hasher;
1719
let into_iter = &cx.toks.into_iter;
1820
let iterator = &cx.toks.iterator_t;
1921
let iterator_flatten = &cx.toks.iterator_flatten;
2022
let key_trait = &cx.toks.key_trait;
2123
let mem = &cx.toks.mem;
2224
let option = &cx.toks.option;
2325
let partial_eq = &cx.toks.partial_eq;
26+
let partial_ord = &cx.toks.partial_ord;
27+
let ordering = &cx.toks.ordering;
28+
let ord = &cx.toks.ord;
2429
let slice_iter = &cx.toks.slice_iter;
2530
let slice_iter_mut = &cx.toks.slice_iter_mut;
2631
let array_into_iter = &cx.toks.array_into_iter;
@@ -191,16 +196,86 @@ pub(crate) fn implement(cx: &Ctxt<'_>, en: &DataEnum) -> Result<TokenStream, ()>
191196
}
192197

193198
#[automatically_derived]
194-
impl<V> #partial_eq for Storage<V> where V: #partial_eq{
199+
impl<V> #partial_eq for Storage<V> where V: #partial_eq {
195200
#[inline]
196201
fn eq(&self, other: &Storage<V>) -> bool {
197-
self.data == other.data
202+
#partial_eq::eq(&self.data, &other.data)
203+
}
204+
205+
#[inline]
206+
fn ne(&self, other: &Storage<V>) -> bool {
207+
#partial_eq::ne(&self.data, &other.data)
198208
}
199209
}
200210

201211
#[automatically_derived]
202212
impl<V> #eq for Storage<V> where V: #eq {}
203213

214+
#[automatically_derived]
215+
impl<V> #hash for Storage<V> where V: #hash {
216+
#[inline]
217+
fn hash<H>(&self, state: &mut H)
218+
where
219+
H: #hasher,
220+
{
221+
#hash::hash(&self.data, state);
222+
}
223+
}
224+
225+
#[automatically_derived]
226+
impl<V> #partial_ord for Storage<V> where V: #partial_ord {
227+
#[inline]
228+
fn partial_cmp(&self, other: &Self) -> Option<#ordering> {
229+
#partial_ord::partial_cmp(&self.data, &other.data)
230+
}
231+
232+
#[inline]
233+
fn lt(&self, other: &Self) -> bool {
234+
#partial_ord::lt(&self.data, &other.data)
235+
}
236+
237+
#[inline]
238+
fn le(&self, other: &Self) -> bool {
239+
#partial_ord::le(&self.data, &other.data)
240+
}
241+
242+
#[inline]
243+
fn gt(&self, other: &Self) -> bool {
244+
#partial_ord::gt(&self.data, &other.data)
245+
}
246+
247+
#[inline]
248+
fn ge(&self, other: &Self) -> bool {
249+
#partial_ord::ge(&self.data, &other.data)
250+
}
251+
}
252+
253+
#[automatically_derived]
254+
impl<V> #ord for Storage<V> where V: #ord {
255+
#[inline]
256+
fn cmp(&self, other: &Self) -> #ordering {
257+
#ord::cmp(self, other)
258+
}
259+
260+
#[inline]
261+
fn max(self, other: Self) -> Self {
262+
Self { data: #ord::max(self.data, other.data) }
263+
}
264+
265+
#[inline]
266+
fn min(self, other: Self) -> Self {
267+
Self { data: #ord::min(self.data, other.data) }
268+
}
269+
270+
#[inline]
271+
fn clamp(self, min: Self, max: Self) -> Self
272+
where
273+
Self: #partial_ord<Self>
274+
{
275+
Self { data: #ord::clamp(self.data, min.data, max.data) }
276+
}
277+
}
278+
204279
#[automatically_derived]
205280
impl<V> #default for Storage<V> {
206281
#[inline]

0 commit comments

Comments
 (0)