o3/buffer/segments/shape/
owners.rs1use std::iter;
2
3use crate::{
4 buffer,
5 buffer::{
6 segments,
7 segments::{Item, Shape},
8 },
9};
10
11pub 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};