embedded_term/
text_buffer_cache.rs1use crate::cell::Cell;
2use crate::text_buffer::TextBuffer;
3use alloc::vec::Vec;
4
5pub struct TextBufferCache<T: TextBuffer> {
7 buf: Vec<Vec<Cell>>,
8 row_offset: usize,
9 inner: T,
10}
11
12impl<T: TextBuffer> TextBufferCache<T> {
13 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 fn real_row(&self, row: usize) -> usize {
23 (self.row_offset + row) % self.inner.height()
24 }
25 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}