use crate::{util::is_digit, *};
use flint_sys::fmpz;
use std::ffi::CString;
use std::str::FromStr;
impl FromStr for Integer {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if !s.chars().all(is_digit) {
return Err("Input is not an integer.");
}
if let Ok(c_str) = CString::new(s) {
let mut z = Integer::default();
unsafe {
let res = flint_sys::fmpz::fmpz_set_str(
z.as_mut_ptr(),
c_str.as_ptr(),
10
);
if res == 0 {
Ok(z)
} else {
Err("Error in conversion.")
}
}
} else {
Err("String contains 0 byte.")
}
}
}
impl_from_unsafe! {
None
Integer, u64 {usize u64 u32 u16 u8}
fmpz::fmpz_set_ui
}
impl_from_unsafe! {
None
Integer, i64 {isize i64 i32 i16 i8}
fmpz::fmpz_set_si
}
impl_from_unsafe! {
None
Integer, IntMod
fmpz::fmpz_set
}