use types::{VectorF64, MatrixF64};
use ffi;
use enums;
pub struct BSpLineWorkspace {
w: *mut ffi::gsl_bspline_workspace
}
impl BSpLineWorkspace {
pub fn new(k: u64, nbreak: u64) -> Option<BSpLineWorkspace> {
let tmp = unsafe { ffi::gsl_bspline_alloc(k, nbreak) };
if tmp.is_null() {
None
} else {
Some(BSpLineWorkspace {
w: tmp
})
}
}
pub fn knots(&self, breakpts: &VectorF64) -> enums::value::Value {
unsafe { ffi::gsl_bspline_knots(ffi::FFI::unwrap(breakpts), self.w) }
}
pub fn knots_uniform(&self, a: f64, b: f64) -> enums::value::Value {
unsafe { ffi::gsl_bspline_knots_uniform(a, b, self.w) }
}
pub fn eval(&self, x: f64, B: &VectorF64) -> enums::value::Value {
unsafe { ffi::gsl_bspline_eval(x, ffi::FFI::unwrap(B), self.w) }
}
pub fn eval_non_zero(&self, x: f64, Bk: &VectorF64, istart: &mut u64, iend: &mut u64) -> enums::value::Value {
unsafe { ffi::gsl_bspline_eval_nonzero(x, ffi::FFI::unwrap(Bk), istart, iend, self.w) }
}
pub fn ncoeffs(&self) -> u64 {
unsafe { ffi::gsl_bspline_ncoeffs(self.w) }
}
pub fn greville_abscissa(&self, i: u64) -> f64 {
unsafe { ffi::gsl_bspline_greville_abscissa(i, self.w) }
}
}
impl Drop for BSpLineWorkspace {
fn drop(&mut self) {
unsafe { ffi::gsl_bspline_free(self.w) };
self.w = ::std::ptr::null_mut();
}
}
impl ffi::FFI<ffi::gsl_bspline_workspace> for BSpLineWorkspace {
fn wrap(r: *mut ffi::gsl_bspline_workspace) -> BSpLineWorkspace {
BSpLineWorkspace {
w: r
}
}
fn unwrap(bsp: &BSpLineWorkspace) -> *mut ffi::gsl_bspline_workspace {
bsp.w
}
}
pub struct BSpLineDerivWorkspace {
w: *mut ffi::gsl_bspline_deriv_workspace
}
impl BSpLineDerivWorkspace {
pub fn new(k: u64) -> Option<BSpLineDerivWorkspace> {
let tmp = unsafe { ffi::gsl_bspline_deriv_alloc(k) };
if tmp.is_null() {
None
} else {
Some(BSpLineDerivWorkspace {
w: tmp
})
}
}
pub fn eval(&self, x: f64, nderiv: u64, dB: &MatrixF64, w: &BSpLineWorkspace) -> enums::value::Value {
unsafe { ffi::gsl_bspline_deriv_eval(x, nderiv, ffi::FFI::unwrap(dB), ffi::FFI::unwrap(w), self.w) }
}
pub fn eval_non_zero(&self, x: f64, nderiv: u64, dB: &MatrixF64, istart: &mut u64, iend: &mut u64, w: &BSpLineWorkspace) -> enums::value::Value {
unsafe { ffi::gsl_bspline_deriv_eval_nonzero(x, nderiv, ffi::FFI::unwrap(dB), istart, iend, ffi::FFI::unwrap(w), self.w) }
}
}
impl Drop for BSpLineDerivWorkspace {
fn drop(&mut self) {
unsafe { ffi::gsl_bspline_deriv_free(self.w) };
self.w = ::std::ptr::null_mut();
}
}
impl ffi::FFI<ffi::gsl_bspline_deriv_workspace> for BSpLineDerivWorkspace {
fn wrap(r: *mut ffi::gsl_bspline_deriv_workspace) -> BSpLineDerivWorkspace {
BSpLineDerivWorkspace {
w: r
}
}
fn unwrap(bsp: &BSpLineDerivWorkspace) -> *mut ffi::gsl_bspline_deriv_workspace {
bsp.w
}
}