macro_rules! impl_region_mask {
($fn_name:ident, $t:ty) => {
#[doc = concat!("assert_eq!(",stringify!($fn_name), "(0, 0), 0b0000_0001_", stringify!($t), ");")]
#[doc = concat!("assert_eq!(",stringify!($fn_name), "(0, 1), 0b0000_0011_", stringify!($t), ");")]
#[doc = concat!("assert_eq!(",stringify!($fn_name), "(0, 2), 0b0000_0111_", stringify!($t), ");")]
#[doc = concat!("assert_eq!(",stringify!($fn_name), "(1, 3), 0b0000_1110_", stringify!($t), ");")]
#[doc = concat!("assert_eq!(",stringify!($fn_name), "(4, 7), 0b1111_0000_", stringify!($t), ");")]
#[doc = concat!("assert_eq!(",stringify!($fn_name), "(4, 4), 0b0001_0000_", stringify!($t), ");")]
#[inline]
#[must_use]
#[cfg_attr(feature = "track_caller", track_caller)]
pub const fn $fn_name(low: u32, high: u32) -> $t {
assert!(low < <$t>::BITS);
assert!(high < <$t>::BITS);
assert!(low <= high);
(<$t>::MAX >> ((<$t>::BITS - 1) - (high - low))) << low
}
};
}
impl_region_mask!(u8_region_mask, u8);
impl_region_mask!(u16_region_mask, u16);
impl_region_mask!(u32_region_mask, u32);
impl_region_mask!(u64_region_mask, u64);
impl_region_mask!(u128_region_mask, u128);