use core::iter::FusedIterator;
use crate::internal::{InternalCharIndices, InternalChars};
use super::JavaStr;
#[derive(Debug, Clone)]
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct JavaChars<'a> {
pub(crate) iter: InternalChars<'a>,
}
impl<'a> JavaChars<'a> {
#[inline]
#[must_use]
pub fn as_str(&self) -> &JavaStr {
unsafe { JavaStr::from_java_cesu8_unchecked(self.iter.as_bytes()) }
}
}
impl Iterator for JavaChars<'_> {
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 JavaChars<'_> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back()
}
}
impl FusedIterator for JavaChars<'_> {}
#[derive(Debug, Clone)]
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct JavaCharIndices<'a> {
pub(crate) iter: InternalCharIndices<'a>,
}
impl<'a> JavaCharIndices<'a> {
#[inline]
#[must_use]
pub fn offset(&self) -> usize {
self.iter.offset()
}
#[inline]
#[must_use]
pub fn as_str(&self) -> &JavaStr {
unsafe { JavaStr::from_java_cesu8_unchecked(self.iter.as_bytes()) }
}
}
impl Iterator for JavaCharIndices<'_> {
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 JavaCharIndices<'_> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back()
}
}
impl FusedIterator for JavaCharIndices<'_> {}