1use crate::{TBuffer, TBytes};
2
3impl<T: TBytes> TBytes for ::std::ops::Range<T> {
4 fn size(&self) -> usize {
5 self.end.size() + self.end.size()
6 }
7
8 fn to_bytes(&self) -> Vec<u8> {
9 let mut buffer = Vec::with_capacity(self.size());
10
11 buffer.append(&mut self.start.to_bytes());
12 buffer.append(&mut self.end.to_bytes());
13
14 buffer
15 }
16
17 fn from_bytes(buffer: &mut TBuffer) -> Option<Self>
18 where
19 Self: Sized,
20 {
21 let start = T::from_bytes(buffer);
22 let end = T::from_bytes(buffer);
23
24 if let Some(start) = start {
25 if let Some(end) = end {
26 Some(start..end)
27 } else {
28 let mut bytes = start.to_bytes();
29 while let Some(byte) = bytes.pop() {
30 buffer.insert(0, byte)
31 }
32 None
33 }
34 } else {
35 None
36 }
37 }
38}
39
40impl<T: TBytes> TBytes for ::std::ops::RangeInclusive<T> {
41 fn size(&self) -> usize {
42 self.start().size() + self.end().size()
43 }
44
45 fn to_bytes(&self) -> Vec<u8> {
46 let mut buffer = Vec::with_capacity(self.size());
47
48 buffer.append(&mut self.start().to_bytes());
49 buffer.append(&mut self.end().to_bytes());
50
51 buffer
52 }
53
54 fn from_bytes(buffer: &mut TBuffer) -> Option<Self>
55 where
56 Self: Sized,
57 {
58 let start = T::from_bytes(buffer);
59 let end = T::from_bytes(buffer);
60
61 if let Some(start) = start {
62 if let Some(end) = end {
63 Some(start..=end)
64 } else {
65 let mut bytes = start.to_bytes();
66 while let Some(byte) = bytes.pop() {
67 buffer.insert(0, byte)
68 }
69 None
70 }
71 } else {
72 None
73 }
74 }
75}
76
77impl<T: TBytes> TBytes for ::std::ops::RangeToInclusive<T> {
78 fn size(&self) -> usize {
79 self.end.size()
80 }
81
82 fn to_bytes(&self) -> Vec<u8> {
83 self.end.to_bytes()
84 }
85
86 fn from_bytes(buffer: &mut TBuffer) -> Option<Self>
87 where
88 Self: Sized,
89 {
90 let end = T::from_bytes(buffer)?;
91 Some(..=end)
92 }
93}
94
95impl TBytes for ::std::ops::RangeFull {
96 fn size(&self) -> usize {
97 0
98 }
99
100 fn to_bytes(&self) -> Vec<u8> {
101 Vec::new()
102 }
103
104 fn from_bytes(_: &mut TBuffer) -> Option<Self>
105 where
106 Self: Sized,
107 {
108 Some(..)
109 }
110}
111
112impl<T: TBytes> TBytes for ::std::ops::RangeTo<T> {
113 fn size(&self) -> usize {
114 self.end.size()
115 }
116
117 fn to_bytes(&self) -> Vec<u8> {
118 self.end.to_bytes()
119 }
120
121 fn from_bytes(buffer: &mut TBuffer) -> Option<Self>
122 where
123 Self: Sized,
124 {
125 let end = T::from_bytes(buffer)?;
126 Some(..end)
127 }
128}
129
130impl<T: TBytes> TBytes for ::std::ops::RangeFrom<T> {
131 fn size(&self) -> usize {
132 self.start.size()
133 }
134
135 fn to_bytes(&self) -> Vec<u8> {
136 self.start.to_bytes()
137 }
138
139 fn from_bytes(buffer: &mut TBuffer) -> Option<Self>
140 where
141 Self: Sized,
142 {
143 let start = T::from_bytes(buffer)?;
144 Some(start..)
145 }
146}
147
148#[cfg(test)]
149mod test {
150 use std::ops::{Range, RangeFrom, RangeInclusive, RangeTo, RangeToInclusive};
151
152 use crate::TBytes;
153
154 #[test]
155 fn range() {
156 let a = 13..21;
157
158 let mut bytes = a.to_bytes();
159
160 let b = <Range<i32>>::from_bytes(&mut bytes).unwrap();
161
162 assert_eq!(a, b)
163 }
164
165 #[test]
166 fn range_incomplete() {
167 let mut buffer = Vec::new();
168 buffer.append(&mut 50usize.to_bytes());
169
170 let clone_buffer = buffer.clone();
171
172 let other_buffer = Range::<usize>::from_bytes(&mut buffer);
173 if let Some(other_buffer) = other_buffer {
174 panic!("This should be possible! Other buffer: {other_buffer:?}");
175 }
176
177 assert_eq!(buffer, clone_buffer);
178 buffer.append(&mut 100usize.to_bytes());
179
180 let value = Range::<usize>::from_bytes(&mut buffer).unwrap();
181 assert_eq!(value, 50..100)
182 }
183
184 #[test]
185 fn range_to() {
186 let a = ..21;
187
188 let mut bytes = a.to_bytes();
189
190 let b = <RangeTo<i32>>::from_bytes(&mut bytes).unwrap();
191
192 assert_eq!(a, b)
193 }
194
195 #[test]
196 fn range_from() {
197 let a = 21..;
198
199 let mut bytes = a.to_bytes();
200
201 let b = <RangeFrom<i32>>::from_bytes(&mut bytes).unwrap();
202
203 assert_eq!(a, b)
204 }
205
206 #[test]
207 fn range_inclusive() {
208 let a = 6..=21;
209
210 let mut bytes = a.to_bytes();
211
212 let b = <RangeInclusive<i32>>::from_bytes(&mut bytes).unwrap();
213
214 assert_eq!(a, b)
215 }
216
217 #[test]
218 fn range_inclusive_incomplete() {
219 let mut buffer = Vec::new();
220 buffer.append(&mut 50usize.to_bytes());
221
222 let clone_buffer = buffer.clone();
223
224 let other_buffer = RangeInclusive::<usize>::from_bytes(&mut buffer);
225 if let Some(other_buffer) = other_buffer {
226 panic!("This should be possible! Other buffer: {other_buffer:?}");
227 }
228
229 assert_eq!(buffer, clone_buffer);
230 buffer.append(&mut 100usize.to_bytes());
231
232 let value = RangeInclusive::<usize>::from_bytes(&mut buffer).unwrap();
233 assert_eq!(value, 50..=100)
234 }
235
236 #[test]
237 fn range_to_inclusive() {
238 let a = ..=23;
239
240 let mut bytes = a.to_bytes();
241
242 let b = <RangeToInclusive<i32>>::from_bytes(&mut bytes).unwrap();
243
244 assert_eq!(a, b)
245 }
246}