use ffi;
use enums;
use c_vec::CSlice;
pub struct QRng {
q: *mut ffi::gsl_qrng,
data: CSlice<i8>
}
impl QRng {
pub fn new(t: &QRngType, d: u32) -> Option<QRng> {
let tmp = unsafe { ffi::gsl_qrng_alloc(t.t, d) };
if tmp.is_null() {
None
} else {
Some(QRng {
q: tmp,
data: unsafe { CSlice::new(tmp as *mut i8, 0) }
})
}
}
pub fn init(&self) {
unsafe { ffi::gsl_qrng_init(self.q) }
}
pub fn get(&self, x: &mut [f64]) -> enums::value::Value {
unsafe { ffi::gsl_qrng_get(self.q, x.as_mut_ptr()) }
}
pub fn name(&self) -> Option<String> {
let tmp = unsafe { ffi::gsl_qrng_name(self.q) };
if tmp.is_null() {
None
} else {
unsafe { Some(String::from_utf8_lossy(::std::ffi::CStr::from_ptr(tmp).to_bytes()).to_string()) }
}
}
pub fn size(&self) -> u64 {
unsafe { ffi::gsl_qrng_size(self.q) }
}
pub fn state<'r>(&'r mut self) -> &'r mut [i8] {
let tmp = unsafe { ffi::gsl_qrng_state(self.q) };
if !tmp.is_null() {
self.data = unsafe { CSlice::new(tmp as *mut i8, self.size() as usize) };
}
self.data.as_mut()
}
pub fn copy(&self, dest: &QRng) -> enums::value::Value {
unsafe { ffi::gsl_qrng_memcpy(dest.q, self.q) }
}
}
impl Clone for QRng {
fn clone(&self) -> QRng {
unsafe { ffi::FFI::wrap(ffi::gsl_qrng_clone(self.q)) }
}
}
impl Drop for QRng {
fn drop(&mut self) {
unsafe { ffi::gsl_qrng_free(self.q) };
self.q = ::std::ptr::null_mut();
}
}
impl ffi::FFI<ffi::gsl_qrng> for QRng {
fn wrap(q: *mut ffi::gsl_qrng) -> QRng {
QRng {
q: q,
data: unsafe { CSlice::new(q as *mut i8, 0) }
}
}
fn unwrap(q: &QRng) -> *mut ffi::gsl_qrng {
q.q
}
}
#[derive(Clone, Copy)]
pub struct QRngType {
t: *const ffi::gsl_qrng_type
}
impl QRngType {
pub fn niederreiter_2() -> QRngType {
QRngType {
t: ffi::gsl_qrng_niederreiter_2
}
}
pub fn sobol() -> QRngType {
QRngType {
t: ffi::gsl_qrng_sobol
}
}
pub fn halton() -> QRngType {
QRngType {
t: ffi::gsl_qrng_halton
}
}
pub fn reversehalton() -> QRngType {
QRngType {
t: ffi::gsl_qrng_reversehalton
}
}
}
impl ffi::FFI<ffi::gsl_qrng_type> for QRngType {
fn wrap(t: *mut ffi::gsl_qrng_type) -> QRngType {
QRngType {
t: t
}
}
fn unwrap(t: &QRngType) -> *mut ffi::gsl_qrng_type {
t.t as *mut ffi::gsl_qrng_type
}
}