repo_description: Strongly typed JSON library for Rust
repo_topics: json rust serde
code: // Adapted from https://github.com/Alexhuszagh/rust-lexical.
  
  //! Bit-shift helpers.
  
  use super::float::ExtendedFloat;
  use core::mem;
  
  // Shift extended-precision float right `shift` bytes.
  #[inline]
  pub(crate) fn shr(fp: &mut ExtendedFloat, shift: i32) {
      let bits: u64 = mem::size_of::<u64>() as u64 * 8;
      debug_assert!((shift as u64) < bits, "shr() overflow in shift right.");
  
      fp.mant >>= shift;
      fp.exp += shift;
  }
  
  // Shift extended-precision float right `shift` bytes.
  //
  // Accepts when the shift is the same as the type size, and
  // sets the value to 0.
  #[inline]
  pub(crate) fn overflowing_shr(fp: &mut ExtendedFloat, shift: i32) {
      let bits: u64 = mem::size_of::<u64>() as u64 * 8;
      debug_assert!(
          (shift as u64) <= bits,
          "overflowing_shr() overflow in shift right."
      );
  
      fp.mant = if shift as u64 == bits {
          0
      } else {
          fp.mant >> shift
      };
      fp.exp += shift;
  }
  
  // Shift extended-precision float left `shift` bytes.
  #[inline]
  pub(crate) fn shl(fp: &mut ExtendedFloat, shift: i32) {
      let bits: u64 = mem::size_of::<u64>() as u64 * 8;
      debug_assert!((shift as u64) < bits, "shl() overflow in shift left.");
  
      fp.mant <<= shift;
      fp.exp -= shift;
  }
  