ttf_parser/tables/cff/
argstack.rs

1use super::CFFError;
2
3pub struct ArgumentsStack<'a> {
4    pub data: &'a mut [f32],
5    pub len: usize,
6    pub max_len: usize,
7}
8
9impl<'a> ArgumentsStack<'a> {
10    #[inline]
11    pub fn len(&self) -> usize {
12        self.len
13    }
14
15    #[inline]
16    pub fn is_empty(&self) -> bool {
17        self.len == 0
18    }
19
20    #[inline]
21    pub fn push(&mut self, n: f32) -> Result<(), CFFError> {
22        if self.len == self.max_len {
23            Err(CFFError::ArgumentsStackLimitReached)
24        } else {
25            self.data[self.len] = n;
26            self.len += 1;
27            Ok(())
28        }
29    }
30
31    #[inline]
32    pub fn at(&self, index: usize) -> f32 {
33        self.data[index]
34    }
35
36    #[inline]
37    pub fn pop(&mut self) -> f32 {
38        debug_assert!(!self.is_empty());
39        self.len -= 1;
40        self.data[self.len]
41    }
42
43    #[inline]
44    pub fn reverse(&mut self) {
45        if self.is_empty() {
46            return;
47        }
48
49        // Reverse only the actual data and not the whole stack.
50        let (first, _) = self.data.split_at_mut(self.len);
51        first.reverse();
52    }
53
54    #[inline]
55    pub fn clear(&mut self) {
56        self.len = 0;
57    }
58}
59
60impl core::fmt::Debug for ArgumentsStack<'_> {
61    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
62        f.debug_list().entries(&self.data[..self.len]).finish()
63    }
64}