#![cfg_attr(not(feature = "std"), no_std)]
mod builtin;
mod integer;
pub use integer::Integer;
#[inline]
pub fn atoi<I>(text: &[u8]) -> Option<I>
where
I: FromRadix10SignedChecked,
{
match I::from_radix_10_signed_checked(text) {
(_, 0) | (None, _) => None,
(Some(n), _) => Some(n),
}
}
pub trait FromRadix10: Sized {
fn from_radix_10(_: &[u8]) -> (Self, usize);
}
pub trait FromRadix10Checked: Sized {
fn from_radix_10_checked(_: &[u8]) -> (Option<Self>, usize);
}
pub trait FromRadix16: Sized {
fn from_radix_16(_: &[u8]) -> (Self, usize);
}
pub trait FromRadix16Checked: Sized {
fn from_radix_16_checked(_: &[u8]) -> (Option<Self>, usize);
}
pub trait FromRadix10Signed: Sized {
fn from_radix_10_signed(_: &[u8]) -> (Self, usize);
}
pub trait FromRadix10SignedChecked: FromRadix10Signed {
fn from_radix_10_signed_checked(_: &[u8]) -> (Option<Self>, usize);
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum Sign {
Plus,
Minus,
}
impl Sign {
pub fn try_from(byte: u8) -> Option<Sign> {
match byte {
b'+' => Some(Sign::Plus),
b'-' => Some(Sign::Minus),
_ => None,
}
}
}
trait FromDigit: Sized {
fn from_digit(digit: u8) -> Option<Self>;
}
trait FromHexDigit: Sized {
fn from_hex_digit(digit: u8) -> Option<Self>;
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn checked_parsing() {
assert_eq!((Some(255), 3), u8::from_radix_10_checked(b"255"));
assert_eq!((None, 3), u8::from_radix_10_checked(b"256"));
assert_eq!((None, 4), u8::from_radix_10_checked(b"1000"));
assert_eq!((Some(25), 2), u8::from_radix_10_checked(b"25"));
assert_eq!((Some(25), 2), u8::from_radix_10_checked(b"25Blub"));
}
#[test]
fn checked_parsing_radix_16() {
assert_eq!((Some(255), 2), u8::from_radix_16_checked(b"FF"));
assert_eq!((Some(255), 2), u8::from_radix_16_checked(b"ff"));
assert_eq!((Some(170), 2), u8::from_radix_16_checked(b"AA"));
assert_eq!((Some(170), 2), u8::from_radix_16_checked(b"aa"));
assert_eq!((None, 3), u8::from_radix_16_checked(b"100"));
assert_eq!((None, 4), u8::from_radix_16_checked(b"1000"));
assert_eq!((Some(25), 2), u8::from_radix_16_checked(b"19"));
assert_eq!((Some(25), 2), u8::from_radix_16_checked(b"19!Blub"));
}
#[test]
fn empty() {
assert_eq!((Some(0), 0), u8::from_radix_10_checked(b""));
assert_eq!((Some(0), 0), u8::from_radix_16_checked(b""));
assert_eq!((0, 0), u8::from_radix_10(b""));
assert_eq!((0, 0), u8::from_radix_16(b""));
assert_eq!((0, 0), u8::from_radix_10_signed(b""));
assert_eq!((Some(0), 0), u8::from_radix_10_signed_checked(b""));
}
#[test]
fn plus() {
assert_eq!((Some(0), 0), u8::from_radix_10_checked(b"+"));
assert_eq!((Some(0), 0), u8::from_radix_16_checked(b"+"));
assert_eq!((0, 0), u8::from_radix_10(b"+"));
assert_eq!((0, 0), u8::from_radix_16(b"+"));
assert_eq!((0, 1), u8::from_radix_10_signed(b"+"));
assert_eq!((Some(0), 1), u8::from_radix_10_signed_checked(b"+"));
}
#[test]
fn minus() {
assert_eq!((Some(0), 0), u8::from_radix_10_checked(b"-"));
assert_eq!((Some(0), 0), u8::from_radix_16_checked(b"-"));
assert_eq!((0, 0), u8::from_radix_10(b"-"));
assert_eq!((0, 0), u8::from_radix_16(b"-"));
assert_eq!((0, 1), u8::from_radix_10_signed(b"-"));
assert_eq!((Some(0), 1), u8::from_radix_10_signed_checked(b"-"));
}
}