Skip to content

Commit 91aefe4

Browse files
committed
v0.7.3
1 parent b7ba53e commit 91aefe4

File tree

23 files changed

+401
-97
lines changed

23 files changed

+401
-97
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "fastnum"
3-
version = "0.7.2"
3+
version = "0.7.3"
44
edition = "2021"
55
authors = ["Neo"]
66
description = "Fast decimal numbers library"

src/bint/convert.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub(crate) mod from_bytes;
22
pub(crate) mod from_str;
3+
pub(crate) mod utils;
34
pub(crate) mod to_bytes;
45
pub(crate) mod to_str;

src/bint/convert/utils.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
macro_rules! digits_from_int_impl {
2+
($n: expr, $int: ty, $bits: expr $(, $wrap: ident)?) => {{
3+
4+
let mut digits = $crate::bint::convert::utils::digits_from_int_impl!(@ $n, $($wrap)?);
5+
6+
let mut i = 0;
7+
while i << DIGIT_BIT_SHIFT < $bits {
8+
let d = ($n >> (i << DIGIT_BIT_SHIFT)) as Digit;
9+
digits[i as usize] = d;
10+
i += 1;
11+
}
12+
13+
digits
14+
}};
15+
16+
(@ $n: expr,) => {{
17+
[0; N]
18+
}};
19+
(@ $n: expr, WRAP) => {{
20+
if $n.is_negative() {
21+
[Digit::MAX; N]
22+
} else {
23+
[0; N]
24+
}
25+
}};
26+
}
27+
28+
pub(crate) use digits_from_int_impl;

src/bint/int/convert.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ use core::str::from_utf8_unchecked;
1717
use alloc::{string::String, vec::Vec};
1818

1919
use crate::bint::{
20-
convert, doc, error::from_int_error_kind, int::intrinsics, Int, ParseError, UInt,
20+
convert, doc,
21+
error::from_int_error_kind,
22+
int::intrinsics::{self, *},
23+
Int, ParseError, UInt,
2124
};
2225

2326
impl<const N: usize> Int<N> {
@@ -38,11 +41,11 @@ impl<const N: usize> Int<N> {
3841
);
3942

4043
from_int_impl!(
41-
from_i8 <- i8 (from_u8 <- u8),
42-
from_i16 <- i16 (from_u16 <- u16),
43-
from_i32 <- i32 (from_u32 <- u32),
44-
from_i64 <- i64 (from_u64 <- u64),
45-
from_isize <- isize (from_usize <- usize)
44+
from_i8 <- i8,
45+
from_i16 <- i16,
46+
from_i32 <- i32,
47+
from_i64 <- i64,
48+
from_isize <- isize
4649
);
4750

4851
try_from_int_impl!(

src/bint/int/convert/from_int.rs

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,12 @@
1-
// Helper macro to perform sign-extended conversion from signed integers
2-
// Note: This is an internal implementation detail and should not be used
3-
// directly.
4-
#[doc(hidden)]
5-
#[macro_export]
6-
macro_rules! __sign_extend_from_int_impl {
7-
($int:expr, $int_ty:ty) => {{
8-
// Initialize all digits based on sign (for proper sign extension)
9-
let mut digits = if $int.is_negative() {
10-
*($crate::bint::UInt::MAX.digits())
11-
} else {
12-
*($crate::bint::UInt::ZERO.digits())
13-
};
14-
15-
// Copy the actual bits from the input integer
16-
let mut i = 0;
17-
while i << $crate::bint::intrinsics::DIGIT_BIT_SHIFT < <$int_ty>::BITS as usize {
18-
let d = ($int >> (i << $crate::bint::intrinsics::DIGIT_BIT_SHIFT))
19-
as $crate::bint::intrinsics::Digit;
20-
digits[i] = d;
21-
i += 1;
22-
}
23-
24-
digits
25-
}};
26-
}
27-
281
macro_rules! from_int_impl {
29-
($($name:ident <- $int:ident ($from_uint:ident <- $uint:ident)),*) => {
2+
($($from_int:ident <- $int:ident),*) => {
303
$(
314
#[inline(always)]
325
#[doc = doc::convert::from!($int I 256)]
33-
pub const fn $name(int: $int) -> Self {
6+
pub const fn $from_int(int: $int) -> Self {
347
debug_assert!($int::BITS <= Self::BITS);
35-
let digits = $crate::__sign_extend_from_int_impl!(int, $int);
36-
Self::from_digits(digits)
8+
let digits = $crate::bint::convert::utils::digits_from_int_impl!(int, $int, $int::BITS, WRAP);
9+
Self::from_bits(UInt::from_digits(digits))
3710
}
3811
)*
3912
};
@@ -47,12 +20,15 @@ macro_rules! try_from_int_impl {
4720
#[inline(always)]
4821
#[doc = doc::convert::from!($int I 256)]
4922
pub const fn $from_int(int: $int) -> Result<Self, ParseError> {
50-
if $int::BITS - int.leading_zeros() > Self::BITS {
23+
let bits = $int::BITS - int.leading_zeros();
24+
25+
if bits > Self::BITS {
5126
return Err(ParseError::PosOverflow);
52-
} else {
53-
let digits = $crate::__sign_extend_from_int_impl!(int, $int);
54-
Ok(Self::from_digits(digits))
5527
}
28+
29+
let digits = $crate::bint::convert::utils::digits_from_int_impl!(int, $int, bits, WRAP);
30+
31+
Ok(Self(bnum::BInt::from_bits(bnum::BUint::from_digits(digits))))
5632
}
5733
)*
5834
};

src/bint/int/convert/from_uint.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
macro_rules! from_uint_impl {
2-
($($name:ident <- $num:ident),*) => {
2+
($($from_uint:ident <- $num:ident),*) => {
33
$(
44
#[inline(always)]
55
#[doc = doc::convert::from!($num I 256)]
6-
pub const fn $name(n: $num) -> Self {
7-
debug_assert!($num::BITS < Self::BITS);
8-
Self::from_bits(UInt::$name(n))
6+
pub const fn $from_uint(n: $num) -> Self {
7+
debug_assert!($num::BITS <= Self::BITS);
8+
Self::from_bits(UInt::$from_uint(n))
99
}
1010
)*
1111
};

src/bint/int/impls/from.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ from_impl!(
1919

2020
try_from_impl!(
2121
Int, I
22+
2223
from_u64 u64,
2324
from_usize usize,
2425
from_u128 u128,
25-
2626
from_i128 i128
2727
);

src/bint/macros.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
macro_rules! macro_impl {
2-
($INT: ident, $bits: literal, $sign: ident, $name: ident) => {
2+
($d:tt, $INT: ident, $bits: literal, $sign: ident, $name: ident) => {
33
#[macro_export]
44
#[doc = concat!("A macro to construct ", $bits, "-bit [`", stringify!($INT), "`](crate::", stringify!($INT), ") ", stringify!($sign), " integer from literals.")]
55
///
@@ -16,28 +16,28 @@ macro_rules! macro_impl {
1616
/// ```
1717
///
1818
macro_rules! $name {
19-
($lit:expr) => {{
20-
const __INT: $crate::$INT = $crate::$INT::parse_str(stringify!($lit));
19+
($d($d body:tt)*) => {{
20+
const __INT: $crate::$INT = $crate::$INT::parse_str(concat!($d(stringify!($d body)),*));
2121
__INT
2222
}};
2323
}
2424
};
2525
}
2626

27-
macro_impl!(U64, 64, unsigned, u64);
28-
macro_impl!(U128, 128, unsigned, u128);
29-
macro_impl!(U256, 256, unsigned, u256);
30-
macro_impl!(U512, 512, unsigned, u512);
31-
macro_impl!(U1024, 1024, unsigned, u1024);
32-
// macro_impl!(U2048, 2048, unsigned, u2048);
33-
// macro_impl!(U4096, 4096, unsigned, u4096);
34-
// macro_impl!(U8192, 8192, unsigned, u8192);
27+
macro_impl!($, U64, 64, unsigned, u64);
28+
macro_impl!($, U128, 128, unsigned, u128);
29+
macro_impl!($, U256, 256, unsigned, u256);
30+
macro_impl!($, U512, 512, unsigned, u512);
31+
macro_impl!($, U1024, 1024, unsigned, u1024);
32+
// macro_impl!($, U2048, 2048, unsigned, u2048);
33+
// macro_impl!($, U4096, 4096, unsigned, u4096);
34+
// macro_impl!($, U8192, 8192, unsigned, u8192);
3535

36-
macro_impl!(I64, 64, signed, i64);
37-
macro_impl!(I128, 128, signed, i128);
38-
macro_impl!(I256, 256, signed, i256);
39-
macro_impl!(I512, 512, signed, i512);
40-
macro_impl!(I1024, 1024, signed, i1024);
41-
// macro_impl!(I2048, 2048, signed, i2048);
42-
// macro_impl!(I4096, 4096, signed, i4096);
43-
// macro_impl!(I8192, 8192, signed, i8192);
36+
macro_impl!($, I64, 64, signed, i64);
37+
macro_impl!($, I128, 128, signed, i128);
38+
macro_impl!($, I256, 256, signed, i256);
39+
macro_impl!($, I512, 512, signed, i512);
40+
macro_impl!($, I1024, 1024, signed, i1024);
41+
// macro_impl!($, I2048, 2048, signed, i2048);
42+
// macro_impl!($, I4096, 4096, signed, i4096);
43+
// macro_impl!($, I8192, 8192, signed, i8192);

src/bint/uint/convert/from_uint.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,13 @@ macro_rules! try_from_uint_impl {
1919
#[inline(always)]
2020
#[doc = doc::convert::from!($uint U 256)]
2121
pub const fn $from_uint(uint: $uint) -> Result<Self, ParseError> {
22-
let uint_bits = $uint::BITS as usize - uint.leading_zeros() as usize;
22+
let bits = $uint::BITS as usize - uint.leading_zeros() as usize;
2323

24-
if uint_bits > Self::BITS as usize {
24+
if bits > Self::BITS as usize {
2525
return Err(ParseError::PosOverflow);
2626
}
2727

28-
let mut digits = [0; N];
29-
let mut i = 0;
30-
while i << DIGIT_BIT_SHIFT < uint_bits {
31-
let d = (uint >> (i << DIGIT_BIT_SHIFT)) as Digit;
32-
if d != 0 {
33-
digits[i] = d;
34-
}
35-
i += 1;
36-
}
28+
let digits = $crate::bint::convert::utils::digits_from_int_impl!(uint, $uint, bits);
3729

3830
Ok(Self::from_digits(digits))
3931
}

tests/int/common.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
pub(crate) mod from;
2+
3+
// Test skeleton
4+
// mod _skeleton;

0 commit comments

Comments
 (0)