konst/range/
cmp.rs

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            /// Compares `self` and `other` for equality.
12            #[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            ///
30            #[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            ///
76            #[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}