use crate::{SobolType, InternalType, LossyFrom};
use std::{u8, u16, u32, u64, u128};
use std::{i8, i16, i32, i64, i128};
use std::{f32, f64};
impl SobolType for f32 {
type IT = u32;
const MAX_RESOLUTION: usize = 24; fn render(val: u32) -> f32 {
(val as f32) / 4_294_967_296_f32
}
}
impl SobolType for f64 {
type IT = u64;
const MAX_RESOLUTION: usize = 53; fn render(val: u64) -> f64 {
(val as f64) / 18_446_744_073_709_551_616_f64
}
}
impl SobolType for u8 {
type IT = u8;
fn render(val: u8) -> u8 {
val
}
}
impl SobolType for u16 {
type IT = u16;
fn render(val: u16) -> u16 {
val
}
}
impl SobolType for u32 {
type IT = u32;
fn render(val: u32) -> u32 {
val
}
}
impl SobolType for u64 {
type IT = u64;
fn render(val: u64) -> u64 {
val
}
}
impl SobolType for u128 {
type IT = u128;
fn render(val: u128) -> u128 {
val
}
}
impl SobolType for i8 {
type IT = u8;
fn render(val: u8) -> i8 {
(val ^ 0x80) as i8
}
}
impl SobolType for i16 {
type IT = u16;
fn render(val: u16) -> i16 {
(val ^ 0x8000) as i16
}
}
impl SobolType for i32 {
type IT = u32;
fn render(val: u32) -> i32 {
(val ^ 0x8000_0000) as i32
}
}
impl SobolType for i64 {
type IT = u64;
fn render(val: u64) -> i64 {
(val ^ 0x8000_0000_0000_0000) as i64
}
}
impl SobolType for i128 {
type IT = u128;
fn render(val: u128) -> i128 {
(val ^ 0x8000_0000_0000_0000_0000_0000_0000_0000) as i128
}
}
impl InternalType for u8 {
const BITS: usize = 8;
}
impl InternalType for u16 {
const BITS: usize = 16;
}
impl InternalType for u32 {
const BITS: usize = 32;
}
impl InternalType for u64 {
const BITS: usize = 64;
}
impl InternalType for u128 {
const BITS: usize = 128;
}
impl<T> LossyFrom<T> for T {
fn lossy_from(val: T) -> T {
val
}
}
impl LossyFrom<u16> for u8 {
fn lossy_from(val: u16) -> u8 {
val as u8
}
}
impl LossyFrom<u16> for u32 {
fn lossy_from(val: u16) -> u32 {
u32::from(val)
}
}
impl LossyFrom<u16> for u64 {
fn lossy_from(val: u16) -> u64 {
u64::from(val)
}
}
impl LossyFrom<u16> for u128 {
fn lossy_from(val: u16) -> u128 {
u128::from(val)
}
}
impl LossyFrom<u32> for u8 {
fn lossy_from(val: u32) -> u8 {
val as u8
}
}
impl LossyFrom<u32> for u16 {
fn lossy_from(val: u32) -> u16 {
val as u16
}
}
impl LossyFrom<u32> for u64 {
fn lossy_from(val: u32) -> u64 {
u64::from(val)
}
}
impl LossyFrom<u32> for u128 {
fn lossy_from(val: u32) -> u128 {
u128::from(val)
}
}
impl LossyFrom<u64> for u8 {
fn lossy_from(val: u64) -> u8 {
val as u8
}
}
impl LossyFrom<u64> for u16 {
fn lossy_from(val: u64) -> u16 {
val as u16
}
}
impl LossyFrom<u64> for u32 {
fn lossy_from(val: u64) -> u32 {
val as u32
}
}
impl LossyFrom<u64> for u128 {
fn lossy_from(val: u64) -> u128 {
u128::from(val)
}
}
impl LossyFrom<u128> for u8 {
fn lossy_from(val: u128) -> u8 {
val as u8
}
}
impl LossyFrom<u128> for u16 {
fn lossy_from(val: u128) -> u16 {
val as u16
}
}
impl LossyFrom<u128> for u32 {
fn lossy_from(val: u128) -> u32 {
val as u32
}
}
impl LossyFrom<u128> for u64 {
fn lossy_from(val: u128) -> u64 {
val as u64
}
}