embedded_term/
text_buffer_cache.rs

1use crate::cell::Cell;
2use crate::text_buffer::TextBuffer;
3use alloc::vec::Vec;
4
5/// Cache layer for [`TextBuffer`]
6pub struct TextBufferCache<T: TextBuffer> {
7    buf: Vec<Vec<Cell>>,
8    row_offset: usize,
9    inner: T,
10}
11
12impl<T: TextBuffer> TextBufferCache<T> {
13    /// Create a cache layer for `inner` text buffer
14    pub fn new(inner: T) -> Self {
15        TextBufferCache {
16            buf: vec![vec![Cell::default(); inner.width()]; inner.height()],
17            row_offset: 0,
18            inner,
19        }
20    }
21    /// Get real row of inner buffer
22    fn real_row(&self, row: usize) -> usize {
23        (self.row_offset + row) % self.inner.height()
24    }
25    /// Clear line at `row`
26    fn clear_line(&mut self, row: usize, cell: Cell) {
27        for col in 0..self.width() {
28            self.buf[row][col] = cell;
29            self.inner.write(row, col, cell);
30        }
31    }
32}
33
34impl<T: TextBuffer> TextBuffer for TextBufferCache<T> {
35    #[inline]
36    fn width(&self) -> usize {
37        self.inner.width()
38    }
39
40    #[inline]
41    fn height(&self) -> usize {
42        self.inner.height()
43    }
44
45    #[inline]
46    fn read(&self, row: usize, col: usize) -> Cell {
47        let row = self.real_row(row);
48        self.buf[row][col]
49    }
50
51    #[inline]
52    fn write(&mut self, row: usize, col: usize, cell: Cell) {
53        let row = self.real_row(row);
54        self.buf[row][col] = cell;
55        self.inner.write(row, col, cell);
56    }
57
58    #[inline]
59    fn new_line(&mut self, cell: Cell) {
60        self.clear_line(self.row_offset, cell);
61        self.row_offset = (self.row_offset + 1) % self.inner.height();
62    }
63
64    #[inline]
65    fn clear(&mut self, cell: Cell) {
66        self.row_offset = 0;
67        self.inner.clear(cell);
68    }
69}