#[doc = include_str!("../../examples/doc_macro_read.txt")]
#[doc = include_str!("../../examples/doc_macro_read.rs")]
#[macro_export]
macro_rules! read {
(@ $(,)?; src = $src:expr; fmt = $fmt:expr) => {
$crate::unwrap!($crate::ReadFrom::try_read_from($src, $fmt))
};
(@ $dim0:expr $(, $dims:expr)* $(,)?; src = $src:expr; fmt = $fmt:expr) => {{
let range = 0usize..$dim0;
::std::vec::Vec::<_>::from_iter(range.map(|_| $crate::read!(@ $($dims, )* ; src = $src ; fmt = $fmt)))
}};
($(,)? $(; src = $src:expr)? $(; fmt = $fmt:expr)?) => {{
let src = $crate::argument_or_default!($(&mut $src)?, &mut *$crate::stdin());
let fmt = $crate::argument_or_default!($(&$fmt)?, &$crate::fmt::Default::new());
$crate::unwrap!($crate::ReadFrom::try_read_from(src, fmt))
}};
($dim0:expr $(, $dims:expr)* $(,)? $(; src = $src:expr)? $(; fmt = $fmt:expr)?) => {{
let range = 0usize..$dim0;
let src = $crate::argument_or_default!($(&mut $src)?, &mut *$crate::stdin());
let fmt = $crate::argument_or_default!($(&$fmt)?, &$crate::fmt::Default::new());
::std::vec::Vec::<_>::from_iter(range.map(|_| $crate::read!(@ $($dims, )*; src = src; fmt = fmt)))
}};
($(,)? $(; src = $src:expr)? ; skip = $skip:expr) => {{
let src = $crate::argument_or_default!($(&mut $src)?, &mut *$crate::stdin());
let fmt = &$crate::fmt::skip($skip);
$crate::unwrap!($crate::ReadFrom::try_read_from(src, fmt))
}};
($dim0:expr $(, $dims:expr)* $(,)? $(; src = $src:expr)? ; skip = $skip:expr) => {{
let range = 0usize..$dim0;
let src = $crate::argument_or_default!($(&mut $src)?, &mut *$crate::stdin());
let fmt = &$crate::fmt::skip($skip);
::std::vec::Vec::<_>::from_iter(range.map(|_| $crate::read!(@ $($dims, )*; src = src; fmt = fmt)))
}};
}
#[macro_export]
macro_rules! impl_read_one_from_for_from_str {
($($ty:ty)+) => {
$(
impl $crate::ReadOneFrom for $ty {
type ParseError = <Self as ::core::str::FromStr>::Err;
#[inline]
fn parse(s: &::core::primitive::str) -> Result<Self, $crate::ReadOneFromError<Self>> {
s.parse().map_err(|err| $crate::ReadError::FromStrError(err, s.to_owned(), ::core::any::type_name::<Self>()))
}
}
)*
};
($($ty:ty)+ => $accept:expr) => {
$(
impl $crate::ReadOneFrom for $ty {
type ParseError = <Self as ::core::str::FromStr>::Err;
#[inline]
fn accept() -> impl $crate::ext::Pattern<Item = ::core::primitive::char> {
$accept
}
#[inline]
fn parse(s: &::core::primitive::str) -> Result<Self, $crate::ReadOneFromError<Self>> {
s.parse().map_err(|err| $crate::ReadError::FromStrError(err, s.to_owned(), ::core::any::type_name::<Self>()))
}
}
)*
};
}