stabby_abi/
iter.rs

1use crate::{vtable::HasDropVt, IDeterminantProvider, IPtrMut, IPtrOwned};
2
3/// [`core::iter::Iterator`], but ABI-stable.
4#[crate::stabby]
5pub trait Iterator {
6    /// The type of the elements of the iterator.
7    type Item: IDeterminantProvider<()>;
8    /// Returns the next element in the iterator if it exists.
9    extern "C" fn next(&mut self) -> crate::Option<Self::Item>;
10    /// See [`core::iter::Iterator::size_hint`]
11    extern "C" fn size_hint(&self) -> crate::Tuple<usize, crate::Option<usize>>;
12}
13
14impl<T: core::iter::Iterator> Iterator for T
15where
16    T::Item: IDeterminantProvider<()>,
17{
18    type Item = T::Item;
19    extern "C" fn next(&mut self) -> crate::Option<Self::Item> {
20        core::iter::Iterator::next(self).into()
21    }
22    extern "C" fn size_hint(&self) -> crate::Tuple<usize, crate::Option<usize>> {
23        let (min, max) = core::iter::Iterator::size_hint(self);
24        crate::Tuple(min, max.into())
25    }
26}
27
28impl<Vt: HasDropVt, P: IPtrOwned + IPtrMut, Output: IDeterminantProvider<()>> core::iter::Iterator
29    for crate::Dyn<'_, P, crate::vtable::VTable<StabbyVtableIterator<Output>, Vt>>
30{
31    type Item = Output;
32    fn next(&mut self) -> Option<Self::Item> {
33        // SAFETY: we're accessing a `StableLike` that was unsafely but properly constructed.
34        unsafe { (self.vtable().head.next.as_ref_unchecked())(self.ptr_mut().as_mut()).into() }
35    }
36    fn size_hint(&self) -> (usize, Option<usize>) {
37        let crate::Tuple(min, max) = // SAFETY: we're accessing a `StableLike` that was unsafely but properly constructed.
38            unsafe { (self.vtable().head.size_hint.as_ref_unchecked())(self.ptr().as_ref()) };
39        (min, max.into())
40    }
41}
42
43impl<Output> crate::vtable::CompoundVt for dyn core::iter::Iterator<Item = Output>
44where
45    dyn Iterator<Item = Output>: crate::vtable::CompoundVt,
46{
47    type Vt<T> = <dyn Iterator<Item = Output> as crate::vtable::CompoundVt>::Vt<T>;
48}