use core::iter::FusedIterator;
use crate::internal::{InternalCharIndices, InternalChars};
use super::Cesu8Str;
#[derive(Debug, Clone)]
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct Cesu8Chars<'a> {
pub(crate) iter: InternalChars<'a>,
}
impl<'a> Cesu8Chars<'a> {
#[inline]
#[must_use]
pub fn as_str(&self) -> &Cesu8Str {
unsafe { Cesu8Str::from_cesu8_unchecked(self.iter.as_bytes()) }
}
}
impl Iterator for Cesu8Chars<'_> {
type Item = char;
#[inline]
#[must_use]
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
#[inline]
fn last(self) -> Option<char> {
self.iter.last()
}
}
impl DoubleEndedIterator for Cesu8Chars<'_> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back()
}
}
impl FusedIterator for Cesu8Chars<'_> {}
#[derive(Debug, Clone)]
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct Cesu8CharIndices<'a> {
pub(crate) iter: InternalCharIndices<'a>,
}
impl<'a> Cesu8CharIndices<'a> {
#[inline]
#[must_use]
pub fn offset(&self) -> usize {
self.iter.offset()
}
#[inline]
#[must_use]
pub fn as_str(&self) -> &Cesu8Str {
unsafe { Cesu8Str::from_cesu8_unchecked(self.iter.as_bytes()) }
}
}
impl Iterator for Cesu8CharIndices<'_> {
type Item = (usize, char);
#[inline]
fn next(&mut self) -> Option<(usize, char)> {
self.iter.next()
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
#[inline]
fn last(self) -> Option<Self::Item> {
self.iter.last()
}
}
impl DoubleEndedIterator for Cesu8CharIndices<'_> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back()
}
}
impl FusedIterator for Cesu8CharIndices<'_> {}