Browse Source

utils: add pseudorandom conversion

Lennart Braun 2 years ago
parent
commit
2d8514bc73
2 changed files with 38 additions and 0 deletions
  1. 1 0
      utils/src/lib.rs
  2. 37 0
      utils/src/pseudorandom_conversion.rs

+ 1 - 0
utils/src/lib.rs

@@ -1 +1,2 @@
 pub mod fixed_key_aes;
+pub mod pseudorandom_conversion;

+ 37 - 0
utils/src/pseudorandom_conversion.rs

@@ -0,0 +1,37 @@
+use core::num::Wrapping;
+
+pub trait PRConvertTo<T> {
+    fn convert(randomness: u128) -> T;
+}
+
+pub struct PRConverter {}
+
+impl PRConvertTo<u8> for PRConverter {
+    fn convert(randomness: u128) -> u8 {
+        (randomness & 0xff) as u8
+    }
+}
+impl PRConvertTo<u16> for PRConverter {
+    fn convert(randomness: u128) -> u16 {
+        (randomness & 0xffff) as u16
+    }
+}
+impl PRConvertTo<u32> for PRConverter {
+    fn convert(randomness: u128) -> u32 {
+        (randomness & 0xffffffff) as u32
+    }
+}
+impl PRConvertTo<u64> for PRConverter {
+    fn convert(randomness: u128) -> u64 {
+        (randomness & 0xffffffffffffffff) as u64
+    }
+}
+
+impl<T> PRConvertTo<Wrapping<T>> for PRConverter
+where
+    PRConverter: PRConvertTo<T>,
+{
+    fn convert(randomness: u128) -> Wrapping<T> {
+        Wrapping(<Self as PRConvertTo<T>>::convert(randomness))
+    }
+}