1use super::Driver;
2use core::ops::{self, Bound};
3
4pub trait DynDriver {
6 fn depth(&self) -> usize;
7 fn set_depth(&mut self, depth: usize);
8 fn max_depth(&self) -> usize;
9 fn gen_variant(&mut self, variants: usize, base_case: usize) -> Option<usize>;
10 fn gen_u8(&mut self, min: Bound<&u8>, max: Bound<&u8>) -> Option<u8>;
11 fn gen_i8(&mut self, min: Bound<&i8>, max: Bound<&i8>) -> Option<i8>;
12 fn gen_u16(&mut self, min: Bound<&u16>, max: Bound<&u16>) -> Option<u16>;
13 fn gen_i16(&mut self, min: Bound<&i16>, max: Bound<&i16>) -> Option<i16>;
14 fn gen_u32(&mut self, min: Bound<&u32>, max: Bound<&u32>) -> Option<u32>;
15 fn gen_i32(&mut self, min: Bound<&i32>, max: Bound<&i32>) -> Option<i32>;
16 fn gen_u64(&mut self, min: Bound<&u64>, max: Bound<&u64>) -> Option<u64>;
17 fn gen_i64(&mut self, min: Bound<&i64>, max: Bound<&i64>) -> Option<i64>;
18 fn gen_u128(&mut self, min: Bound<&u128>, max: Bound<&u128>) -> Option<u128>;
19 fn gen_i128(&mut self, min: Bound<&i128>, max: Bound<&i128>) -> Option<i128>;
20 fn gen_usize(&mut self, min: Bound<&usize>, max: Bound<&usize>) -> Option<usize>;
21 fn gen_isize(&mut self, min: Bound<&isize>, max: Bound<&isize>) -> Option<isize>;
22 fn gen_f32(&mut self, min: Bound<&f32>, max: Bound<&f32>) -> Option<f32>;
23 fn gen_f64(&mut self, min: Bound<&f64>, max: Bound<&f64>) -> Option<f64>;
24 fn gen_char(&mut self, min: Bound<&char>, max: Bound<&char>) -> Option<char>;
25 fn gen_bool(&mut self, probability: Option<f32>) -> Option<bool>;
26 fn gen_from_bytes(
27 &mut self,
28 hint: &mut dyn FnMut() -> (usize, Option<usize>),
29 produce: &mut dyn FnMut(&[u8]) -> Option<usize>,
30 ) -> Option<()>;
31}
32
33#[inline]
35fn hint_fn<F: FnOnce() -> (usize, Option<usize>)>(f: F) -> impl FnMut() -> (usize, Option<usize>) {
36 enum Hint<F> {
37 Pending(F),
38 Resolved((usize, Option<usize>)),
39 }
40
41 impl<F: FnOnce() -> (usize, Option<usize>)> Hint<F> {
42 #[inline]
43 fn get(&mut self) -> (usize, Option<usize>) {
44 match core::mem::replace(self, Hint::Resolved((0, None))) {
45 Hint::Pending(f) => {
46 let value = f();
47 *self = Hint::Resolved(value);
48 value
49 }
50 Hint::Resolved(value) => {
51 *self = Hint::Resolved(value);
52 value
53 }
54 }
55 }
56 }
57
58 let mut hint = Hint::Pending(f);
59
60 move || hint.get()
61}
62
63pub struct Borrowed<'a>(pub &'a mut dyn DynDriver);
64
65impl Driver for Borrowed<'_> {
66 #[inline]
67 fn depth(&self) -> usize {
68 self.0.depth()
69 }
70
71 #[inline]
72 fn set_depth(&mut self, depth: usize) {
73 self.0.set_depth(depth);
74 }
75
76 #[inline]
77 fn max_depth(&self) -> usize {
78 self.0.max_depth()
79 }
80
81 #[inline]
82 fn gen_variant(&mut self, variants: usize, base_case: usize) -> Option<usize> {
83 self.0.gen_variant(variants, base_case)
84 }
85
86 #[inline]
87 fn gen_u8(&mut self, min: Bound<&u8>, max: Bound<&u8>) -> Option<u8> {
88 self.0.gen_u8(min, max)
89 }
90
91 #[inline]
92 fn gen_i8(&mut self, min: Bound<&i8>, max: Bound<&i8>) -> Option<i8> {
93 self.0.gen_i8(min, max)
94 }
95
96 #[inline]
97 fn gen_u16(&mut self, min: Bound<&u16>, max: Bound<&u16>) -> Option<u16> {
98 self.0.gen_u16(min, max)
99 }
100
101 #[inline]
102 fn gen_i16(&mut self, min: Bound<&i16>, max: Bound<&i16>) -> Option<i16> {
103 self.0.gen_i16(min, max)
104 }
105
106 #[inline]
107 fn gen_u32(&mut self, min: Bound<&u32>, max: Bound<&u32>) -> Option<u32> {
108 self.0.gen_u32(min, max)
109 }
110
111 #[inline]
112 fn gen_i32(&mut self, min: Bound<&i32>, max: Bound<&i32>) -> Option<i32> {
113 self.0.gen_i32(min, max)
114 }
115
116 #[inline]
117 fn gen_u64(&mut self, min: Bound<&u64>, max: Bound<&u64>) -> Option<u64> {
118 self.0.gen_u64(min, max)
119 }
120
121 #[inline]
122 fn gen_i64(&mut self, min: Bound<&i64>, max: Bound<&i64>) -> Option<i64> {
123 self.0.gen_i64(min, max)
124 }
125
126 #[inline]
127 fn gen_u128(&mut self, min: Bound<&u128>, max: Bound<&u128>) -> Option<u128> {
128 self.0.gen_u128(min, max)
129 }
130
131 #[inline]
132 fn gen_i128(&mut self, min: Bound<&i128>, max: Bound<&i128>) -> Option<i128> {
133 self.0.gen_i128(min, max)
134 }
135
136 #[inline]
137 fn gen_usize(&mut self, min: Bound<&usize>, max: Bound<&usize>) -> Option<usize> {
138 self.0.gen_usize(min, max)
139 }
140
141 #[inline]
142 fn gen_isize(&mut self, min: Bound<&isize>, max: Bound<&isize>) -> Option<isize> {
143 self.0.gen_isize(min, max)
144 }
145
146 #[inline]
147 fn gen_f32(&mut self, min: Bound<&f32>, max: Bound<&f32>) -> Option<f32> {
148 self.0.gen_f32(min, max)
149 }
150
151 #[inline]
152 fn gen_f64(&mut self, min: Bound<&f64>, max: Bound<&f64>) -> Option<f64> {
153 self.0.gen_f64(min, max)
154 }
155
156 #[inline]
157 fn gen_char(&mut self, min: Bound<&char>, max: Bound<&char>) -> Option<char> {
158 self.0.gen_char(min, max)
159 }
160
161 #[inline]
162 fn gen_bool(&mut self, probability: Option<f32>) -> Option<bool> {
163 self.0.gen_bool(probability)
164 }
165
166 #[inline]
167 fn gen_from_bytes<Hint, Gen, T>(&mut self, hint: Hint, mut produce: Gen) -> Option<T>
168 where
169 Hint: FnOnce() -> (usize, Option<usize>),
170 Gen: FnMut(&[u8]) -> Option<(usize, T)>,
171 {
172 let mut value = None;
173 let mut hint = hint_fn(hint);
174 self.0.gen_from_bytes(&mut hint, &mut |bytes| {
175 let (len, v) = produce(bytes)?;
176 value = Some(v);
177 Some(len)
178 })?;
179 value
180 }
181}
182
183impl<D: DynDriver> Driver for D {
184 #[inline]
185 fn depth(&self) -> usize {
186 <D as DynDriver>::depth(self)
187 }
188
189 #[inline]
190 fn set_depth(&mut self, depth: usize) {
191 <D as DynDriver>::set_depth(self, depth)
192 }
193
194 #[inline]
195 fn max_depth(&self) -> usize {
196 <D as DynDriver>::max_depth(self)
197 }
198
199 #[inline]
200 fn gen_variant(&mut self, variants: usize, base_case: usize) -> Option<usize> {
201 <D as DynDriver>::gen_variant(self, variants, base_case)
202 }
203
204 #[inline]
205 fn gen_u8(&mut self, min: Bound<&u8>, max: Bound<&u8>) -> Option<u8> {
206 <D as DynDriver>::gen_u8(self, min, max)
207 }
208
209 #[inline]
210 fn gen_i8(&mut self, min: Bound<&i8>, max: Bound<&i8>) -> Option<i8> {
211 <D as DynDriver>::gen_i8(self, min, max)
212 }
213
214 #[inline]
215 fn gen_u16(&mut self, min: Bound<&u16>, max: Bound<&u16>) -> Option<u16> {
216 <D as DynDriver>::gen_u16(self, min, max)
217 }
218
219 #[inline]
220 fn gen_i16(&mut self, min: Bound<&i16>, max: Bound<&i16>) -> Option<i16> {
221 <D as DynDriver>::gen_i16(self, min, max)
222 }
223
224 #[inline]
225 fn gen_u32(&mut self, min: Bound<&u32>, max: Bound<&u32>) -> Option<u32> {
226 <D as DynDriver>::gen_u32(self, min, max)
227 }
228
229 #[inline]
230 fn gen_i32(&mut self, min: Bound<&i32>, max: Bound<&i32>) -> Option<i32> {
231 <D as DynDriver>::gen_i32(self, min, max)
232 }
233
234 #[inline]
235 fn gen_u64(&mut self, min: Bound<&u64>, max: Bound<&u64>) -> Option<u64> {
236 <D as DynDriver>::gen_u64(self, min, max)
237 }
238
239 #[inline]
240 fn gen_i64(&mut self, min: Bound<&i64>, max: Bound<&i64>) -> Option<i64> {
241 <D as DynDriver>::gen_i64(self, min, max)
242 }
243
244 #[inline]
245 fn gen_u128(&mut self, min: Bound<&u128>, max: Bound<&u128>) -> Option<u128> {
246 <D as DynDriver>::gen_u128(self, min, max)
247 }
248
249 #[inline]
250 fn gen_i128(&mut self, min: Bound<&i128>, max: Bound<&i128>) -> Option<i128> {
251 <D as DynDriver>::gen_i128(self, min, max)
252 }
253
254 #[inline]
255 fn gen_usize(&mut self, min: Bound<&usize>, max: Bound<&usize>) -> Option<usize> {
256 <D as DynDriver>::gen_usize(self, min, max)
257 }
258
259 #[inline]
260 fn gen_isize(&mut self, min: Bound<&isize>, max: Bound<&isize>) -> Option<isize> {
261 <D as DynDriver>::gen_isize(self, min, max)
262 }
263
264 #[inline]
265 fn gen_f32(&mut self, min: Bound<&f32>, max: Bound<&f32>) -> Option<f32> {
266 <D as DynDriver>::gen_f32(self, min, max)
267 }
268
269 #[inline]
270 fn gen_f64(&mut self, min: Bound<&f64>, max: Bound<&f64>) -> Option<f64> {
271 <D as DynDriver>::gen_f64(self, min, max)
272 }
273
274 #[inline]
275 fn gen_char(&mut self, min: Bound<&char>, max: Bound<&char>) -> Option<char> {
276 <D as DynDriver>::gen_char(self, min, max)
277 }
278
279 #[inline]
280 fn gen_bool(&mut self, probability: Option<f32>) -> Option<bool> {
281 <D as DynDriver>::gen_bool(self, probability)
282 }
283
284 #[inline]
285 fn gen_from_bytes<Hint, Gen, T>(&mut self, hint: Hint, mut produce: Gen) -> Option<T>
286 where
287 Hint: FnOnce() -> (usize, Option<usize>),
288 Gen: FnMut(&[u8]) -> Option<(usize, T)>,
289 {
290 let mut value = None;
291 let mut hint = hint_fn(hint);
292 <D as DynDriver>::gen_from_bytes(self, &mut hint, &mut |bytes| {
293 let (len, v) = produce(bytes)?;
294 value = Some(v);
295 Some(len)
296 })?;
297 value
298 }
299}
300
301#[derive(Clone, Default, Debug)]
302pub struct Object<D: super::Driver>(pub D);
303
304impl<D: Driver> ops::Deref for Object<D> {
305 type Target = D;
306
307 #[inline]
308 fn deref(&self) -> &Self::Target {
309 &self.0
310 }
311}
312
313impl<D: Driver> ops::DerefMut for Object<D> {
314 #[inline]
315 fn deref_mut(&mut self) -> &mut Self::Target {
316 &mut self.0
317 }
318}
319
320impl<D: super::Driver> DynDriver for Object<D> {
321 #[inline]
322 fn depth(&self) -> usize {
323 <D as Driver>::depth(self)
324 }
325
326 #[inline]
327 fn set_depth(&mut self, depth: usize) {
328 <D as Driver>::set_depth(self, depth)
329 }
330
331 #[inline]
332 fn max_depth(&self) -> usize {
333 <D as Driver>::max_depth(self)
334 }
335
336 #[inline]
337 fn gen_variant(&mut self, variants: usize, base_case: usize) -> Option<usize> {
338 <D as Driver>::gen_variant(self, variants, base_case)
339 }
340
341 #[inline]
342 fn gen_u8(&mut self, min: Bound<&u8>, max: Bound<&u8>) -> Option<u8> {
343 <D as Driver>::gen_u8(self, min, max)
344 }
345
346 #[inline]
347 fn gen_i8(&mut self, min: Bound<&i8>, max: Bound<&i8>) -> Option<i8> {
348 <D as Driver>::gen_i8(self, min, max)
349 }
350
351 #[inline]
352 fn gen_u16(&mut self, min: Bound<&u16>, max: Bound<&u16>) -> Option<u16> {
353 <D as Driver>::gen_u16(self, min, max)
354 }
355
356 #[inline]
357 fn gen_i16(&mut self, min: Bound<&i16>, max: Bound<&i16>) -> Option<i16> {
358 <D as Driver>::gen_i16(self, min, max)
359 }
360
361 #[inline]
362 fn gen_u32(&mut self, min: Bound<&u32>, max: Bound<&u32>) -> Option<u32> {
363 <D as Driver>::gen_u32(self, min, max)
364 }
365
366 #[inline]
367 fn gen_i32(&mut self, min: Bound<&i32>, max: Bound<&i32>) -> Option<i32> {
368 <D as Driver>::gen_i32(self, min, max)
369 }
370
371 #[inline]
372 fn gen_u64(&mut self, min: Bound<&u64>, max: Bound<&u64>) -> Option<u64> {
373 <D as Driver>::gen_u64(self, min, max)
374 }
375
376 #[inline]
377 fn gen_i64(&mut self, min: Bound<&i64>, max: Bound<&i64>) -> Option<i64> {
378 <D as Driver>::gen_i64(self, min, max)
379 }
380
381 #[inline]
382 fn gen_u128(&mut self, min: Bound<&u128>, max: Bound<&u128>) -> Option<u128> {
383 <D as Driver>::gen_u128(self, min, max)
384 }
385
386 #[inline]
387 fn gen_i128(&mut self, min: Bound<&i128>, max: Bound<&i128>) -> Option<i128> {
388 <D as Driver>::gen_i128(self, min, max)
389 }
390
391 #[inline]
392 fn gen_usize(&mut self, min: Bound<&usize>, max: Bound<&usize>) -> Option<usize> {
393 <D as Driver>::gen_usize(self, min, max)
394 }
395
396 #[inline]
397 fn gen_isize(&mut self, min: Bound<&isize>, max: Bound<&isize>) -> Option<isize> {
398 <D as Driver>::gen_isize(self, min, max)
399 }
400
401 #[inline]
402 fn gen_f32(&mut self, min: Bound<&f32>, max: Bound<&f32>) -> Option<f32> {
403 <D as Driver>::gen_f32(self, min, max)
404 }
405
406 #[inline]
407 fn gen_f64(&mut self, min: Bound<&f64>, max: Bound<&f64>) -> Option<f64> {
408 <D as Driver>::gen_f64(self, min, max)
409 }
410
411 #[inline]
412 fn gen_char(&mut self, min: Bound<&char>, max: Bound<&char>) -> Option<char> {
413 <D as Driver>::gen_char(self, min, max)
414 }
415
416 #[inline]
417 fn gen_bool(&mut self, probability: Option<f32>) -> Option<bool> {
418 <D as Driver>::gen_bool(self, probability)
419 }
420
421 #[inline]
422 fn gen_from_bytes(
423 &mut self,
424 hint: &mut dyn FnMut() -> (usize, Option<usize>),
425 produce: &mut dyn FnMut(&[u8]) -> Option<usize>,
426 ) -> Option<()> {
427 <D as Driver>::gen_from_bytes(self, hint, |bytes| {
428 let len = produce(bytes)?;
429 Some((len, ()))
430 })?;
431 Some(())
432 }
433}
434
435#[cfg(test)]
436mod tests {
437 use super::*;
438
439 #[allow(dead_code)]
440 fn assert_object_safe(_: &dyn DynDriver) {}
441
442 #[allow(dead_code)]
443 fn assert_dyn_cast<T: 'static + Driver>(driver: T) -> Box<dyn DynDriver> {
444 Box::new(Object(driver))
445 }
446}