use ffi;
use enums;
pub struct LevinUWorkspace {
w: *mut ffi::gsl_sum_levin_u_workspace
}
impl LevinUWorkspace {
pub fn new(n: u64) -> Option<LevinUWorkspace> {
let tmp = unsafe { ffi::gsl_sum_levin_u_alloc(n) };
if tmp.is_null() {
None
} else {
Some(LevinUWorkspace {
w: tmp
})
}
}
pub fn accel(&self, array: &[f64], sum_accel: &mut f64, abserr: &mut f64) -> enums::value::Value {
unsafe { ffi::gsl_sum_levin_u_accel(array.as_ptr(), array.len() as u64, self.w, sum_accel, abserr) }
}
pub fn sum_plain(&self) -> f64 {
unsafe { (*self.w).sum_plain }
}
pub fn terms_used(&self) -> u64 {
unsafe { (*self.w).terms_used }
}
pub fn size(&self) -> u64 {
unsafe { (*self.w).size }
}
}
impl Drop for LevinUWorkspace {
fn drop(&mut self) {
unsafe { ffi::gsl_sum_levin_u_free(self.w) };
self.w = ::std::ptr::null_mut();
}
}
impl ffi::FFI<ffi::gsl_sum_levin_u_workspace> for LevinUWorkspace {
fn wrap(w: *mut ffi::gsl_sum_levin_u_workspace) -> LevinUWorkspace {
LevinUWorkspace {
w: w
}
}
fn unwrap(w: &LevinUWorkspace) -> *mut ffi::gsl_sum_levin_u_workspace {
w.w
}
}
pub struct LevinUTruncWorkspace {
w: *mut ffi::gsl_sum_levin_utrunc_workspace
}
impl LevinUTruncWorkspace {
pub fn new(n: u64) -> Option<LevinUTruncWorkspace> {
let tmp = unsafe { ffi::gsl_sum_levin_utrunc_alloc(n) };
if tmp.is_null() {
None
} else {
Some(LevinUTruncWorkspace {
w: tmp
})
}
}
pub fn accel(&self, array: &[f64], sum_accel: &mut f64, abserr_trunc: &mut f64) -> enums::value::Value {
unsafe { ffi::gsl_sum_levin_utrunc_accel(array.as_ptr(), array.len() as u64, self.w, sum_accel, abserr_trunc) }
}
pub fn sum_plain(&self) -> f64 {
unsafe { (*self.w).sum_plain }
}
pub fn terms_used(&self) -> u64 {
unsafe { (*self.w).terms_used }
}
pub fn size(&self) -> u64 {
unsafe { (*self.w).size }
}
}
impl Drop for LevinUTruncWorkspace {
fn drop(&mut self) {
unsafe { ffi::gsl_sum_levin_utrunc_free(self.w) };
self.w = ::std::ptr::null_mut();
}
}
impl ffi::FFI<ffi::gsl_sum_levin_utrunc_workspace> for LevinUTruncWorkspace {
fn wrap(w: *mut ffi::gsl_sum_levin_utrunc_workspace) -> LevinUTruncWorkspace {
LevinUTruncWorkspace {
w: w
}
}
fn unwrap(w: &LevinUTruncWorkspace) -> *mut ffi::gsl_sum_levin_utrunc_workspace {
w.w
}
}