use crate::{ImplBound, Ref};
pub trait IterateByValueGat<'a, __Implicit: ImplBound = Ref<'a, Self>> {
type Item;
type Iter: 'a + Iterator<Item = Self::Item>;
}
pub type Iter<'a, T> = <T as IterateByValueGat<'a>>::Iter;
impl<'a, T: IterateByValueGat<'a> + ?Sized> IterateByValueGat<'a> for &T {
type Item = T::Item;
type Iter = T::Iter;
}
impl<'a, T: IterateByValueGat<'a> + ?Sized> IterateByValueGat<'a> for &mut T {
type Item = T::Item;
type Iter = T::Iter;
}
pub trait IterateByValue: for<'a> IterateByValueGat<'a> {
fn iter_value(&self) -> Iter<'_, Self>;
}
impl<T: IterateByValue + ?Sized> IterateByValue for &T {
fn iter_value(&self) -> Iter<'_, Self> {
(**self).iter_value()
}
}
impl<T: IterateByValue + ?Sized> IterateByValue for &mut T {
fn iter_value(&self) -> Iter<'_, Self> {
(**self).iter_value()
}
}
pub trait IterateByValueFromGat<'a, __Implicit: ImplBound = Ref<'a, Self>> {
type Item;
type IterFrom: 'a + Iterator<Item = Self::Item>;
}
impl<'a, T: IterateByValueFromGat<'a> + ?Sized> IterateByValueFromGat<'a> for &T {
type Item = T::Item;
type IterFrom = T::IterFrom;
}
impl<'a, T: IterateByValueFromGat<'a> + ?Sized> IterateByValueFromGat<'a> for &mut T {
type Item = T::Item;
type IterFrom = T::IterFrom;
}
pub type IterFrom<'a, T> = <T as IterateByValueFromGat<'a>>::IterFrom;
pub trait IterateByValueFrom: for<'a> IterateByValueFromGat<'a> {
fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self>;
}
impl<T: IterateByValueFrom + ?Sized> IterateByValueFrom for &T {
fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self> {
(**self).iter_value_from(from)
}
}
impl<T: IterateByValueFrom + ?Sized> IterateByValueFrom for &mut T {
fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self> {
(**self).iter_value_from(from)
}
}
#[cfg(feature = "alloc")]
mod alloc_impls {
use super::*;
#[cfg(all(feature = "alloc", not(feature = "std")))]
use alloc::boxed::Box;
impl<'a, S: IterateByValueGat<'a> + ?Sized> IterateByValueGat<'a> for Box<S> {
type Item = S::Item;
type Iter = S::Iter;
}
impl<S: IterateByValue + ?Sized> IterateByValue for Box<S> {
fn iter_value(&self) -> Iter<'_, Self> {
(**self).iter_value()
}
}
impl<'a, S: IterateByValueFromGat<'a> + ?Sized> IterateByValueFromGat<'a> for Box<S> {
type Item = S::Item;
type IterFrom = S::IterFrom;
}
impl<S: IterateByValueFrom + ?Sized> IterateByValueFrom for Box<S> {
fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self> {
(**self).iter_value_from(from)
}
}
}
#[cfg(feature = "std")]
mod std_impls {
use super::*;
use std::{rc::Rc, sync::Arc};
impl<'a, S: IterateByValueGat<'a> + ?Sized> IterateByValueGat<'a> for Arc<S> {
type Item = S::Item;
type Iter = S::Iter;
}
impl<S: IterateByValue + ?Sized> IterateByValue for Arc<S> {
fn iter_value(&self) -> Iter<'_, Self> {
(**self).iter_value()
}
}
impl<'a, S: IterateByValueFromGat<'a> + ?Sized> IterateByValueFromGat<'a> for Arc<S> {
type Item = S::Item;
type IterFrom = S::IterFrom;
}
impl<S: IterateByValueFrom + ?Sized> IterateByValueFrom for Arc<S> {
fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self> {
(**self).iter_value_from(from)
}
}
impl<'a, S: IterateByValueGat<'a> + ?Sized> IterateByValueGat<'a> for Rc<S> {
type Item = S::Item;
type Iter = S::Iter;
}
impl<S: IterateByValue + ?Sized> IterateByValue for Rc<S> {
fn iter_value(&self) -> Iter<'_, Self> {
(**self).iter_value()
}
}
impl<'a, S: IterateByValueFromGat<'a> + ?Sized> IterateByValueFromGat<'a> for Rc<S> {
type Item = S::Item;
type IterFrom = S::IterFrom;
}
impl<S: IterateByValueFrom + ?Sized> IterateByValueFrom for Rc<S> {
fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self> {
(**self).iter_value_from(from)
}
}
}