picard_core/
buffer.rs

1use std::io::{Cursor, Seek, Read, Write, self};
2use byteorder::{ReadBytesExt, WriteBytesExt, LittleEndian, BigEndian};
3
4pub struct ShaderBuffer {
5    buf: Cursor<Vec<u8>>,
6    little_endian: bool
7}
8
9impl ShaderBuffer {
10    pub fn new() -> Self {
11        Self {
12            //TODO: start with_capacity
13            buf: Cursor::new(Vec::new()),
14            little_endian: true
15        }
16    }
17
18    pub(crate) fn set_little_endian(&mut self, little: bool) {
19        self.little_endian = little;
20    }
21
22    pub(crate) fn read_u64(&mut self) -> Result<u64, io::Error> {
23        if self.little_endian {
24            self.buf.read_u64::<LittleEndian>()
25        } else {
26            self.buf.read_u64::<BigEndian>()
27        }
28    }
29
30    pub(crate) fn write_u64(&mut self, value: u64) -> Result<(), io::Error> {
31        if self.little_endian {
32            self.buf.write_u64::<LittleEndian>(value)
33        } else {
34            self.buf.write_u64::<BigEndian>(value)
35        }
36    }
37
38    pub(crate) fn read_u32(&mut self) -> Result<u32, io::Error> {
39        if self.little_endian {
40            self.buf.read_u32::<LittleEndian>()
41        } else {
42            self.buf.read_u32::<BigEndian>()
43        }
44    }
45
46    pub(crate) fn write_u32(&mut self, value: u32) -> Result<(), io::Error> {
47        if self.little_endian {
48            self.buf.write_u32::<LittleEndian>(value)
49        } else {
50            self.buf.write_u32::<BigEndian>(value)
51        }
52    }
53
54    pub(crate) fn read_u16(&mut self) -> Result<u16, io::Error> {
55        if self.little_endian {
56            self.buf.read_u16::<LittleEndian>()
57        } else {
58            self.buf.read_u16::<BigEndian>()
59        }
60    }
61
62    pub(crate) fn write_u16(&mut self, value: u16) -> Result<(), io::Error> {
63        if self.little_endian {
64            self.buf.write_u16::<LittleEndian>(value)
65        } else {
66            self.buf.write_u16::<BigEndian>(value)
67        }
68    }
69
70    pub(crate) fn read_u8(&mut self) -> Result<u8, io::Error> {
71        self.buf.read_u8()
72    }
73
74    pub(crate) fn write_u8(&mut self, value: u8) -> Result<(), io::Error> {
75        self.buf.write_u8(value)
76    }
77
78    pub(crate) fn read_f32(&mut self) -> Result<f32, io::Error> {
79        if self.little_endian {
80            self.buf.read_f32::<LittleEndian>()
81        } else {
82            self.buf.read_f32::<BigEndian>()
83        }
84    }
85
86    pub(crate) fn write_f32(&mut self, value: f32) -> Result<(), io::Error> {
87        if self.little_endian {
88            self.buf.write_f32::<LittleEndian>(value)
89        } else {
90            self.buf.write_f32::<BigEndian>(value)
91        }
92    }
93
94    pub(crate) fn read_raw(&mut self, buffer: &mut [u8]) -> bool {
95        self.buf.read_exact(buffer).is_ok()
96    }
97
98    pub(crate) fn write_raw(&mut self, buffer: &[u8]) -> bool {
99        self.buf.write_all(buffer).is_ok()
100    }
101
102    pub(crate) fn seek(&mut self, pos: u64, mode: io::SeekFrom) -> Result<u64, io::Error> {
103        self.buf.seek(mode)
104    }
105
106    pub(crate) fn tell(&mut self) -> u64 {
107        self.buf.position()
108    }
109
110    /// Returns the buffer as a Vec, consuming it
111    pub fn into_vec(self) -> Vec<u8> {
112        self.buf.into_inner()
113    }
114}