pdfium_render/pdf/path/
segments.rs1use crate::error::PdfiumError;
5use crate::pdf::path::segment::PdfPathSegment;
6use std::ops::{Range, RangeInclusive};
7
8pub type PdfPathSegmentIndex = u32;
10
11pub trait PdfPathSegments<'a> {
14 fn len(&self) -> PdfPathSegmentIndex;
16
17 #[inline]
19 fn is_empty(&self) -> bool {
20 self.len() == 0
21 }
22
23 #[inline]
25 fn as_range(&self) -> Range<PdfPathSegmentIndex> {
26 0..self.len()
27 }
28
29 #[inline]
31 fn as_range_inclusive(&self) -> RangeInclusive<PdfPathSegmentIndex> {
32 if self.is_empty() {
33 0..=0
34 } else {
35 0..=(self.len() - 1)
36 }
37 }
38
39 fn get(&self, index: PdfPathSegmentIndex) -> Result<PdfPathSegment<'a>, PdfiumError>;
41
42 fn iter(&'a self) -> PdfPathSegmentsIterator<'a>;
44}
45
46pub struct PdfPathSegmentsIterator<'a> {
48 segments: &'a dyn PdfPathSegments<'a>,
49 next_index: PdfPathSegmentIndex,
50}
51
52impl<'a> PdfPathSegmentsIterator<'a> {
53 #[inline]
54 pub(crate) fn new(segments: &'a dyn PdfPathSegments<'a>) -> Self {
55 PdfPathSegmentsIterator {
56 segments,
57 next_index: 0,
58 }
59 }
60}
61
62impl<'a> Iterator for PdfPathSegmentsIterator<'a> {
63 type Item = PdfPathSegment<'a>;
64
65 fn next(&mut self) -> Option<Self::Item> {
66 let next = self.segments.get(self.next_index);
67
68 self.next_index += 1;
69
70 next.ok()
71 }
72}