macro_rules! named_iterators_from_no_argument_handler {
($handler:ident,
$item:ty, // For not having to reference private `$handler` in public `Iterator::Type`
$(#[$chars_meta:meta])*,
$chars:ident,
$(#[$chars_indices_meta:meta])*,
$char_indices:ident,
) => (
$(#[$chars_meta])*
#[derive(Debug, Clone)]
pub struct $chars<'a> {
inner: crate::Utf16CharsWithHandler<'a, $handler>,
}
impl<'a> $chars<'a> {
#[inline(always)]
pub fn new(code_units: &'a [u16]) -> Self {
Self {
inner: crate::Utf16CharsWithHandler::new(code_units, $handler::new()),
}
}
#[inline(always)]
pub fn as_slice(&self) -> &'a [u16] {
self.inner.as_slice()
}
}
impl<'a> Iterator for $chars<'a> {
type Item = $item;
#[inline(always)]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
#[inline(always)]
fn count(self) -> usize {
self.inner.count()
}
#[inline(always)]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline(always)]
fn last(mut self) -> Option<Self::Item> {
self.next_back()
}
}
impl<'a> DoubleEndedIterator for $chars<'a> {
#[inline(always)]
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back()
}
}
impl core::iter::FusedIterator for $chars<'_> {}
$(#[$chars_indices_meta])*
#[derive(Debug, Clone)]
pub struct $char_indices<'a> {
inner: crate::Utf16CharIndicesWithHandler<'a, $handler>,
}
impl<'a> $char_indices<'a> {
#[inline(always)]
pub fn new(code_units: &'a [u16]) -> Self {
Self {
inner: crate::Utf16CharIndicesWithHandler::new(code_units, $handler::new()),
}
}
#[inline(always)]
#[must_use]
pub fn as_slice(&self) -> &'a [u16] {
self.inner.as_slice()
}
#[inline(always)]
#[must_use]
pub fn offset(&self) -> usize {
self.inner.offset()
}
}
impl<'a> Iterator for $char_indices<'a> {
type Item = (usize, $item);
#[inline(always)]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
#[inline(always)]
fn count(self) -> usize {
self.inner.count()
}
#[inline(always)]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline(always)]
fn last(mut self) -> Option<Self::Item> {
self.next_back()
}
}
impl<'a> DoubleEndedIterator for $char_indices<'a> {
#[inline(always)]
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back()
}
}
impl core::iter::FusedIterator for $char_indices<'_> {}
)
}
pub(crate) use named_iterators_from_no_argument_handler;