summaryrefslogtreecommitdiff
path: root/vendor/serde_json/src/lexical/shift.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/serde_json/src/lexical/shift.rs')
-rw-r--r--vendor/serde_json/src/lexical/shift.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/vendor/serde_json/src/lexical/shift.rs b/vendor/serde_json/src/lexical/shift.rs
new file mode 100644
index 0000000..a0bae01
--- /dev/null
+++ b/vendor/serde_json/src/lexical/shift.rs
@@ -0,0 +1,46 @@
+// 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;
+}