Skip to main content

o3/buffer/segments/shape/
owners.rs

1use std::iter;
2
3use crate::{
4    buffer,
5    buffer::{
6        segments,
7        segments::{Item, Shape},
8    },
9};
10
11/// Borrowed owners of one exact physical shape.
12pub enum Owners<'a, T> {
13    Empty,
14    One(&'a Item<T>),
15    Many(segments::Iter<'a, T>),
16}
17
18impl<T: buffer::raw::Segment> Shape<T> {
19    pub fn owners(&self) -> Owners<'_, T> {
20        match self {
21            Self::Empty => Owners::Empty,
22            Self::One(owner) => Owners::One(owner),
23            Self::Many(owners) => Owners::Many(owners.as_chain().segments()),
24        }
25    }
26}
27
28impl<'a, T: 'a> Iterator for Owners<'a, T> {
29    type Item = &'a T;
30    fn next(&mut self) -> Option<Self::Item> {
31        match self {
32            Self::Empty => None,
33            Self::One(owner) => {
34                let owner = *owner;
35                *self = Self::Empty;
36                Some(owner.as_ref())
37            }
38            Self::Many(owners) => owners.next(),
39        }
40    }
41    fn size_hint(&self) -> (usize, Option<usize>) {
42        let left = match self {
43            Self::Empty => 0,
44            Self::One(_) => 1,
45            Self::Many(owners) => owners.len(),
46        };
47        (left, Some(left))
48    }
49}
50impl<T> ExactSizeIterator for Owners<'_, T> {}
51impl<T> iter::FusedIterator for Owners<'_, T> {}
52
53const _: () = {
54    assert!(size_of::<Owners<'_, ()>>() == 4 * size_of::<usize>());
55    assert!(size_of::<Option<Owners<'_, ()>>>() == size_of::<Owners<'_, ()>>());
56};