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 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 pub fn into_vec(self) -> Vec<u8> {
112 self.buf.into_inner()
113 }
114}