Unimpl Shl, ShlAssign, Shr and ShrAssign for Saturating

This commit is contained in:
Michael Watzko 2023-07-26 22:15:06 +02:00
parent 9f5fc1bd44
commit 0eb41335e2

View File

@ -4,7 +4,7 @@
use crate::ops::{Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign}; use crate::ops::{Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign};
use crate::ops::{BitXor, BitXorAssign, Div, DivAssign}; use crate::ops::{BitXor, BitXorAssign, Div, DivAssign};
use crate::ops::{Mul, MulAssign, Neg, Not, Rem, RemAssign}; use crate::ops::{Mul, MulAssign, Neg, Not, Rem, RemAssign};
use crate::ops::{Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign}; use crate::ops::{Sub, SubAssign};
/// Provides intentionally-saturating arithmetic on `T`. /// Provides intentionally-saturating arithmetic on `T`.
/// ///
@ -79,129 +79,132 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f) self.0.fmt(f)
} }
} }
#[allow(unused_macros)]
macro_rules! sh_impl_signed {
($t:ident, $f:ident) => {
// FIXME what is the correct implementation here? see discussion https://github.com/rust-lang/rust/pull/87921#discussion_r695870065
//
// #[unstable(feature = "saturating_int_impl", issue = "87920")]
// impl Shl<$f> for Saturating<$t> {
// type Output = Saturating<$t>;
//
// #[inline]
// fn shl(self, other: $f) -> Saturating<$t> {
// if other < 0 {
// Saturating(self.0.shr((-other & self::shift_max::$t as $f) as u32))
// } else {
// Saturating(self.0.shl((other & self::shift_max::$t as $f) as u32))
// }
// }
// }
// forward_ref_binop! { impl Shl, shl for Saturating<$t>, $f,
// #[unstable(feature = "saturating_int_impl", issue = "87920")] }
//
// #[unstable(feature = "saturating_int_impl", issue = "87920")]
// impl ShlAssign<$f> for Saturating<$t> {
// #[inline]
// fn shl_assign(&mut self, other: $f) {
// *self = *self << other;
// }
// }
// forward_ref_op_assign! { impl ShlAssign, shl_assign for Saturating<$t>, $f }
#[unstable(feature = "saturating_int_impl", issue = "87920")] // FIXME the correct implementation is not clear. Waiting for a real world use case at https://github.com/rust-lang/libs-team/issues/230
impl Shr<$f> for Saturating<$t> { //
type Output = Saturating<$t>; // #[allow(unused_macros)]
// macro_rules! sh_impl_signed {
#[inline] // ($t:ident, $f:ident) => {
fn shr(self, other: $f) -> Saturating<$t> { // // FIXME what is the correct implementation here? see discussion https://github.com/rust-lang/rust/pull/87921#discussion_r695870065
if other < 0 { // //
Saturating(self.0.shl((-other & self::shift_max::$t as $f) as u32)) // // #[unstable(feature = "saturating_int_impl", issue = "87920")]
} else { // // impl Shl<$f> for Saturating<$t> {
Saturating(self.0.shr((other & self::shift_max::$t as $f) as u32)) // // type Output = Saturating<$t>;
} // //
} // // #[inline]
} // // fn shl(self, other: $f) -> Saturating<$t> {
forward_ref_binop! { impl Shr, shr for Saturating<$t>, $f, // // if other < 0 {
#[unstable(feature = "saturating_int_impl", issue = "87920")] } // // Saturating(self.0.shr((-other & self::shift_max::$t as $f) as u32))
// // } else {
#[unstable(feature = "saturating_int_impl", issue = "87920")] // // Saturating(self.0.shl((other & self::shift_max::$t as $f) as u32))
impl ShrAssign<$f> for Saturating<$t> { // // }
#[inline] // // }
fn shr_assign(&mut self, other: $f) { // // }
*self = *self >> other; // // forward_ref_binop! { impl Shl, shl for Saturating<$t>, $f,
} // // #[unstable(feature = "saturating_int_impl", issue = "87920")] }
} // //
forward_ref_op_assign! { impl ShrAssign, shr_assign for Saturating<$t>, $f } // // #[unstable(feature = "saturating_int_impl", issue = "87920")]
}; // // impl ShlAssign<$f> for Saturating<$t> {
} // // #[inline]
// // fn shl_assign(&mut self, other: $f) {
macro_rules! sh_impl_unsigned { // // *self = *self << other;
($t:ident, $f:ident) => { // // }
#[unstable(feature = "saturating_int_impl", issue = "87920")] // // }
impl Shl<$f> for Saturating<$t> { // // forward_ref_op_assign! { impl ShlAssign, shl_assign for Saturating<$t>, $f }
type Output = Saturating<$t>; //
// #[unstable(feature = "saturating_int_impl", issue = "87920")]
#[inline] // impl Shr<$f> for Saturating<$t> {
fn shl(self, other: $f) -> Saturating<$t> { // type Output = Saturating<$t>;
Saturating(self.0.wrapping_shl(other as u32)) //
} // #[inline]
} // fn shr(self, other: $f) -> Saturating<$t> {
forward_ref_binop! { impl Shl, shl for Saturating<$t>, $f, // if other < 0 {
#[unstable(feature = "saturating_int_impl", issue = "87920")] } // Saturating(self.0.shl((-other & self::shift_max::$t as $f) as u32))
// } else {
#[unstable(feature = "saturating_int_impl", issue = "87920")] // Saturating(self.0.shr((other & self::shift_max::$t as $f) as u32))
impl ShlAssign<$f> for Saturating<$t> { // }
#[inline] // }
fn shl_assign(&mut self, other: $f) { // }
*self = *self << other; // forward_ref_binop! { impl Shr, shr for Saturating<$t>, $f,
} // #[unstable(feature = "saturating_int_impl", issue = "87920")] }
} //
forward_ref_op_assign! { impl ShlAssign, shl_assign for Saturating<$t>, $f } // #[unstable(feature = "saturating_int_impl", issue = "87920")]
// impl ShrAssign<$f> for Saturating<$t> {
#[unstable(feature = "saturating_int_impl", issue = "87920")] // #[inline]
impl Shr<$f> for Saturating<$t> { // fn shr_assign(&mut self, other: $f) {
type Output = Saturating<$t>; // *self = *self >> other;
// }
#[inline] // }
fn shr(self, other: $f) -> Saturating<$t> { // forward_ref_op_assign! { impl ShrAssign, shr_assign for Saturating<$t>, $f }
Saturating(self.0.wrapping_shr(other as u32)) // };
} // }
} //
forward_ref_binop! { impl Shr, shr for Saturating<$t>, $f, // macro_rules! sh_impl_unsigned {
#[unstable(feature = "saturating_int_impl", issue = "87920")] } // ($t:ident, $f:ident) => {
// #[unstable(feature = "saturating_int_impl", issue = "87920")]
#[unstable(feature = "saturating_int_impl", issue = "87920")] // impl Shl<$f> for Saturating<$t> {
impl ShrAssign<$f> for Saturating<$t> { // type Output = Saturating<$t>;
#[inline] //
fn shr_assign(&mut self, other: $f) { // #[inline]
*self = *self >> other; // fn shl(self, other: $f) -> Saturating<$t> {
} // Saturating(self.0.wrapping_shl(other as u32))
} // }
forward_ref_op_assign! { impl ShrAssign, shr_assign for Saturating<$t>, $f } // }
}; // forward_ref_binop! { impl Shl, shl for Saturating<$t>, $f,
} // #[unstable(feature = "saturating_int_impl", issue = "87920")] }
//
// FIXME (#23545): uncomment the remaining impls // #[unstable(feature = "saturating_int_impl", issue = "87920")]
macro_rules! sh_impl_all { // impl ShlAssign<$f> for Saturating<$t> {
($($t:ident)*) => ($( // #[inline]
//sh_impl_unsigned! { $t, u8 } // fn shl_assign(&mut self, other: $f) {
//sh_impl_unsigned! { $t, u16 } // *self = *self << other;
//sh_impl_unsigned! { $t, u32 } // }
//sh_impl_unsigned! { $t, u64 } // }
//sh_impl_unsigned! { $t, u128 } // forward_ref_op_assign! { impl ShlAssign, shl_assign for Saturating<$t>, $f }
sh_impl_unsigned! { $t, usize } //
// #[unstable(feature = "saturating_int_impl", issue = "87920")]
//sh_impl_signed! { $t, i8 } // impl Shr<$f> for Saturating<$t> {
//sh_impl_signed! { $t, i16 } // type Output = Saturating<$t>;
//sh_impl_signed! { $t, i32 } //
//sh_impl_signed! { $t, i64 } // #[inline]
//sh_impl_signed! { $t, i128 } // fn shr(self, other: $f) -> Saturating<$t> {
//sh_impl_signed! { $t, isize } // Saturating(self.0.wrapping_shr(other as u32))
)*) // }
} // }
// forward_ref_binop! { impl Shr, shr for Saturating<$t>, $f,
sh_impl_all! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize } // #[unstable(feature = "saturating_int_impl", issue = "87920")] }
//
// #[unstable(feature = "saturating_int_impl", issue = "87920")]
// impl ShrAssign<$f> for Saturating<$t> {
// #[inline]
// fn shr_assign(&mut self, other: $f) {
// *self = *self >> other;
// }
// }
// forward_ref_op_assign! { impl ShrAssign, shr_assign for Saturating<$t>, $f }
// };
// }
//
// // FIXME (#23545): uncomment the remaining impls
// macro_rules! sh_impl_all {
// ($($t:ident)*) => ($(
// //sh_impl_unsigned! { $t, u8 }
// //sh_impl_unsigned! { $t, u16 }
// //sh_impl_unsigned! { $t, u32 }
// //sh_impl_unsigned! { $t, u64 }
// //sh_impl_unsigned! { $t, u128 }
// sh_impl_unsigned! { $t, usize }
//
// //sh_impl_signed! { $t, i8 }
// //sh_impl_signed! { $t, i16 }
// //sh_impl_signed! { $t, i32 }
// //sh_impl_signed! { $t, i64 }
// //sh_impl_signed! { $t, i128 }
// //sh_impl_signed! { $t, isize }
// )*)
// }
//
// sh_impl_all! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize }
// FIXME(30524): impl Op<T> for Saturating<T>, impl OpAssign<T> for Saturating<T> // FIXME(30524): impl Op<T> for Saturating<T>, impl OpAssign<T> for Saturating<T>
macro_rules! saturating_impl { macro_rules! saturating_impl {