use std::fmt;
use std::iter::FusedIterator;
use std::marker::PhantomData;
use crate::{Utf8Component, Utf8Components, Utf8Encoding, Utf8Path};
#[derive(Clone)]
pub struct Utf8Iter<'a, T>
where
T: Utf8Encoding<'a>,
{
_encoding: PhantomData<T>,
inner: <T as Utf8Encoding<'a>>::Components,
}
impl<'a, T> Utf8Iter<'a, T>
where
T: for<'enc> Utf8Encoding<'enc> + 'a,
{
pub(crate) fn new(inner: <T as Utf8Encoding<'a>>::Components) -> Self {
Self {
_encoding: PhantomData,
inner,
}
}
pub fn as_path(&self) -> &Utf8Path<T> {
Utf8Path::new(self.inner.as_str())
}
}
impl<'a, T> fmt::Debug for Utf8Iter<'a, T>
where
T: for<'enc> Utf8Encoding<'enc> + 'a,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
struct DebugHelper<'a, T>(&'a Utf8Path<T>)
where
T: for<'enc> Utf8Encoding<'enc>;
impl<'a, T> fmt::Debug for DebugHelper<'a, T>
where
T: for<'enc> Utf8Encoding<'enc>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_list().entries(self.0.iter()).finish()
}
}
f.debug_tuple(stringify!(Iter))
.field(&DebugHelper(self.as_path()))
.finish()
}
}
impl<'a, T> AsRef<Utf8Path<T>> for Utf8Iter<'a, T>
where
T: for<'enc> Utf8Encoding<'enc> + 'a,
{
#[inline]
fn as_ref(&self) -> &Utf8Path<T> {
self.as_path()
}
}
impl<'a, T> AsRef<[u8]> for Utf8Iter<'a, T>
where
T: for<'enc> Utf8Encoding<'enc> + 'a,
{
#[inline]
fn as_ref(&self) -> &[u8] {
self.as_path().as_str().as_bytes()
}
}
impl<'a, T> AsRef<str> for Utf8Iter<'a, T>
where
T: for<'enc> Utf8Encoding<'enc> + 'a,
{
#[inline]
fn as_ref(&self) -> &str {
self.as_path().as_str()
}
}
impl<'a, T> Iterator for Utf8Iter<'a, T>
where
T: for<'enc> Utf8Encoding<'enc> + 'a,
{
type Item = &'a str;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
match self.inner.next() {
Some(c) => Some(c.as_str()),
None => None,
}
}
}
impl<'a, T> DoubleEndedIterator for Utf8Iter<'a, T>
where
T: for<'enc> Utf8Encoding<'enc> + 'a,
{
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
match self.inner.next_back() {
Some(c) => Some(c.as_str()),
None => None,
}
}
}
impl<'a, T> FusedIterator for Utf8Iter<'a, T> where T: for<'enc> Utf8Encoding<'enc> + 'a {}
#[derive(Copy, Clone, Debug)]
pub struct Utf8Ancestors<'a, T>
where
T: for<'enc> Utf8Encoding<'enc>,
{
pub(crate) next: Option<&'a Utf8Path<T>>,
}
impl<'a, T> Iterator for Utf8Ancestors<'a, T>
where
T: for<'enc> Utf8Encoding<'enc>,
{
type Item = &'a Utf8Path<T>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
let next = self.next;
self.next = next.and_then(Utf8Path::parent);
next
}
}
impl<'a, T> FusedIterator for Utf8Ancestors<'a, T> where T: for<'enc> Utf8Encoding<'enc> {}