#![feature(asm,globs)]
use std::rand::Rng;
use std::result::Result;
mod util;
struct PrivateInner;
#[deriving(Copy)]
#[stable]
pub enum Error {
UnsupportedProcessor
}
pub struct RdRand(PrivateInner);
impl RdRand {
pub fn new() -> Result<RdRand, Error> {
if util::is_intel() && util::has_rdrand() {
return Ok(RdRand(PrivateInner));
} else {
return Err(Error::UnsupportedProcessor);
}
}
#[inline]
fn gen_value<T>(&self) -> T {
let mut var;
unsafe {
asm!("1: rdrand $0; jnc 1b;" : "=r"(var));
}
var
}
pub fn next_u16(&self) -> u16 {
self.gen_value()
}
}
impl Rng for RdRand {
fn next_u32(&mut self) -> u32 {
self.gen_value()
}
fn next_u64(&mut self) -> u64 {
self.gen_value()
}
}
#[experimental="The implementation has not been tested due to the lack of hardware supporting \
the feature"]
pub struct RdSeed(PrivateInner);
impl RdSeed {
#[experimental]
pub fn new() -> Result<RdSeed, Error> {
if util::is_intel() && util::has_rdseed() {
return Ok(RdSeed(PrivateInner));
} else {
return Err(Error::UnsupportedProcessor);
}
}
#[inline]
fn gen_value<T>(&self) -> T {
let mut var;
unsafe {
asm!("1: rdseed $0; jnc 1b;" : "=r"(var));
}
var
}
pub fn next_u16(&self) -> u16 {
self.gen_value()
}
}
impl Rng for RdSeed {
fn next_u32(&mut self) -> u32 {
self.gen_value()
}
fn next_u64(&mut self) -> u64 {
self.gen_value()
}
}