parent
bd11a53947
commit
c054ac0174
@ -0,0 +1,142 @@
|
||||
//! Contains the RNGs used
|
||||
use super::*;
|
||||
use std::{ptr, slice, mem::{self, MaybeUninit}};
|
||||
use std::ops::Drop;
|
||||
|
||||
/// A tuple packed into a type that can be used for SeedableRng::SEED.
|
||||
#[derive(Debug)]
|
||||
pub struct PackedTupleSeed<T>([MaybeUninit<T>; 2]);
|
||||
|
||||
impl<T: Eq> Eq for PackedTupleSeed<T>{}
|
||||
impl<T: PartialEq> PartialEq for PackedTupleSeed<T>
|
||||
{
|
||||
fn eq(&self, other: &Self) -> bool
|
||||
{
|
||||
self.first() == other.first() &&
|
||||
self.second() == other.second()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> PackedTupleSeed<T>
|
||||
{
|
||||
pub const SIZE_BYTES: usize = mem::size_of::<T>() * 2;
|
||||
pub fn as_mut_array(&mut self) -> &mut [T; 2]
|
||||
{
|
||||
unsafe {&mut *(&mut self.0 as *mut [_; 2] as *mut [T; 2])}
|
||||
}
|
||||
pub fn as_array(&self) -> &[T; 2]
|
||||
{
|
||||
unsafe {& *(&self.0 as *const [_; 2] as *const [T; 2])}
|
||||
}
|
||||
pub fn second_mut(&mut self) -> &mut T
|
||||
{
|
||||
unsafe {&mut *self.0[1].as_mut_ptr()}
|
||||
}
|
||||
pub fn first_mut(&mut self) -> &mut T
|
||||
{
|
||||
unsafe {&mut *self.0[0].as_mut_ptr()}
|
||||
}
|
||||
pub fn second(&self) -> &T
|
||||
{
|
||||
unsafe {& *self.0[1].as_ptr()}
|
||||
}
|
||||
pub fn first(&self) -> &T
|
||||
{
|
||||
unsafe {& *self.0[0].as_ptr()}
|
||||
}
|
||||
|
||||
#[inline] pub fn new(a: T, b: T) -> Self {
|
||||
Self ([
|
||||
MaybeUninit::new(a),
|
||||
MaybeUninit::new(b),
|
||||
])
|
||||
}
|
||||
|
||||
#[inline] pub fn into_tuple(self) -> (T, T)
|
||||
{
|
||||
let ab = unsafe {
|
||||
(self.0[0].as_ptr().read(),
|
||||
self.0[1].as_ptr().read())
|
||||
};
|
||||
mem::forget(self);
|
||||
ab
|
||||
}
|
||||
|
||||
#[inline] pub fn into_second(self) -> T
|
||||
{
|
||||
self.into_tuple().1
|
||||
}
|
||||
#[inline] pub fn into_first(self) -> T
|
||||
{
|
||||
self.into_tuple().0
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> From<(T, T)> for PackedTupleSeed<T>
|
||||
{
|
||||
fn from((a,b): (T, T)) -> Self
|
||||
{
|
||||
Self::new(a, b)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> From<PackedTupleSeed<T>> for (T, T)
|
||||
{
|
||||
fn from(from: PackedTupleSeed<T>) -> Self
|
||||
{
|
||||
from.into_tuple()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Clone> Clone for PackedTupleSeed<T>
|
||||
{
|
||||
fn clone(&self) -> Self {
|
||||
Self([
|
||||
MaybeUninit::new(self.first().clone()),
|
||||
MaybeUninit::new(self.second().clone()),
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Default> Default for PackedTupleSeed<T>
|
||||
{
|
||||
#[inline]
|
||||
fn default() -> Self
|
||||
{
|
||||
Self([
|
||||
MaybeUninit::new(Default::default()),
|
||||
MaybeUninit::new(Default::default()),
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> AsMut<[u8]> for PackedTupleSeed<T>
|
||||
{
|
||||
fn as_mut(&mut self) -> &mut [u8]
|
||||
{
|
||||
unsafe {
|
||||
slice::from_raw_parts_mut(self as *mut Self as *mut u8, mem::size_of::<Self>())
|
||||
}
|
||||
}
|
||||
}
|
||||
impl<T> AsRef<[u8]> for PackedTupleSeed<T>
|
||||
{
|
||||
fn as_ref(&self) -> &[u8]
|
||||
{
|
||||
unsafe {
|
||||
slice::from_raw_parts(self as *const Self as *const u8, mem::size_of::<Self>())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Drop for PackedTupleSeed<T>
|
||||
{
|
||||
fn drop(&mut self) {
|
||||
if mem::needs_drop::<T>() {
|
||||
unsafe {
|
||||
ptr::drop_in_place(self.0[0].as_mut_ptr());
|
||||
ptr::drop_in_place(self.0[1].as_mut_ptr());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue