1use crate::{bit_write::BitWrite, byte_order::ByteOrder, prelude::*};
2use nsw_types::*;
3
4#[allow(non_snake_case)]
5fn write_uN<B: ByteOrder, const N: usize, W: BitWrite + ?Sized>(
6 writer: &mut W,
7 value: u32,
8) -> std::io::Result<()> {
9 let mut tmp = BitVec::repeat(false, N);
10 B::write_u32_to_bits(tmp.as_mut_bitslice(), value);
11 writer.write_all_bits(tmp.as_bitslice())
12}
13
14pub trait BitWriteExts: BitWrite {
16 fn write_bool(&mut self, value: bool) -> std::io::Result<()> {
17 self.write_u1(value.into())
18 }
19
20 fn write_u1(&mut self, value: u1) -> std::io::Result<()> {
21 write_uN::<BigEndian, 1, _>(self, value.into())
22 }
23
24 fn write_u2(&mut self, value: u2) -> std::io::Result<()> {
25 write_uN::<BigEndian, 2, _>(self, value.into())
26 }
27
28 fn write_u3(&mut self, value: u3) -> std::io::Result<()> {
29 write_uN::<BigEndian, 3, _>(self, value.into())
30 }
31
32 fn write_u4(&mut self, value: u4) -> std::io::Result<()> {
33 write_uN::<BigEndian, 4, _>(self, value.into())
34 }
35
36 fn write_u5(&mut self, value: u5) -> std::io::Result<()> {
37 write_uN::<BigEndian, 5, _>(self, value.into())
38 }
39
40 fn write_u6(&mut self, value: u6) -> std::io::Result<()> {
41 write_uN::<BigEndian, 6, _>(self, value.into())
42 }
43
44 fn write_u7(&mut self, value: u7) -> std::io::Result<()> {
45 write_uN::<BigEndian, 7, _>(self, value.into())
46 }
47
48 fn write_u8(&mut self, value: u8) -> std::io::Result<()> {
49 write_uN::<BigEndian, 8, _>(self, value.into())
50 }
51
52 fn write_u9<B: ByteOrder>(&mut self, value: u9) -> std::io::Result<()> {
53 write_uN::<B, 9, _>(self, value.into())
54 }
55
56 fn write_u10<B: ByteOrder>(&mut self, value: u10) -> std::io::Result<()> {
57 write_uN::<B, 10, _>(self, value.into())
58 }
59
60 fn write_u11<B: ByteOrder>(&mut self, value: u11) -> std::io::Result<()> {
61 write_uN::<B, 11, _>(self, value.into())
62 }
63
64 fn write_u12<B: ByteOrder>(&mut self, value: u12) -> std::io::Result<()> {
65 write_uN::<B, 12, _>(self, value.into())
66 }
67
68 fn write_u13<B: ByteOrder>(&mut self, value: u13) -> std::io::Result<()> {
69 write_uN::<B, 13, _>(self, value.into())
70 }
71
72 fn write_u14<B: ByteOrder>(&mut self, value: u14) -> std::io::Result<()> {
73 write_uN::<B, 14, _>(self, value.into())
74 }
75
76 fn write_u15<B: ByteOrder>(&mut self, value: u15) -> std::io::Result<()> {
77 write_uN::<B, 15, _>(self, value.into())
78 }
79
80 fn write_u16<B: ByteOrder>(&mut self, value: u16) -> std::io::Result<()> {
81 write_uN::<B, 16, _>(self, value.into())
82 }
83
84 fn write_u17<B: ByteOrder>(&mut self, value: u17) -> std::io::Result<()> {
85 write_uN::<B, 17, _>(self, value.into())
86 }
87
88 fn write_u18<B: ByteOrder>(&mut self, value: u18) -> std::io::Result<()> {
89 write_uN::<B, 18, _>(self, value.into())
90 }
91
92 fn write_u19<B: ByteOrder>(&mut self, value: u19) -> std::io::Result<()> {
93 write_uN::<B, 19, _>(self, value.into())
94 }
95
96 fn write_u20<B: ByteOrder>(&mut self, value: u20) -> std::io::Result<()> {
97 write_uN::<B, 20, _>(self, value.into())
98 }
99
100 fn write_u21<B: ByteOrder>(&mut self, value: u21) -> std::io::Result<()> {
101 write_uN::<B, 21, _>(self, value.into())
102 }
103
104 fn write_u22<B: ByteOrder>(&mut self, value: u22) -> std::io::Result<()> {
105 write_uN::<B, 22, _>(self, value.into())
106 }
107
108 fn write_u23<B: ByteOrder>(&mut self, value: u23) -> std::io::Result<()> {
109 write_uN::<B, 23, _>(self, value.into())
110 }
111
112 fn write_u24<B: ByteOrder>(&mut self, value: u24) -> std::io::Result<()> {
113 write_uN::<B, 24, _>(self, value.into())
114 }
115
116 fn write_u25<B: ByteOrder>(&mut self, value: u25) -> std::io::Result<()> {
117 write_uN::<B, 25, _>(self, value.into())
118 }
119
120 fn write_u26<B: ByteOrder>(&mut self, value: u26) -> std::io::Result<()> {
121 write_uN::<B, 26, _>(self, value.into())
122 }
123
124 fn write_u27<B: ByteOrder>(&mut self, value: u27) -> std::io::Result<()> {
125 write_uN::<B, 27, _>(self, value.into())
126 }
127
128 fn write_u28<B: ByteOrder>(&mut self, value: u28) -> std::io::Result<()> {
129 write_uN::<B, 28, _>(self, value.into())
130 }
131
132 fn write_u29<B: ByteOrder>(&mut self, value: u29) -> std::io::Result<()> {
133 write_uN::<B, 29, _>(self, value.into())
134 }
135
136 fn write_u30<B: ByteOrder>(&mut self, value: u30) -> std::io::Result<()> {
137 write_uN::<B, 30, _>(self, value.into())
138 }
139
140 fn write_u31<B: ByteOrder>(&mut self, value: u31) -> std::io::Result<()> {
141 write_uN::<B, 31, _>(self, value.into())
142 }
143
144 fn write_u32<B: ByteOrder>(&mut self, value: u32) -> std::io::Result<()> {
145 write_uN::<B, 32, _>(self, value)
146 }
147}
148
149impl<T> BitWriteExts for T where T: BitWrite + ?Sized {}