ferroui_base/rendering/composition/drawing/
render_data_writer.rs1use super::{IRenderDataPayload, RenderDataOpcode};
2use crate::rendering::composition::transport::BatchValue;
3
4#[derive(Debug, Default)]
10pub struct RenderDataWriter {
11 buffer: Option<Vec<u8>>,
12 length: usize,
13}
14
15impl RenderDataWriter {
16 pub fn new() -> Self {
17 Self::default()
18 }
19
20 pub fn length(&self) -> usize {
22 self.length
23 }
24
25 pub fn written(&self) -> &[u8] {
27 match &self.buffer {
28 Some(buffer) => &buffer[..self.length],
29 None => &[],
30 }
31 }
32
33 fn buffer(buffer: &mut Option<Vec<u8>>, length: usize) -> &mut Vec<u8> {
36 let buffer = buffer.get_or_insert_with(|| Vec::with_capacity(256));
37 buffer.truncate(length);
38 buffer
39 }
40
41 fn advance(&mut self, size: usize) -> &mut [u8] {
43 let start = self.length;
44 self.length = start + size;
45 let buffer = Self::buffer(&mut self.buffer, start);
46 buffer.resize(start + size, 0);
47 &mut buffer[start..]
48 }
49
50 pub fn reserve(&mut self, count: usize) -> &mut [u8] {
52 self.advance(count)
53 }
54
55 pub fn rewind(&mut self, length: usize) {
57 self.length = length;
58 }
59
60 pub fn write<T: BatchValue>(&mut self, value: T) {
62 let buffer = Self::buffer(&mut self.buffer, self.length);
63 value.write_to(buffer);
64 self.length = buffer.len();
65 }
66
67 pub fn write_opcode(&mut self, opcode: RenderDataOpcode) {
69 self.write(opcode);
70 }
71
72 pub fn write_payload<T: IRenderDataPayload>(&mut self, payload: T) {
74 self.write(T::OPCODE);
75 self.write(payload);
76 }
77
78 pub fn dispose(&mut self) {
80 self.buffer = None;
81 self.length = 0;
82 }
83}