pub struct JsBigInt(/* private fields */);
Available on crate feature
napi-6
only.Expand description
The type of JavaScript
BigInt
values.
§Example
The following shows an example of adding two numbers that exceed
Number.MAX_SAFE_INTEGER
.
fn add_bigint(mut cx: FunctionContext) -> JsResult<JsBigInt> {
// Get references to the `BigInt` arguments
let a = cx.argument::<JsBigInt>(0)?;
let b = cx.argument::<JsBigInt>(1)?;
// Convert the `BigInt` to `i64`
let a = a.to_i64(&mut cx)
// On failure, convert err to a `RangeError` exception
.or_throw(&mut cx)?;
let b = b.to_i64(&mut cx).or_throw(&mut cx)?;
let sum = a + b;
// Create a `BigInt` from the `i64` sum
Ok(JsBigInt::from_i64(&mut cx, sum))
}
Implementations§
Source§impl JsBigInt
impl JsBigInt
pub const POSITIVE: Sign = Sign::Positive
pub const NEGATIVE: Sign = Sign::Negative
Sourcepub fn from_digits_le<'cx, C>(
cx: &mut C,
sign: Sign,
digits: &[u64],
) -> Handle<'cx, Self>where
C: Context<'cx>,
pub fn from_digits_le<'cx, C>(
cx: &mut C,
sign: Sign,
digits: &[u64],
) -> Handle<'cx, Self>where
C: Context<'cx>,
Creates a BigInt
from a signed magnitude. The BigInt
is calculated as:
Sign * (digit[0] x (2⁶⁴)⁰ + digit[0] x (2⁶⁴)¹ + digit[0] x (2⁶⁴)² ...)
§Example
// Creates a `BigInt` equal to `2n ** 128n`
let value: Handle<JsBigInt> = JsBigInt::from_digits_le(
&mut cx,
JsBigInt::POSITIVE,
&[0, 0, 1],
);
Sourcepub fn to_i64<'cx, C>(&self, cx: &mut C) -> Result<i64, RangeError<i64>>where
C: Context<'cx>,
pub fn to_i64<'cx, C>(&self, cx: &mut C) -> Result<i64, RangeError<i64>>where
C: Context<'cx>,
Sourcepub fn to_u64<'cx, C>(&self, cx: &mut C) -> Result<u64, RangeError<u64>>where
C: Context<'cx>,
pub fn to_u64<'cx, C>(&self, cx: &mut C) -> Result<u64, RangeError<u64>>where
C: Context<'cx>,
Reads a u64
from a BigInt
.
Fails on overflow or a negative sign.
Sourcepub fn to_i128<'cx, C>(&self, cx: &mut C) -> Result<i128, RangeError<i128>>where
C: Context<'cx>,
pub fn to_i128<'cx, C>(&self, cx: &mut C) -> Result<i128, RangeError<i128>>where
C: Context<'cx>,
Reads an i128
from a BigInt
.
Fails on overflow and underflow.
Sourcepub fn to_u128<'cx, C>(&self, cx: &mut C) -> Result<u128, RangeError<u128>>where
C: Context<'cx>,
pub fn to_u128<'cx, C>(&self, cx: &mut C) -> Result<u128, RangeError<u128>>where
C: Context<'cx>,
Reads a u128
from a BigInt
.
Fails on overflow or a negative sign.
Sourcepub fn to_digits_le<'cx, C>(&self, cx: &mut C) -> (Sign, Vec<u64>)where
C: Context<'cx>,
pub fn to_digits_le<'cx, C>(&self, cx: &mut C) -> (Sign, Vec<u64>)where
C: Context<'cx>,
Gets a signed magnitude pair from a BigInt
.
The BigInt
is calculated as:
Sign * (digit[0] x (2⁶⁴)⁰ + digit[0] x (2⁶⁴)¹ + digit[0] x (2⁶⁴)² ...)
Sourcepub fn read_digits_le<'cx, C>(
&self,
cx: &mut C,
digits: &mut [u64],
) -> (Sign, usize)where
C: Context<'cx>,
pub fn read_digits_le<'cx, C>(
&self,
cx: &mut C,
digits: &mut [u64],
) -> (Sign, usize)where
C: Context<'cx>,
Gets the sign from a BigInt
and reads digits into a buffer.
The returned usize
is the total number of digits in the BigInt
.
§Example
Read a u256
from a BigInt
.
fn bigint_to_u256(cx: &mut FunctionContext, n: Handle<JsBigInt>) -> NeonResult<[u64; 4]> {
let mut digits = [0; 4];
let (sign, num_digits) = n.read_digits_le(cx, &mut digits);
if sign == JsBigInt::NEGATIVE {
return cx.throw_error("Underflow reading u256 from BigInt");
}
if num_digits > digits.len() {
return cx.throw_error("Overflow reading u256 from BigInt");
}
Ok(digits)
}
Trait Implementations§
Source§impl Value for JsBigInt
impl Value for JsBigInt
Auto Trait Implementations§
impl Freeze for JsBigInt
impl RefUnwindSafe for JsBigInt
impl !Send for JsBigInt
impl !Sync for JsBigInt
impl Unpin for JsBigInt
impl UnwindSafe for JsBigInt
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more