1use super::*;
2use crate::Result;
3use core::{cmp, ops};
4
5mod atomic;
6mod cell;
7mod duration;
8mod non_zero;
9mod option;
10mod phantom;
11mod ranges;
12mod ref_cell;
13mod result;
14mod reverse;
15mod unsafe_cell;
16mod wrapping;
17pub use atomic::*;
18pub use cell::*;
19pub use duration::*;
20pub use non_zero::*;
21pub use option::*;
22pub use phantom::*;
23pub use ranges::*;
24pub use ref_cell::*;
25pub use result::*;
26pub use reverse::*;
27pub use unsafe_cell::*;
28pub use wrapping::*;
29
30#[derive(Clone, Debug, Default)]
34pub struct Bool {
35 _private: (),
36}
37
38pub fn bool() -> Bool {
54 Bool { _private: () }
55}
56
57impl Mutate<bool> for Bool {
58 #[inline]
59 fn mutate(&mut self, c: &mut Candidates, value: &mut bool) -> Result<()> {
60 if !c.shrink() || *value {
61 c.mutation(|_ctx| Ok(*value = !*value))?;
62 }
63 Ok(())
64 }
65}
66
67impl Generate<bool> for Bool {
68 #[inline]
69 fn generate(&mut self, ctx: &mut Context) -> Result<bool> {
70 Ok(ctx.rng().gen_bool())
71 }
72}
73
74impl DefaultMutate for bool {
75 type DefaultMutate = Bool;
76}
77
78macro_rules! ints {
79 (
80 $(
81 $fn_name:ident -> $ty_name:ident : $method:ident for $ty:ty ;
82 )*
83 ) => {
84 $(
85 #[doc = concat!("`", stringify!($fn_name), "`")]
87 #[doc = concat!("[`", stringify!($fn_name), "()`]")]
91 #[derive(Clone, Debug, Default)]
94 pub struct $ty_name {
95 _private: (),
96 }
97
98 #[doc = concat!("`", stringify!($ty), "`")]
100 #[doc = concat!("let mut mutator = m::", stringify!($fn_name), "();")]
108 pub fn $fn_name() -> $ty_name {
117 $ty_name { _private: () }
118 }
119
120 impl Mutate<$ty> for $ty_name {
121 #[inline]
122 fn mutate(&mut self, c: &mut Candidates, value: &mut $ty) -> Result<()> {
123 if c.shrink() && *value == 0 {
124 return Ok(());
125 }
126 c.mutation(|ctx| {
127 *value = if ctx.shrink() {
128 ctx.rng().inner().gen_range(0..*value)
129 } else {
130 ctx.rng().$method()
131 };
132 Ok(())
133 })
134 }
135 }
136
137 impl DefaultMutate for $ty {
138 type DefaultMutate = $ty_name;
139 }
140
141 impl Generate<$ty> for $ty_name {
142 #[inline]
143 fn generate(&mut self, ctx: &mut Context) -> Result<$ty> {
144 Ok(ctx.rng().$method())
145 }
146 }
147
148 impl MutateInRange<$ty> for $ty_name {
149 #[inline]
150 fn mutate_in_range(
151 &mut self,
152 c: &mut Candidates,
153 value: &mut $ty,
154 range: &ops::RangeInclusive<$ty>,
155 ) -> Result<()> {
156 let start = *range.start();
157 let end = *range.end();
158
159 if start > end {
160 return Err(Error::invalid_range());
161 }
162
163 if *value == start && c.shrink() {
164 return Ok(());
165 }
166
167 c.mutation(|ctx| {
168 let end = if ctx.shrink() {
169 cmp::min(*value, end)
170 } else {
171 end
172 };
173
174 *value = ctx.rng().inner().gen_range(start..=end);
175 Ok(())
176 })
177 }
178 }
179 )*
180 };
181}
182
183ints! {
184 u8 -> U8 : gen_u8 for u8;
185 u16 -> U16 : gen_u16 for u16;
186 u32 -> U32 : gen_u32 for u32;
187 u64 -> U64 : gen_u64 for u64;
188 u128 -> U128 : gen_u128 for u128;
189 usize -> Usize : gen_usize for usize;
190 i8 -> I8 : gen_i8 for i8;
191 i16 -> I16 : gen_i16 for i16;
192 i32 -> I32 : gen_i32 for i32;
193 i64 -> I64 : gen_i64 for i64;
194 i128 -> I128 : gen_i128 for i128;
195 isize -> Isize : gen_isize for isize;
196}
197
198#[derive(Clone, Debug, Default)]
202pub struct Char {
203 _private: (),
204}
205
206pub fn char() -> Char {
235 Char { _private: () }
236}
237
238impl Mutate<char> for Char {
239 #[inline]
240 fn mutate(&mut self, c: &mut Candidates, value: &mut char) -> Result<()> {
241 if c.shrink() {
242 if *value != '\0' {
243 c.mutation(|ctx| {
244 *value = ctx.rng().inner().gen_range('\0'..*value);
245 Ok(())
246 })?;
247 }
248 Ok(())
249 } else {
250 let ch = |x| char::from_u32(x).unwrap_or_else(|| panic!("invalid char: {x:#x}"));
262 let mut char_range = |start, end| mrange(ch(start)..=ch(end)).mutate(c, value);
263
264 char_range(0x20, 0x7E)?;
266
267 char_range(0x0000, 0xFFFF)?;
269
270 char_range(0x10000, 0x14FFF)?;
272 char_range(0x16000, 0x18FFF)?;
274 char_range(0x1A000, 0x1FFFF)?;
276
277 char_range(0x20000, 0x2FFFF)?;
279
280 char_range(0x30000, 0x32FFF)?;
282
283 c.mutation(|ctx| Ok(*value = ctx.rng().inner().r#gen()))?;
286
287 Ok(())
288 }
289 }
290}
291
292impl DefaultMutate for char {
293 type DefaultMutate = Char;
294}
295
296impl Generate<char> for Char {
297 #[inline]
298 fn generate(&mut self, ctx: &mut Context) -> Result<char> {
299 Ok(ctx.rng().inner().r#gen())
300 }
301}
302
303impl MutateInRange<char> for Char {
304 #[inline]
305 fn mutate_in_range(
306 &mut self,
307 c: &mut Candidates,
308 value: &mut char,
309 range: &ops::RangeInclusive<char>,
310 ) -> Result<()> {
311 let start = *range.start();
312 let end = *range.end();
313
314 if start > end {
315 return Err(Error::invalid_range());
316 }
317
318 if *value == start && c.shrink() {
319 return Ok(());
320 }
321
322 c.mutation(|ctx| {
323 let end = if ctx.shrink() {
324 core::cmp::min(*value, end)
325 } else {
326 end
327 };
328 *value = ctx.rng().inner().gen_range(start..=end);
329 Ok(())
330 })
331 }
332}
333
334#[derive(Clone, Debug, Default)]
338pub struct AsciiChar {
339 _private: (),
340}
341
342pub fn ascii_char() -> AsciiChar {
371 AsciiChar { _private: () }
372}
373
374impl Mutate<char> for AsciiChar {
375 #[inline]
376 fn mutate(&mut self, c: &mut Candidates, value: &mut char) -> Result<()> {
377 if c.shrink() {
378 if *value != '\0' {
379 c.mutation(|ctx| {
380 *value = ctx.rng().inner().gen_range('\0'..*value);
381 Ok(())
382 })?;
383 }
384 Ok(())
385 } else {
386 let ch = |x| char::from_u32(x).unwrap_or_else(|| panic!("invalid char: {x:#x}"));
387 let mut char_range = |start, end| mrange(ch(start)..=ch(end)).mutate(c, value);
388
389 char_range(0x00, 0x7F)?;
390
391 Ok(())
392 }
393 }
394}
395
396impl Generate<char> for AsciiChar {
397 #[inline]
398 fn generate(&mut self, ctx: &mut Context) -> Result<char> {
399 self.generate_via_mutate(ctx, 1)
400 }
401}
402
403pub struct F32 {
407 _private: (),
408}
409
410pub fn f32() -> F32 {
439 F32 { _private: () }
440}
441
442impl Mutate<f32> for F32 {
443 #[inline]
444 fn mutate(&mut self, c: &mut Candidates, value: &mut f32) -> Result<()> {
445 let special_finite = |c: &mut Candidates, value: &mut f32| -> Result<()> {
446 c.mutation(|_| Ok(*value = 0.0))?;
447 c.mutation(|_| Ok(*value = 1.0))?;
448 c.mutation(|_| Ok(*value = -1.0))?;
449 c.mutation(|_| Ok(*value = f32::EPSILON))?;
450 c.mutation(|_| Ok(*value = f32::MIN_POSITIVE))?;
451 c.mutation(|_| Ok(*value = f32::MAX))?;
452 c.mutation(|_| Ok(*value = f32::MIN))?;
453 Ok(())
454 };
455
456 let finite = |c: &mut Candidates, value: &mut f32| -> Result<()> {
457 special_finite(c, value)?;
458
459 c.mutation(|ctx| Ok(*value = ctx.rng().inner().r#gen::<f32>() * f32::MAX))?;
461
462 c.mutation(|ctx| Ok(*value = ctx.rng().inner().r#gen::<f32>() * f32::MIN))?;
464
465 Ok(())
466 };
467
468 if c.shrink() {
469 if *value == 0.0 {
470 return Ok(());
471 }
472 if value.is_nan() || value.is_infinite() {
473 return finite(c, value);
474 }
475 c.mutation(|ctx| Ok(*value *= ctx.rng().inner().r#gen::<f32>()))?;
476 Ok(())
477 } else {
478 finite(c, value)?;
479 c.mutation(|_| Ok(*value = f32::INFINITY))?;
480 c.mutation(|_| Ok(*value = f32::NEG_INFINITY))?;
481 c.mutation(|_| Ok(*value = f32::NAN))?;
482 Ok(())
483 }
484 }
485}
486
487impl Generate<f32> for F32 {
488 #[inline]
489 fn generate(&mut self, ctx: &mut Context) -> Result<f32> {
490 Ok(ctx.rng().inner().r#gen::<f32>() * f32::MAX)
491 }
492}
493
494pub struct F64 {
498 _private: (),
499}
500
501pub fn f64() -> F64 {
530 F64 { _private: () }
531}
532
533impl Mutate<f64> for F64 {
534 #[inline]
535 fn mutate(&mut self, c: &mut Candidates, value: &mut f64) -> Result<()> {
536 let special_finite = |c: &mut Candidates, value: &mut f64| -> Result<()> {
537 c.mutation(|_| Ok(*value = 0.0))?;
538 c.mutation(|_| Ok(*value = 1.0))?;
539 c.mutation(|_| Ok(*value = -1.0))?;
540 c.mutation(|_| Ok(*value = f64::EPSILON))?;
541 c.mutation(|_| Ok(*value = f64::MIN_POSITIVE))?;
542 c.mutation(|_| Ok(*value = f64::MAX))?;
543 c.mutation(|_| Ok(*value = f64::MIN))?;
544 Ok(())
545 };
546
547 let finite = |c: &mut Candidates, value: &mut f64| -> Result<()> {
548 special_finite(c, value)?;
549
550 c.mutation(|ctx| Ok(*value = ctx.rng().inner().r#gen::<f64>() * f64::MAX))?;
552
553 c.mutation(|ctx| Ok(*value = ctx.rng().inner().r#gen::<f64>() * f64::MIN))?;
555
556 Ok(())
557 };
558
559 if c.shrink() {
560 if *value == 0.0 {
561 return Ok(());
562 }
563 if value.is_nan() || value.is_infinite() {
564 return finite(c, value);
565 }
566 c.mutation(|ctx| Ok(*value *= ctx.rng().inner().r#gen::<f64>()))?;
567 Ok(())
568 } else {
569 finite(c, value)?;
570 c.mutation(|_| Ok(*value = f64::INFINITY))?;
571 c.mutation(|_| Ok(*value = f64::NEG_INFINITY))?;
572 c.mutation(|_| Ok(*value = f64::NAN))?;
573 Ok(())
574 }
575 }
576}
577
578impl Generate<f64> for F64 {
579 #[inline]
580 fn generate(&mut self, ctx: &mut Context) -> Result<f64> {
581 Ok(ctx.rng().inner().r#gen::<f64>() * f64::MAX)
582 }
583}
584
585macro_rules! tuples {
586 ( $( $fn_name:ident -> $ty_name:ident ( $( $m:ident : $t:ident , )* ) ; )* ) => {
587 $(
588 #[derive(Clone, Debug, Default)]
590 #[allow(non_snake_case)]
591 pub struct $ty_name<$( $m , )*> {
592 $(
593 $m: $m,
594 )*
595 }
596
597 #[doc = stringify!(tuples!(@count $( $m )*))]
599 #[allow(non_snake_case)]
618 pub fn $fn_name< $( $m ),* >( $( $m: $m ),* ) -> $ty_name<$( $m , )*> {
619 $ty_name {
620 $(
621 $m,
622 )*
623 }
624 }
625
626 #[allow(non_snake_case)]
627 impl< $( $m , $t, )* > Mutate<( $( $t , )* )> for $ty_name<$( $m , )*>
628 where
629 $(
630 $m: Mutate<$t>,
631 )*
632 {
633 #[inline]
634 fn mutate(
635 &mut self,
636 _c: &mut Candidates,
637 ( $( $t , )* ): &mut ( $( $t , )* ),
638 ) -> Result<()> {
639 $(
640 self.$m.mutate(_c, $t)?;
641 )*
642 Ok(())
643 }
644 }
645
646 #[allow(non_snake_case)]
647 impl< $( $m , $t, )* > Generate<( $( $t , )* )> for $ty_name<$( $m , )*>
648 where
649 $(
650 $m: Generate<$t>,
651 )*
652 {
653 #[inline]
654 fn generate(&mut self, _ctx: &mut Context) -> Result<( $( $t , )* )> {
655 Ok(( $( self.$m.generate(_ctx)? , )* ))
656 }
657 }
658
659 #[allow(non_snake_case)]
660 impl< $( $t , )* > DefaultMutate for ( $( $t , )* )
661 where
662 $(
663 $t: DefaultMutate,
664 )*
665 {
666 type DefaultMutate = $ty_name<$( $t::DefaultMutate , )*>;
667 }
668 )*
669 };
670
671 (@count) => { 0 };
672 (@count $head:ident $( $rest:ident )*) => { 1 + tuples!(@count $( $rest )*) };
673}
674
675tuples! {
676 tuple1 -> Tuple1(M0: T0,);
677 tuple2 -> Tuple2(M0: T0, M1: T1,);
678 tuple3 -> Tuple3(M0: T0, M1: T1, M2: T2,);
679 tuple4 -> Tuple4(M0: T0, M1: T1, M2: T2, M3: T3,);
680 tuple5 -> Tuple5(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4,);
681 tuple6 -> Tuple6(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5,);
682 tuple7 -> Tuple7(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6,);
683 tuple8 -> Tuple8(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6, M7: T7,);
684 tuple9 -> Tuple9(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6, M7: T7, M8: T8,);
685 tuple10 -> Tuple10(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6, M7: T7, M8: T8, M9: T9,);
686 tuple11 -> Tuple11(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6, M7: T7, M8: T8, M9: T9, M10: T10,);
687 tuple12 -> Tuple12(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6, M7: T7, M8: T8, M9: T9, M10: T10, M11: T11,);
688 tuple13 -> Tuple13(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6, M7: T7, M8: T8, M9: T9, M10: T10, M11: T11, M12: T12,);
689 tuple14 -> Tuple14(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6, M7: T7, M8: T8, M9: T9, M10: T10, M11: T11, M12: T12, M13: T13,);
690 tuple15 -> Tuple15(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6, M7: T7, M8: T8, M9: T9, M10: T10, M11: T11, M12: T12, M13: T13, M14: T14,);
691 tuple16 -> Tuple16(M0: T0, M1: T1, M2: T2, M3: T3, M4: T4, M5: T5, M6: T6, M7: T7, M8: T8, M9: T9, M10: T10, M11: T11, M12: T12, M13: T13, M14: T14, M15: T15,);
692}
693
694#[derive(Clone, Debug, Default)]
696pub struct Unit {
697 _private: (),
698}
699
700pub fn unit() -> Unit {
718 Unit { _private: () }
719}
720
721impl Mutate<()> for Unit {
722 #[inline]
723 fn mutate(&mut self, _c: &mut Candidates, _value: &mut ()) -> Result<()> {
724 Ok(())
725 }
726}
727
728impl Generate<()> for Unit {
729 #[inline]
730 fn generate(&mut self, _ctx: &mut Context) -> Result<()> {
731 Ok(())
732 }
733}
734
735#[derive(Clone, Debug, Default)]
740pub struct Array<const N: usize, M> {
741 mutator: M,
742}
743
744pub fn array<const N: usize, M>(mutator: M) -> Array<N, M> {
760 Array { mutator }
761}
762
763impl<const N: usize, M, T> Mutate<[T; N]> for Array<N, M>
764where
765 M: Mutate<T>,
766{
767 #[inline]
768 fn mutate(&mut self, c: &mut Candidates, value: &mut [T; N]) -> Result<()> {
769 for element in value.iter_mut() {
770 self.mutator.mutate(c, element)?;
771 }
772 Ok(())
773 }
774}
775
776impl<const N: usize, M, T> Generate<[T; N]> for Array<N, M>
777where
778 M: Generate<T>,
779{
780 #[inline]
781 fn generate(&mut self, ctx: &mut Context) -> Result<[T; N]> {
782 let mut arr: [core::mem::MaybeUninit<T>; N] =
783 core::array::from_fn(|_| core::mem::MaybeUninit::uninit());
784 for elem in arr.iter_mut() {
785 elem.write(self.mutator.generate(ctx)?);
786 }
787 Ok(unsafe { core::mem::transmute_copy(&arr) })
788 }
789}
790
791impl<const N: usize, T> DefaultMutate for [T; N]
792where
793 T: DefaultMutate,
794{
795 type DefaultMutate = Array<N, T::DefaultMutate>;
796}