#[cfg(not(feature = "v2"))]
use types::{VectorF64, MatrixF64};
#[cfg(feature = "v2")]
use types::VectorF64;
use ffi;
use enums;
pub struct BSpLineWorkspace {
w: *mut ffi::gsl_bspline_workspace
}
impl BSpLineWorkspace {
pub fn new(k: usize, nbreak: usize) -> Option<BSpLineWorkspace> {
let tmp = unsafe { ffi::gsl_bspline_alloc(k, nbreak) };
if tmp.is_null() {
None
} else {
Some(BSpLineWorkspace {
w: tmp
})
}
}
pub fn knots(&mut self, breakpts: &VectorF64) -> enums::Value {
enums::Value::from(unsafe { ffi::gsl_bspline_knots(ffi::FFI::unwrap_shared(breakpts), self.w) })
}
pub fn knots_uniform(&mut self, a: f64, b: f64) -> enums::Value {
enums::Value::from(unsafe { ffi::gsl_bspline_knots_uniform(a, b, self.w) })
}
pub fn eval(&mut self, x: f64, B: &mut VectorF64) -> enums::Value {
enums::Value::from(unsafe { ffi::gsl_bspline_eval(x, ffi::FFI::unwrap_unique(B), self.w) })
}
pub fn eval_non_zero(&mut self, x: f64, Bk: &mut VectorF64, istart: &mut usize,
iend: &mut usize) -> enums::Value {
enums::Value::from(unsafe { ffi::gsl_bspline_eval_nonzero(x, ffi::FFI::unwrap_unique(Bk), istart, iend, self.w) })
}
pub fn ncoeffs(&mut self) -> usize {
unsafe { ffi::gsl_bspline_ncoeffs(self.w) }
}
pub fn greville_abscissa(&mut self, i: usize) -> 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 soft_wrap(r: *mut ffi::gsl_bspline_workspace) -> BSpLineWorkspace {
Self::wrap(r)
}
fn unwrap_shared(bsp: &BSpLineWorkspace) -> *const ffi::gsl_bspline_workspace {
bsp.w as *const _
}
fn unwrap_unique(bsp: &mut BSpLineWorkspace) -> *mut ffi::gsl_bspline_workspace {
bsp.w
}
}
#[cfg(not(feature = "v2"))]
pub struct BSpLineDerivWorkspace {
w: *mut ffi::gsl_bspline_deriv_workspace
}
#[cfg(not(feature = "v2"))]
impl BSpLineDerivWorkspace {
pub fn new(k: usize) -> Option<BSpLineDerivWorkspace> {
let tmp = unsafe { ffi::gsl_bspline_deriv_alloc(k) };
if tmp.is_null() {
None
} else {
Some(BSpLineDerivWorkspace {
w: tmp
})
}
}
pub fn eval(&mut self, x: f64, nderiv: usize, dB: &mut MatrixF64,
w: &mut BSpLineWorkspace) -> enums::Value {
enums::Value::from(unsafe {
ffi::gsl_bspline_deriv_eval(x, nderiv, ffi::FFI::unwrap_unique(dB),
ffi::FFI::unwrap_unique(w), self.w) })
}
pub fn eval_non_zero(&mut self, x: f64, nderiv: usize, dB: &mut MatrixF64, istart: &mut usize,
iend: &mut usize, w: &mut BSpLineWorkspace) -> enums::Value {
enums::Value::from(unsafe {
ffi::gsl_bspline_deriv_eval_nonzero(x, nderiv, ffi::FFI::unwrap_unique(dB), istart,
iend, ffi::FFI::unwrap_unique(w), self.w) })
}
}
#[cfg(not(feature = "v2"))]
impl Drop for BSpLineDerivWorkspace {
fn drop(&mut self) {
unsafe { ffi::gsl_bspline_deriv_free(self.w) };
self.w = ::std::ptr::null_mut();
}
}
#[cfg(not(feature = "v2"))]
impl ffi::FFI<ffi::gsl_bspline_deriv_workspace> for BSpLineDerivWorkspace {
fn wrap(r: *mut ffi::gsl_bspline_deriv_workspace) -> BSpLineDerivWorkspace {
BSpLineDerivWorkspace {
w: r
}
}
fn soft_wrap(r: *mut ffi::gsl_bspline_deriv_workspace) -> BSpLineDerivWorkspace {
Self::wrap(r)
}
fn unwrap_shared(bsp: &BSpLineDerivWorkspace) -> *const ffi::gsl_bspline_deriv_workspace {
bsp.w as *const _
}
fn unwrap_unique(bsp: &mut BSpLineDerivWorkspace) -> *mut ffi::gsl_bspline_deriv_workspace {
bsp.w
}
}