use std::mem::zeroed;
use enums;
pub trait Trigonometric {
fn sin(&self) -> Self;
fn sin_e(&self) -> (enums::Value, ::types::Result);
fn cos(&self) -> Self;
fn cos_e(&self) -> (enums::Value, ::types::Result);
fn sf_hypot(&self) -> Self;
fn sf_hypot_e(&self) -> (enums::Value, ::types::Result);
fn sinc(&self) -> Self;
fn sinc_e(&self) -> (enums::Value, ::types::Result);
fn complex_sin_e(&self, zi: f64) -> (enums::Value, ::types::Result, ::types::Result);
fn complex_cos_e(&self, zi: f64) -> (enums::Value, ::types::Result, ::types::Result);
fn complex_logsin_e(&self, zi: f64) -> (enums::Value, ::types::Result, ::types::Result);
fn lnsinh(&self) -> Self;
fn lnsinh_e(&self) -> (enums::Value, ::types::Result);
fn lncosh(&self) -> Self;
fn lncosh_e(&self) -> (enums::Value, ::types::Result);
fn polar_to_rect(&self, theta: f64) -> (enums::Value, ::types::Result, ::types::Result);
fn rect_to_polar(&self, y: f64) -> (enums::Value, ::types::Result, ::types::Result);
fn angle_restrict_symm(&self) -> Self;
fn angle_restrict_symm_e(&mut self) -> enums::Value;
fn angle_restrict_pos(&self) -> Self;
fn angle_restrict_pos_e(&mut self) -> enums::Value;
fn sin_err_e(&self, dx: f64) -> (enums::Value, ::types::Result);
fn cos_err_e(&self, dx: f64) -> (enums::Value, ::types::Result);
}
impl Trigonometric for f64 {
fn sin(&self) -> f64 {
unsafe { ::ffi::gsl_sf_sin(*self) }
}
fn sin_e(&self) -> (enums::Value, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_sin_e(*self, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
fn cos(&self) -> f64 {
unsafe { ::ffi::gsl_sf_cos(*self) }
}
fn cos_e(&self) -> (enums::Value, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_cos_e(*self, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
fn sf_hypot(&self) -> f64 {
unsafe { ::ffi::gsl_sf_hypot(*self) }
}
fn sf_hypot_e(&self) -> (enums::Value, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_hypot_e(*self, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
fn sinc(&self) -> f64 {
unsafe { ::ffi::gsl_sf_sinc(*self) }
}
fn sinc_e(&self) -> (enums::Value, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_sinc_e(*self, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
fn complex_sin_e(&self, zi: f64) -> (enums::Value, ::types::Result, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let mut result2 = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_complex_sin_e(*self, zi, &mut result, &mut result2) };
(ret, ::types::Result{val: result.val, err: result.err}, ::types::Result{val: result2.val, err: result2.err})
}
fn complex_cos_e(&self, zi: f64) -> (enums::Value, ::types::Result, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let mut result2 = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_complex_cos_e(*self, zi, &mut result, &mut result2) };
(ret, ::types::Result{val: result.val, err: result.err}, ::types::Result{val: result2.val, err: result2.err})
}
fn complex_logsin_e(&self, zi: f64) -> (enums::Value, ::types::Result, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let mut result2 = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_complex_logsin_e(*self, zi, &mut result, &mut result2) };
(ret, ::types::Result{val: result.val, err: result.err}, ::types::Result{val: result2.val, err: result2.err})
}
fn lnsinh(&self) -> f64 {
unsafe { ::ffi::gsl_sf_lnsinh(*self) }
}
fn lnsinh_e(&self) -> (enums::Value, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_lnsinh_e(*self, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
fn lncosh(&self) -> f64 {
unsafe { ::ffi::gsl_sf_lncosh(*self) }
}
fn lncosh_e(&self) -> (enums::Value, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_lncosh_e(*self, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
fn polar_to_rect(&self, theta: f64) -> (enums::Value, ::types::Result, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let mut result2 = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_polar_to_rect(*self, theta, &mut result, &mut result2) };
(ret, ::types::Result{val: result.val, err: result.err}, ::types::Result{val: result2.val, err: result2.err})
}
fn rect_to_polar(&self, y: f64) -> (enums::Value, ::types::Result, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let mut result2 = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_rect_to_polar(*self, y, &mut result, &mut result2) };
(ret, ::types::Result{val: result.val, err: result.err}, ::types::Result{val: result2.val, err: result2.err})
}
fn angle_restrict_symm(&self) -> f64 {
unsafe { ::ffi::gsl_sf_angle_restrict_symm(*self) }
}
fn angle_restrict_symm_e(&mut self) -> enums::Value {
unsafe { ::ffi::gsl_sf_angle_restrict_symm_e(self) }
}
fn angle_restrict_pos(&self) -> f64 {
unsafe { ::ffi::gsl_sf_angle_restrict_pos(*self) }
}
fn angle_restrict_pos_e(&mut self) -> enums::Value {
unsafe { ::ffi::gsl_sf_angle_restrict_pos_e(self) }
}
fn sin_err_e(&self, dx: f64) -> (enums::Value, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_sin_err_e(*self, dx, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
fn cos_err_e(&self, dx: f64) -> (enums::Value, ::types::Result) {
let mut result = unsafe { zeroed::<::ffi::gsl_sf_result>() };
let ret = unsafe { ::ffi::gsl_sf_cos_err_e(*self, dx, &mut result) };
(ret, ::types::Result{val: result.val, err: result.err})
}
}