dashu_float/
shift.rs

1use crate::{error::assert_finite, fbig::FBig, repr::Word, round::Round};
2use core::ops::{Shl, ShlAssign, Shr, ShrAssign};
3
4impl<R: Round, const B: Word> Shl<isize> for FBig<R, B> {
5    type Output = Self;
6    #[inline]
7    fn shl(mut self, rhs: isize) -> Self::Output {
8        assert_finite(&self.repr);
9        if !self.repr.is_zero() {
10            self.repr.exponent += rhs;
11        }
12        self
13    }
14}
15
16impl<R: Round, const B: Word> ShlAssign<isize> for FBig<R, B> {
17    #[inline]
18    fn shl_assign(&mut self, rhs: isize) {
19        assert_finite(&self.repr);
20        if !self.repr.is_zero() {
21            self.repr.exponent += rhs;
22        }
23    }
24}
25
26impl<R: Round, const B: Word> Shr<isize> for FBig<R, B> {
27    type Output = Self;
28    #[inline]
29    fn shr(mut self, rhs: isize) -> Self::Output {
30        assert_finite(&self.repr);
31        if !self.repr.is_zero() {
32            self.repr.exponent -= rhs;
33        }
34        self
35    }
36}
37
38impl<R: Round, const B: Word> ShrAssign<isize> for FBig<R, B> {
39    #[inline]
40    fn shr_assign(&mut self, rhs: isize) {
41        assert_finite(&self.repr);
42        if !self.repr.is_zero() {
43            self.repr.exponent -= rhs;
44        }
45        self.repr.exponent -= rhs;
46    }
47}