aboutsummaryrefslogtreecommitdiff
path: root/lib/src/lib.rs
diff options
context:
space:
mode:
authorLizzy Fleckenstein <eliasfleckenstein@web.de>2023-02-05 19:20:16 +0100
committerLizzy Fleckenstein <eliasfleckenstein@web.de>2023-02-06 16:50:23 +0100
commit51d7842fe16ba070f63bbab925161ea352970759 (patch)
tree3432fe61bbf11c908b99d42761e0d05c63d1380b /lib/src/lib.rs
parentdbe6934449b4db1162079cbc39d89d51728bdda1 (diff)
downloadgenerate-random-51d7842fe16ba070f63bbab925161ea352970759.tar.xz
Support arrays
Diffstat (limited to 'lib/src/lib.rs')
-rw-r--r--lib/src/lib.rs17
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/src/lib.rs b/lib/src/lib.rs
index e954eb4..ed76cba 100644
--- a/lib/src/lib.rs
+++ b/lib/src/lib.rs
@@ -82,6 +82,23 @@ impl<T: GenerateRandom> GenerateRandom for Option<T> {
}
}
+impl<T: GenerateRandom, const N: usize> GenerateRandom for [T; N] {
+ fn generate_random<R: rand::Rng + ?Sized>(rng: &mut R) -> Self {
+ use core::mem::MaybeUninit;
+
+ let mut arr: [MaybeUninit<T>; N] = unsafe { MaybeUninit::uninit().assume_init() };
+
+ for elem in arr.iter_mut() {
+ *elem = MaybeUninit::new(T::generate_random(rng));
+ }
+
+ let ret = unsafe { std::mem::transmute_copy(&arr) };
+ std::mem::forget(arr);
+
+ ret
+ }
+}
+
macro_rules! impl_generate_random_tuple {
( $t0:ident $( $t:ident )* ) => {
impl< $t0, $( $t, )* > GenerateRandom for ( $t0, $( $t, )* )