#[macro_export]
#[cfg(any(feature = "parse-floats", feature = "parse-integers"))]
macro_rules! from_lexical {
($name:literal, $value:literal, $t:ty, $len:literal $(, #[$attr:meta])? $(,)?) => {
$(#[$attr])?
pub trait FromLexical: lexical_util::num::Number {
#[doc = concat!("# assert_eq!(", stringify!($len), ", \"", stringify!($value), "\".len());")]
#[doc = concat!("use ", $name, "::FromLexical;")]
#[doc = concat!("let value = \"", stringify!($value), "\";")]
#[doc = concat!("let parsed = ", stringify!($t), "::from_lexical(value.as_bytes());")]
#[doc = concat!("assert_eq!(parsed, Ok(", stringify!($value), "));")]
fn from_lexical(bytes: &[u8]) -> lexical_util::result::Result<Self>;
#[doc = concat!("# assert_eq!(", stringify!($len), ", \"", stringify!($value), "\".len());")]
#[doc = concat!("use ", $name, "::FromLexical;")]
#[doc = concat!("let value = \"", stringify!($value), "\";")]
#[doc = concat!("let parsed = ", stringify!($t), "::from_lexical_partial(value.as_bytes());")]
#[doc = concat!("assert_eq!(parsed, Ok((", stringify!($value), ", ", stringify!($len), ")));")]
fn from_lexical_partial(bytes: &[u8]) -> lexical_util::result::Result<(Self, usize)>;
}
};
}
#[macro_export]
#[cfg(any(feature = "parse-floats", feature = "parse-integers"))]
macro_rules! from_lexical_with_options {
($name:literal, $value:literal, $t:ty, $len:literal, $ops_t:ty $(, #[$attr:meta])? $(,)?) => {
$(#[$attr])?
pub trait FromLexicalWithOptions: lexical_util::num::Number {
type Options: lexical_util::options::ParseOptions;
#[doc = concat!("# assert_eq!(", stringify!($len), ", \"", stringify!($value), "\".len());")]
#[doc = concat!("use ", $name, "::{format, FromLexicalWithOptions, ", stringify!($ops_t), "};")]
#[doc = concat!("const OPTIONS: ", stringify!($ops_t), " = ", stringify!($ops_t), "::new();")]
#[doc = concat!("let value = \"", stringify!($value), "\";")]
#[doc = concat!("let parsed = ", stringify!($t), "::from_lexical_with_options::<FORMAT>(value.as_bytes(), &OPTIONS);")]
#[doc = concat!("assert_eq!(parsed, Ok(", stringify!($value), "));")]
fn from_lexical_with_options<const FORMAT: u128>(
bytes: &[u8],
options: &Self::Options,
) -> lexical_util::result::Result<Self>;
#[doc = concat!("# assert_eq!(", stringify!($len), ", \"", stringify!($value), "\".len());")]
#[doc = concat!("use ", $name, "::{format, FromLexicalWithOptions, ", stringify!($ops_t), "};")]
#[doc = concat!("const OPTIONS: ", stringify!($ops_t), " = ", stringify!($ops_t), "::new();")]
#[doc = concat!("let value = \"", stringify!($value), "\";")]
#[doc = concat!(
"let parsed = ",
stringify!($t),
"::from_lexical_partial_with_options::<FORMAT>(value.as_bytes(), &OPTIONS);"
)]
#[doc = concat!("assert_eq!(parsed, Ok((", stringify!($value), ", ", stringify!($len), ")));")]
fn from_lexical_partial_with_options<const FORMAT: u128>(
bytes: &[u8],
options: &Self::Options,
) -> lexical_util::result::Result<(Self, usize)>;
}
};
}
#[macro_export]
#[cfg(any(feature = "write-floats", feature = "write-integers"))]
macro_rules! to_lexical {
($name:literal, $value:literal, $t:ty $(, #[$attr:meta])? $(,)?) => {
$(#[$attr])?
pub trait ToLexical:
lexical_util::constants::FormattedSize + lexical_util::num::Number
{
#[doc = concat!("use ", $name, "::{format, FormattedSize, ToLexical};")]
#[doc = concat!("let value: ", stringify!($t), " = ", stringify!($value), ";")]
#[doc = concat!("let mut buffer = [0u8; ", stringify!($t), "::FORMATTED_SIZE_DECIMAL];")]
#[doc = concat!("assert_eq!(str::from_utf8(digits), Ok(\"", stringify!($value), "\"));")]
fn to_lexical<'a>(self, bytes: &'a mut [u8]) -> &'a mut [u8];
}
};
}
#[macro_export]
#[cfg(any(feature = "write-floats", feature = "write-integers"))]
macro_rules! to_lexical_with_options {
($name:literal, $value:literal, $t:ty, $ops_t:ty $(, #[$attr:meta])? $(,)?) => {
$(#[$attr])?
pub trait ToLexicalWithOptions:
lexical_util::constants::FormattedSize + lexical_util::num::Number
{
type Options: lexical_util::options::WriteOptions;
#[doc = concat!(
"use ",
$name,
"::{format, FormattedSize, ",
stringify!($ops_t),
", ToLexicalWithOptions};"
)]
#[doc = concat!("const OPTIONS: ", stringify!($ops_t), " = ", stringify!($ops_t), "::new();")]
#[doc = concat!(
"const BUFFER_SIZE: usize = OPTIONS.buffer_size_const::<",
stringify!($t),
", FORMAT>();"
)]
#[doc = concat!("let value: ", stringify!($t), " = ", stringify!($value), ";")]
#[doc = concat!("assert_eq!(str::from_utf8(digits), Ok(\"", stringify!($value), "\"));")]
#[doc = concat!(
"[`Options::buffer_size_const`]: crate::",
stringify!($ops_t),
"::buffer_size_const"
)]
fn to_lexical_with_options<'a, const FORMAT: u128>(
self,
bytes: &'a mut [u8],
options: &Self::Options,
) -> &'a mut [u8];
}
};
}