1use core::ops::{Range, RangeInclusive};
2
3use crate::cmp::{CmpWrapper, ConstCmp, IsAConstCmp, IsStdKind};
4
5macro_rules! shared_range_impls {
6 ($type:ty, $eq_fn_name:ident) => {
7 impl ConstCmp for $type {
8 type Kind = IsStdKind;
9 }
10 impl CmpWrapper<$type> {
11 #[inline(always)]
13 pub const fn const_eq(&self, other: &$type) -> bool {
14 $eq_fn_name(&self.0, other)
15 }
16 }
17 };
18}
19
20macro_rules! declare_range_cmp_fns {
21 (
22 ($type:ty, ($eq_fn_name:ident))
23
24 docs( $docs_eq:expr, $docs_cmp:expr,)
25 ) => {
26 shared_range_impls! {$type, $eq_fn_name}
27
28 impl<T> IsAConstCmp<IsStdKind, $type, T> {
29 #[inline(always)]
31 pub const fn coerce(self, range: &$type) -> CmpWrapper<$type> {
32 CmpWrapper(Range {
33 start: range.start,
34 end: range.end,
35 })
36 }
37 }
38
39 __delegate_const_eq! {
40 skip_coerce;
41 for['a,]
42
43 #[doc = $docs_eq]
44 pub const fn $eq_fn_name(ref left: &'a $type, right: &'a $type) -> bool {
45 left.start == right.start && left.end == right.end
46 }
47 }
48 };
49}
50
51__declare_fns_with_docs! {
52 (Range<u8>, (eq_range_u8))
53 (Range<u16>, (eq_range_u16))
54 (Range<u32>, (eq_range_u32))
55 (Range<u64>, (eq_range_u64))
56 (Range<u128>, (eq_range_u128))
57 (Range<usize>, (eq_range_usize))
58
59 (Range<char>, (eq_range_char))
60
61 docs(default)
62
63 macro = declare_range_cmp_fns!(),
64}
65
66macro_rules! declare_rangeinclusive_cmp_fns {
67 (
68 ($type:ty, ($eq_fn_name:ident))
69
70 docs( $docs_eq:expr, $docs_cmp:expr,)
71 ) => {
72 shared_range_impls! {$type, $eq_fn_name}
73
74 impl<T> IsAConstCmp<IsStdKind, $type, T> {
75 #[inline(always)]
77 pub const fn coerce(self, range: &$type) -> CmpWrapper<$type> {
78 CmpWrapper(RangeInclusive::new(*range.start(), *range.end()))
79 }
80 }
81
82 #[doc = $docs_eq]
83 pub const fn $eq_fn_name(left: &$type, right: &$type) -> bool {
84 *left.start() == *right.start() && *left.end() == *right.end()
85 }
86 };
87}
88
89__declare_fns_with_docs! {
90 (RangeInclusive<u8>, (eq_rangeinc_u8,))
91 (RangeInclusive<u16>, (eq_rangeinc_u16))
92 (RangeInclusive<u32>, (eq_rangeinc_u32))
93 (RangeInclusive<u64>, (eq_rangeinc_u64))
94 (RangeInclusive<u128>, (eq_rangeinc_u128))
95 (RangeInclusive<usize>, (eq_rangeinc_usize))
96
97 (RangeInclusive<char>, (eq_rangeinc_char))
98
99 docs(default)
100
101 macro = declare_rangeinclusive_cmp_fns!(),
102}