use crate::machine::machine_errors::*;
use dashu::base::Abs;
+use dashu::base::BitTest;
+use num_order::NumOrd;
use ordered_float::*;
use std::cell::Cell;
pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number {
match n {
&Number::Integer(i) => {
- if let Some(n) = i.to_i64() {
- fixnum!(Number, n, arena)
+ let result = i.value().try_into();
+ if let Ok(value) = result{
+ fixnum!(Number, value, arena)
} else {
*n
}
&Number::Rational(ref r) => {
let (_, floor) = (r.fract(), r.floor());
- if let Some(floor) = floor.to_i64() {
- fixnum!(Number, floor, arena)
+ let result = floor.clone().try_into();
+ if let Ok(value) = result{
+ fixnum!(Number, value, arena)
} else {
Number::Integer(arena_alloc!(floor, arena))
}
fn eq(&self, rhs: &Self) -> bool {
match (self, rhs) {
(&Number::Fixnum(n1), &Number::Fixnum(n2)) => n1.eq(&n2),
- (&Number::Fixnum(n1), &Number::Integer(ref n2)) => n1.get_num().eq(&**n2),
- (&Number::Integer(ref n1), &Number::Fixnum(n2)) => (&**n1).eq(&n2.get_num()),
- (&Number::Fixnum(n1), &Number::Rational(ref n2)) => n1.get_num().eq(&**n2),
- (&Number::Rational(ref n1), &Number::Fixnum(n2)) => (&**n1).eq(&n2.get_num()),
+ (&Number::Fixnum(n1), &Number::Integer(ref n2)) => n1.get_num().num_eq(&**n2),
+ (&Number::Integer(ref n1), &Number::Fixnum(n2)) => (&**n1).num_eq(&n2.get_num()),
+ (&Number::Fixnum(n1), &Number::Rational(ref n2)) => Integer::from(n1.get_num()).num_eq(&**n2),
+ (&Number::Rational(ref n1), &Number::Fixnum(n2)) => (&**n1).num_eq(&Integer::from(n2.get_num())),
(&Number::Fixnum(n1), &Number::Float(n2)) => OrderedFloat(n1.get_num() as f64).eq(&n2),
(&Number::Float(n1), &Number::Fixnum(n2)) => n1.eq(&OrderedFloat(n2.get_num() as f64)),
(&Number::Integer(ref n1), &Number::Integer(ref n2)) => n1.eq(n2),
}
#[cfg(not(feature = "num"))]
{
- &**n1 == &**n2
+ (&**n1).num_eq(&**n2)
}
}
(&Number::Rational(ref n1), &Number::Integer(ref n2)) => {
}
#[cfg(not(feature = "num"))]
{
- &**n1 == &**n2
+ (&**n1).num_eq(&**n2)
}
}
(&Number::Rational(ref n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64().value()).eq(&n2),
(n as usize).partial_cmp(rhs)
}
}
- Number::Integer(n) => (&**n).partial_cmp(rhs),
- Number::Rational(r) => (&**r).partial_cmp(rhs),
+ Number::Integer(n) => Some((&**n).num_cmp(rhs)),
+ Number::Rational(r) => Some((&**r).num_cmp(&Integer::from(*rhs))),
Number::Float(f) => f.partial_cmp(&OrderedFloat(*rhs as f64)),
}
}
(n as usize).eq(rhs)
}
}
- Number::Integer(n) => (&**n).eq(rhs),
- Number::Rational(r) => (&**r).eq(rhs),
+ Number::Integer(n) => (&**n).num_eq(rhs),
+ Number::Rational(r) => (&**r).num_eq(&Integer::from(*rhs)),
Number::Float(f) => f.eq(&OrderedFloat(*rhs as f64)),
}
}
}
#[cfg(not(feature = "num"))]
{
- (&*n1).partial_cmp(&*n2).unwrap_or(Ordering::Less)
+ (&*n1).num_partial_cmp(&*n2).unwrap_or(Ordering::Less)
}
}
(&Number::Rational(n1), &Number::Integer(n2)) => {
}
#[cfg(not(feature = "num"))]
{
- (&*n1).partial_cmp(&*n2).unwrap_or(Ordering::Less)
+ (&*n1).num_partial_cmp(&*n2).unwrap_or(Ordering::Less)
}
}
(&Number::Rational(n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64().value()).cmp(&n2),
pub(crate) fn binary_pow(mut n: Integer, power: &Integer) -> Integer {
let mut power = Integer::from(power.abs());
- if power == 0 {
+ if power.num_eq(&0) {
return Integer::from(1);
}
let mut oddand = Integer::from(1);
- while power > 1 {
- if power.is_odd() {
+ while power.num_gt(&1) {
+ if power.bit(0) {
oddand *= &n;
}
match self.op_dir.get(&(atom!("rdiv"), Fixity::In)) {
Some(op_desc) => {
- if r.is_integer() {
+ if r.denominator().is_one() {
let output_str = format!("{}", r);
push_space_if_amb!(self, &output_str, {
Ok(Number::Integer(n)) => &*n >= &Integer::from(0),
Ok(Number::Fixnum(n)) => n.get_num() >= 0,
Ok(Number::Float(f)) => f >= OrderedFloat(0f64),
- Ok(Number::Rational(r)) => &*r >= &Integer::from(0),
+ Ok(Number::Rational(r)) => &*r >= &Rational::from(0),
_ => false,
}
}) && needs_bracketing(op_desc, op)
}
*/
Literal::Integer(ref n) => {
- if let Some(n) = n.to_isize() {
- Fixnum::build_with_checked(n as i64).map(|n| {
+ let result = n.value().try_into();
+ if let Ok(value) = result {
+ Fixnum::build_with_checked(value).map(|n| {
constants.push(Literal::Fixnum(n));
}).unwrap();
}
use dashu::base::Abs;
+use dashu::base::DivRem;
use dashu::base::Gcd;
use dashu::integer::IBig;
use divrem::*;
+use num_order::NumOrd;
use crate::arena::*;
use crate::arithmetic::*;
}
}
(Number::Fixnum(n1), Number::Integer(n2)) => {
- if &*n2 > &n1.get_num() {
+ if (&*n2).num_gt(&n1.get_num()) {
Ok(Number::Integer(n2))
} else {
Ok(Number::Fixnum(n1))
}
}
(Number::Integer(n1), Number::Fixnum(n2)) => {
- if &*n1 > &n2.get_num() {
+ if (&*n1).num_gt(&n2.get_num()) {
Ok(Number::Integer(n1))
} else {
Ok(Number::Fixnum(n2))
}
}
(Number::Fixnum(n1), Number::Integer(n2)) => {
- if &*n2 < &n1.get_num() {
+ if (&*n2).num_lt(&n1.get_num()) {
Ok(Number::Integer(n2))
} else {
Ok(Number::Fixnum(n1))
}
}
(Number::Integer(n1), Number::Fixnum(n2)) => {
- if &*n1 < &n2.get_num() {
+ if (&*n1).num_lt(&n2.get_num()) {
Ok(Number::Integer(n1))
} else {
Ok(Number::Fixnum(n2))
r1: TypedArenaPtr<Rational>,
r2: TypedArenaPtr<Rational>,
) -> Result<Rational, MachineStubGen> {
- if &*r2 == &0 {
+ if &*r2 == &Rational::from(0) {
let stub_gen = || {
let rdiv_atom = atom!("rdiv");
functor_stub(rdiv_atom, 2)
}
}
(Number::Fixnum(n1), Number::Integer(n2)) => {
- if &*n2 == &0 {
+ if (&*n2).num_eq(&0) {
Err(zero_divisor_eval_error(stub_gen))
} else {
Ok(Number::arena_from(Integer::from(n1) / &*n2, arena))
}
}
(Number::Integer(n1), Number::Integer(n2)) => {
- if &*n2 == &0 {
+ if (&*n2).num_eq(&0) {
Err(zero_divisor_eval_error(stub_gen))
} else {
Ok(Number::arena_from(
- <(Integer, Integer)>::from(n1.div_rem_floor_ref(&*n2)).0,
+ <(Integer, Integer)>::from(n1.value().div_rem(&*n2)).0,
arena,
))
}
(Number::Fixnum(n1), Number::Integer(n2)) => {
let n1 = Integer::from(n1.get_num());
- match n2.to_usize() {
- Some(n2) => Ok(Number::arena_from(n1 >> n2, arena)),
- _ => {
- Ok(Number::arena_from(n1 >> usize::max_value(), arena))
- },
+ let result: Result<usize, _> = n2.value().try_into();
+
+ match result {
+ Ok(n2) => {
+ Ok(Number::arena_from(n1 >> n2, arena))
+ }
+ Err(_) => {
+ Ok(Number::arena_from(n1 >> usize::max_value(), arena))
+ }
}
}
(Number::Integer(n1), Number::Fixnum(n2)) => match usize::try_from(n2.get_num()) {
Ok(Number::arena_from(Integer::from(&*n1 >> usize::max_value()),arena))
},
},
- (Number::Integer(n1), Number::Integer(n2)) => match n2.to_usize() {
- Some(n2) => Ok(Number::arena_from(Integer::from(&*n1 >> n2), arena)),
- _ => {
- Ok(Number::arena_from(Integer::from(&*n1 >> usize::max_value()), arena))
- },
+ (Number::Integer(n1), Number::Integer(n2)) => {
+ let result: Result<usize, _> = n2.value().try_into();
+
+ match result {
+ Ok(n2) => {
+ Ok(Number::arena_from(Integer::from(&*n1 >> n2), arena))
+ }
+ Err(_) => {
+ Ok(Number::arena_from(Integer::from(&*n1 >> usize::max_value()), arena))
+ }
+ }
},
(Number::Integer(_), n2) => Err(numerical_type_error(ValidType::Integer, n2, stub_gen)),
(Number::Fixnum(_), n2) => Err(numerical_type_error(ValidType::Integer, n2, stub_gen)),
(Number::Fixnum(n1), Number::Integer(n2)) => {
let n1 = Integer::from(n1.get_num());
- match n2.to_u32() {
- Some(n2) => Ok(Number::arena_from(n1.to_u64().unwrap() << n2, arena)),
+ match n2.value().try_into() as Result<u32, _> {
+ Ok(n2) => {
+ let n1: u64 = n1.try_into().unwrap();
+ Ok(Number::arena_from(n1 << n2, arena))
+ },
_ => {
Ok(Number::arena_from(n1 << usize::max_value(), arena))
}
Ok(Number::arena_from(Integer::from(&*n1 << usize::max_value()),arena))
}
},
- (Number::Integer(n1), Number::Integer(n2)) => match n2.to_u32() {
- Some(n2) => Ok(Number::arena_from(Integer::from(n1.to_u64().unwrap() << n2), arena)),
+ (Number::Integer(n1), Number::Integer(n2)) => match n2.value().try_into() as Result<u32, _> {
+ Ok(n2) => {
+ let n1: u64 = n1.value().try_into().unwrap();
+ Ok(Number::arena_from(Integer::from(n1 << n2), arena))
+ },
_ => {
Ok(Number::arena_from(Integer::from(&*n1 << usize::max_value()),arena))
}
}
}
(Number::Fixnum(n1), Number::Integer(n2)) => {
- if &*n2 == &0 {
+ if (&*n2).num_eq(&0) {
Err(zero_divisor_eval_error(stub_gen))
} else {
let n1 = Integer::from(n1.get_num());
Ok(Number::arena_from(
- <(Integer, Integer)>::from(n1.div_rem_floor_ref(&*n2)).1,
+ <(Integer, Integer)>::from(n1.div_rem(&*n2)).1,
arena,
))
}
} else {
let n2 = Integer::from(n2_i);
Ok(Number::arena_from(
- <(Integer, Integer)>::from(n1.div_rem_floor_ref(&n2)).1,
+ <(Integer, Integer)>::from(n1.value().div_rem(&n2)).1,
arena,
))
}
}
(Number::Integer(x), Number::Integer(y)) => {
- if &*y == &0 {
+ if (&*y).num_eq(&0) {
Err(zero_divisor_eval_error(stub_gen))
} else {
Ok(Number::arena_from(
- <(Integer, Integer)>::from(x.div_rem_floor_ref(&*y)).1,
+ <(Integer, Integer)>::from(x.value().div_rem(&*y)).1,
arena,
))
}
}
}
(Number::Fixnum(n1), Number::Integer(n2)) => {
- if &*n2 == &0 {
+ if (&*n2).num_eq(&0) {
Err(zero_divisor_eval_error(stub_gen))
} else {
let n1 = Integer::from(n1.get_num());
}
}
(Number::Integer(n1), Number::Integer(n2)) => {
- if &*n2 == &0 {
+ if (&*n2).num_eq(&0) {
Err(zero_divisor_eval_error(stub_gen))
} else {
Ok(Number::arena_from(Integer::from(&*n1 % &*n2), arena))
}
(Number::Integer(n1), Number::Integer(n2)) => {
let n1_clone: Integer = (*n1).clone();
- Ok(Number::arena_from(Integer::from(n1_clone.gcd(&Integer::from(n2.to_isize().unwrap()))) as IBig, arena))
+ let n2: isize = n2.value().try_into().unwrap();
+ Ok(Number::arena_from(Integer::from(n1_clone.gcd(&Integer::from(n2))) as IBig, arena))
}
(Number::Float(f), _) | (_, Number::Float(f)) => {
let n = Number::Float(f);
let extract_integer = |s: usize| -> Option<usize> {
match Number::try_from(heap[s]) {
Ok(Number::Fixnum(n)) => usize::try_from(n.get_num()).ok(),
- Ok(Number::Integer(n)) => n.to_usize(),
+ Ok(Number::Integer(n)) => {
+ let value: usize = n.value().try_into().unwrap();
+ Some(value)
+ },
_ => None,
}
};
let arity = self.deref_register(3);
let arity = match Number::try_from(arity) {
- Ok(Number::Integer(n)) if &*n >= &Integer::from(0) && &*n <= &Integer::from(MAX_ARITY) => Ok(n.to_usize().unwrap()),
+ Ok(Number::Integer(n)) if &*n >= &Integer::from(0) && &*n <= &Integer::from(MAX_ARITY) => {
+ let value: usize = n.value().try_into().unwrap();
+ Ok(value)
+ },
Ok(Number::Fixnum(n)) if n.get_num() >= 0 && n.get_num() <= MAX_ARITY as i64 => {
Ok(usize::try_from(n.get_num()).unwrap())
}
.store(self.machine_st.deref(self.machine_st[temp_v!(3)]));
let target_pos = match Number::try_from(target_pos) {
- Ok(Number::Integer(n)) => n.to_usize().unwrap(),
+ Ok(Number::Integer(n)) => {
+ let value: usize = n.value().try_into().unwrap();
+ value
+ },
Ok(Number::Fixnum(n)) => usize::try_from(n.get_num()).unwrap(),
_ => unreachable!(),
};
}
}
Ok(Number::Integer(n)) => {
- if let Some(n) = n.to_usize() {
- printer.max_depth = n;
+ let result = n.value().try_into();
+
+ if let Ok(value) = result {
+ printer.max_depth = value;
} else {
self.fail = true;
return Ok(None);
use crate::parser::dashu::{Integer, Rational};
use indexmap::IndexSet;
+use num_order::NumOrd;
use std::cmp::Ordering;
use std::convert::TryFrom;
pub fn unify_big_int(&mut self, n1: TypedArenaPtr<Integer>, value: HeapCellValue) {
let mut unifier = DefaultUnifier::from(self);
- unifier.unify_big_num(n1, value);
+ unifier.unify_big_integer(n1, value);
}
pub fn unify_rational(&mut self, n1: TypedArenaPtr<Rational>, value: HeapCellValue) {
let mut unifier = DefaultUnifier::from(self);
- unifier.unify_big_num(n1, value);
+ unifier.unify_big_rational(n1, value);
}
pub fn unify_f64(&mut self, f1: F64Ptr, value: HeapCellValue) {
let n = match n {
Number::Fixnum(n) => n.get_num() as usize,
- Number::Integer(n) if *n >= 0 && *n <= std::usize::MAX => n.to_usize().unwrap(),
+ Number::Integer(n) if (*n).num_ge(&0) && (*n).num_le(&std::usize::MAX) => {
+ let value: usize = n.value().try_into().unwrap();
+ value
+ },
_ => {
self.fail = true;
return Ok(());
let err = self.domain_error(DomainErrorType::NotLessThanZero, n);
return Err(self.error_form(err, stub_gen()));
}
- Ok(Number::Rational(n)) => n.numerator().to_i64().unwrap(),
+ Ok(Number::Rational(n)) => {
+ let value: i64 = n.numerator().try_into().unwrap();
+ value
+ },
Ok(Number::Fixnum(n)) => n.get_num(),
- Ok(Number::Integer(n)) => n.to_i64().unwrap(),
+ Ok(Number::Integer(n)) => {
+ let value: i64 = n.value().try_into().unwrap();
+ value
+ },
Err(_) => {
return type_error(arity);
}
Err(_) => {}
},
Ok(Number::Integer(n)) => {
- if let Some(b) = n.to_u8() {
- bytes.push(b);
- }
+ let b: u8 = n.value().try_into().unwrap();
+
+ bytes.push(b);
}
_ => {}
}
let name = terms.pop().unwrap();
let arity = match arity {
- Term::Literal(_, Literal::Integer(n)) => n.to_usize(),
+ Term::Literal(_, Literal::Integer(n)) => {
+ let value: usize = n.value().try_into().unwrap();
+ Some(value)
+ },
Term::Literal(_, Literal::Fixnum(n)) => usize::try_from(n.get_num()).ok(),
_ => None,
}.ok_or(CompilationError::InvalidModuleExport)?;
use crate::parser::ast::*;
use crate::parser::parser::*;
+use dashu::integer::Sign;
use dashu::integer::UBig;
use lazy_static::lazy_static;
+use num_order::NumOrd;
use crate::arena::*;
use crate::atom_table::*;
let max_steps_n = match max_steps {
Ok(Number::Fixnum(n)) => Some(n.get_num()),
- Ok(Number::Integer(n)) => n.to_i64(),
+ Ok(Number::Integer(n)) => {
+ let value: i64 = n.value().try_into().unwrap();
+
+ Some(value)
+ },
_ => None,
};
}
}
Ok(Number::Integer(n)) => {
- if let Some(c) = n.to_u32().and_then(std::char::from_u32) {
+ let n: u32 = n.value().try_into().unwrap();
+ if let Some(c) = std::char::from_u32(n) {
string.push(c);
continue;
}
let reg = self.deref_register(2);
let n = match Number::try_from(reg) {
Ok(Number::Fixnum(n)) => usize::try_from(n.get_num()).ok(),
- Ok(Number::Integer(n)) => n.to_usize(),
+ Ok(Number::Integer(n)) => {
+ let value: usize = n.value().try_into().unwrap();
+ Some(value)
+ },
_ => {
unreachable!()
}
addr if addr.is_var() => addr,
addr => match Number::try_from(addr) {
Ok(Number::Integer(n)) => {
- if let Some(nb) = n.to_u8() {
- fixnum_as_cell!(Fixnum::build_with(nb as i64))
+ let result: Result<u8, _> = n.value().try_into();
+ if let Ok(value) = result {
+ fixnum_as_cell!(Fixnum::build_with(value as i64))
} else {
let err = self.machine_st.type_error(ValidType::InByte, addr);
return Err(self.machine_st.error_form(err, stub_gen()));
_ => {
match Number::try_from(a2) {
Ok(Number::Integer(n)) => {
- let n = n
- .to_u32()
- .and_then(|n| std::char::from_u32(n).and_then(|_| Some(n)));
+ let n: u32 = n.value().try_into().unwrap();
+
+ let n = std::char::from_u32(n).and_then(|_| Some(n));
if let Some(n) = n {
fixnum_as_cell!(Fixnum::build_with(n as i64))
_ => {
match Number::try_from(a2) {
Ok(Number::Integer(n)) => {
- let c = match n.to_u32().and_then(std::char::from_u32) {
+ let n: u32 = n.value().try_into().unwrap();
+ let n = std::char::from_u32(n);
+ let c = match n {
Some(c) => c,
_ => {
let err = self.machine_st.representation_error(RepFlag::CharacterCode);
} else {
match Number::try_from(addr) {
Ok(Number::Integer(n)) => {
- if let Some(c) = n.to_u32().and_then(|c| char::try_from(c).ok()) {
+ let n: u32 = n.value().try_into().unwrap();
+ let n = char::try_from(n);
+ if let Some(c) = n.ok() {
write!(&mut stream, "{}", c).unwrap();
return Ok(());
}
} else {
match Number::try_from(addr) {
Ok(Number::Integer(n)) => {
- if let Some(nb) = n.to_u8() {
- match stream.write(&mut [nb]) {
- Ok(1) => {
- return Ok(());
- }
- _ => {
- let err = self.machine_st.existence_error(
- ExistenceError::Stream(stream_as_cell!(stream))
- );
+ let n: u8 = n.value().try_into().unwrap();
+
+ match n {
+ nb => {
+ match stream.write(&mut [nb]) {
+ Ok(1) => {
+ return Ok(());
+ }
+ _ => {
+ let err = self.machine_st.existence_error(
+ ExistenceError::Stream(stream_as_cell!(stream))
+ );
- return Err(self.machine_st.error_form(err, stub_gen()));
+ return Err(self.machine_st.error_form(err, stub_gen()));
+ }
}
}
}
addr
} else {
match Number::try_from(addr) {
- Ok(Number::Integer(ref n)) if **n == -1_i64 => {
+ Ok(Number::Integer(ref n)) if (**n).num_eq(&1_i64) => {
fixnum_as_cell!(Fixnum::build_with(-1))
}
Ok(Number::Fixnum(n)) if n.get_num() == -1_i64 => {
fixnum_as_cell!(Fixnum::build_with(-1))
}
Ok(Number::Integer(n)) => {
- if let Some(nb) = n.to_u8() {
- fixnum_as_cell!(Fixnum::build_with(nb as i64))
+ let n: Result<u8, _> = n.value().try_into();
+
+ if let Ok(value) = n {
+ fixnum_as_cell!(Fixnum::build_with(value as i64))
} else {
let err = self.machine_st.type_error(ValidType::InByte, addr);
return Err(self.machine_st.error_form(err, stub_gen()));
let num = match Number::try_from(self.deref_register(2)) {
Ok(Number::Fixnum(n)) => usize::try_from(n.get_num()).unwrap(),
- Ok(Number::Integer(n)) => match n.to_usize() {
- Some(u) => u,
+ Ok(Number::Integer(n)) => match n.value().try_into() as Result<usize, _> {
+ Ok(u) => {
+ u
+ }
_ => {
self.machine_st.fail = true;
return Ok(());
} else {
match Number::try_from(addr) {
Ok(Number::Integer(n)) => {
- let n = n
- .to_u32()
- .and_then(|n| std::char::from_u32(n));
+ let n: u32 = n.value().try_into().unwrap();
+ let n = std::char::from_u32(n);
if let Some(n) = n {
fixnum_as_cell!(Fixnum::build_with(n as i64))
let arity = match Number::try_from(arity) {
Ok(Number::Fixnum(n)) => Some(n.get_num() as usize),
- Ok(Number::Integer(n)) => n.to_usize(),
+ Ok(Number::Integer(n)) => {
+ let value: usize = n.value().try_into().unwrap();
+ Some(value)
+ },
_ => None,
};
let n = match Number::try_from(len) {
Ok(Number::Fixnum(n)) => n.get_num() as usize,
- Ok(Number::Integer(n)) => match n.to_usize() {
- Some(n) => n,
- None => {
+ Ok(Number::Integer(n)) => match n.value().try_into() as Result<usize, _> {
+ Ok(n) => n,
+ Err(_) => {
let err = self.machine_st.resource_error(len);
return Err(self.machine_st.error_form(err, stub_gen()));
}
let status_code = self.deref_register(2);
let status_code: u16 = match Number::try_from(status_code) {
Ok(Number::Fixnum(n)) => n.get_num() as u16,
- Ok(Number::Integer(n)) => match n.to_u16() {
- Some(u) => u,
- _ => {
- self.machine_st.fail = true;
- return Ok(());
- }
- }
+ Ok(Number::Integer(n)) => {
+ let n: Result<u16, _> = n.value().try_into();
+
+ if let Ok(value) = n {
+ value
+ } else {
+ self.machine_st.fail = true;
+ return Ok(());
+ }
+ }
_ => unreachable!()
};
let stub_gen = || functor_stub(atom!("http_listen"), 2);
let specifier = cell_as_atom_cell!(self.deref_register(2)).get_name();
let priority = match Number::try_from(priority) {
- Ok(Number::Integer(n)) => n.to_u16().unwrap(),
+ Ok(Number::Integer(n)) => {
+ let n: u16 = n.value().try_into().unwrap();
+ n
+ },
Ok(Number::Fixnum(n)) => u16::try_from(n.get_num()).unwrap(),
_ => {
unreachable!();
let addr = self.deref_register(1);
let b = match Number::try_from(addr) {
- Ok(Number::Integer(n)) => n.to_usize(),
+ Ok(Number::Integer(n)) => {
+ let value: usize = n.value().try_into().unwrap();
+ Some(value)
+ },
Ok(Number::Fixnum(n)) => usize::try_from(n.get_num()).ok(),
_ => {
self.machine_st.fail = true;
let code = match Number::try_from(code) {
Ok(Number::Fixnum(n)) => u8::try_from(n.get_num()).unwrap(),
- Ok(Number::Integer(n)) => n.to_u8().unwrap(),
+ Ok(Number::Integer(n)) => {
+ let n: u8 = n.value().try_into().unwrap();
+ n
+ },
Ok(Number::Rational(r)) => {
// n has already been confirmed as an integer, and
// internally, Rational is assumed reduced, so its
// denominator must be 1.
- r.numerator().to_u8().unwrap()
+ let r = r.numerator().try_into().unwrap();
+ r
}
_ => {
unreachable!()
let n = match Number::try_from(a2) {
Ok(Number::Fixnum(bp)) => bp.get_num() as usize,
- Ok(Number::Integer(n)) => n.to_usize().unwrap(),
+ Ok(Number::Integer(n)) => {
+ let value: usize = n.value().try_into().unwrap();
+ value
+ },
_ => {
let stub = functor_stub(
atom!("call_with_inference_limit"),
let a3 = self.deref_register(3);
let count = self.machine_st.cwil.add_limit(n, bp);
- if let Some(count) = count.to_i64() {
- self.machine_st.unify_fixnum(Fixnum::build_with(count), a3);
+ let result = count.try_into();
+ if let Ok(value) = result{
+ self.machine_st.unify_fixnum(Fixnum::build_with(value), a3);
} else {
let count = arena_alloc!(count.clone(), &mut self.machine_st.arena);
self.machine_st.unify_big_int(count, a3);
let arity = match Number::try_from(a3) {
Ok(Number::Fixnum(n)) => n.get_num() as usize,
Ok(Number::Integer(n)) => {
- if let Some(n) = n.to_usize() {
- n
+ let result = n.value().try_into();
+
+ if let Ok(value) = result {
+ value
} else {
return false;
}
let count = self.machine_st.cwil.remove_limit(bp).clone();
- if let Some(count) = count.to_i64() {
- self.machine_st.unify_fixnum(Fixnum::build_with(count), a2);
+ let result = count.clone().try_into();
+ if let Ok(value) = result{
+ self.machine_st.unify_fixnum(Fixnum::build_with(value), a2);
} else {
let count = arena_alloc!(count.clone(), &mut self.machine_st.arena);
self.machine_st.unify_big_int(count, a2);
match Number::try_from(seed) {
Ok(Number::Fixnum(n)) => {
- let _: StdRng = SeedableRng::seed_from_u64(Integer::from(n).to_u64().unwrap());
+ let n: u64 = Integer::from(n).try_into().unwrap();
+ let _: StdRng = SeedableRng::seed_from_u64(n);
},
Ok(Number::Integer(n)) => {
- let _: StdRng = SeedableRng::seed_from_u64(n.to_u64().unwrap());
+ let n: u64 = n.value().try_into().unwrap();
+ let _: StdRng = SeedableRng::seed_from_u64(n);
},
Ok(Number::Rational(n)) => {
if n.denominator() == &UBig::from(1 as u32) {
- let _: StdRng = SeedableRng::seed_from_u64(n.numerator().to_u64().unwrap());
+ let n: u64 = n.numerator().try_into().unwrap();
+ let _: StdRng = SeedableRng::seed_from_u64(n);
}
},
_ => {
let position = match Number::try_from(position) {
Ok(Number::Fixnum(n)) => n.get_num() as u64,
Ok(Number::Integer(n)) => {
- if let Some(n) = n.to_u64() {
+ let n: Result<u64, _> = n.value().try_into();
+ if let Ok(n) = n {
n
} else {
self.machine_st.fail = true;
let arity = match Number::try_from(arity) {
Ok(Number::Fixnum(n)) => n.get_num() as usize,
- Ok(Number::Integer(n)) => n.to_usize().unwrap(),
+ Ok(Number::Integer(n)) => {
+ let value: usize = n.value().try_into().unwrap();
+ value
+ },
_ => {
unreachable!()
}
let index_ptr = self.deref_register(1);
let index_ptr = match Number::try_from(index_ptr) {
Ok(Number::Fixnum(n)) => n.get_num() as usize,
- Ok(Number::Integer(n)) => n.to_usize().unwrap(),
+ Ok(Number::Integer(n)) => {
+ let value: usize = n.value().try_into().unwrap();
+ value
+ },
_ => {
unreachable!()
}
let length = match Number::try_from(length) {
Ok(Number::Fixnum(n)) => usize::try_from(n.get_num()).unwrap(),
- Ok(Number::Integer(n)) => match n.to_usize() {
- Some(u) => u,
+ Ok(Number::Integer(n)) => match n.value().try_into() as Result<usize, _> {
+ Ok(u) => u,
_ => {
self.machine_st.fail = true;
return;
let iterations = match Number::try_from(iterations) {
Ok(Number::Fixnum(n)) => u64::try_from(n.get_num()).unwrap(),
- Ok(Number::Integer(n)) => match n.to_u64() {
- Some(i) => i,
- None => {
- self.machine_st.fail = true;
- return;
+ Ok(Number::Integer(n)) => {
+ let n: Result<u64, _> = n.value().try_into();
+ match n {
+ Ok(i) => i,
+ _ => {
+ self.machine_st.fail = true;
+ return;
+ }
}
},
_ => {
Number::Fixnum(Fixnum::build_with(n.get_num().count_ones() as i64))
}
Ok(Number::Integer(n)) => {
- Number::arena_from(n.count_ones(), &mut self.machine_st.arena)
+ let value: usize = if n.sign() == Sign::Positive {
+ UBig::from(n.value().into_parts().1).count_ones()
+ } else { 0 };
+ Number::arena_from(value, &mut self.machine_st.arena)
}
_ => {
unreachable!()