rgsl/
enums.rs

1//
2// A rust binding for the GSL library by Guillaume Gomez (guillaume1.gomez@gmail.com)
3//
4
5use std::os::raw::c_int;
6
7#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
8pub enum Mode {
9    PrecDouble,
10    PrecSingle,
11    PrecApprox,
12}
13
14#[allow(clippy::from_over_into)]
15impl Into<sys::gsl_mode_t> for Mode {
16    fn into(self) -> sys::gsl_mode_t {
17        match self {
18            Mode::PrecDouble => sys::GSL_PREC_DOUBLE,
19            Mode::PrecSingle => sys::GSL_PREC_SINGLE,
20            Mode::PrecApprox => sys::GSL_PREC_APPROX,
21        }
22    }
23}
24
25#[doc(hidden)]
26impl From<sys::gsl_mode_t> for Mode {
27    fn from(v: sys::gsl_mode_t) -> Mode {
28        match v {
29            sys::GSL_PREC_DOUBLE => Mode::PrecDouble,
30            sys::GSL_PREC_SINGLE => Mode::PrecSingle,
31            sys::GSL_PREC_APPROX => Mode::PrecApprox,
32            _ => panic!("Unknown Mode value"),
33        }
34    }
35}
36
37#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
38pub enum Value {
39    Success,
40    Failure,
41    /// iteration has not converged
42    Continue,
43    /// input domain error, e.g sqrt(-1)
44    Domain,
45    /// output range error, e.g. exp(1e100)
46    Range,
47    /// invalid pointer
48    Fault,
49    /// invalid argument supplied by user
50    Invalid,
51    /// generic failure
52    Failed,
53    /// factorization failed
54    Factorization,
55    /// sanity check failed - shouldn't happen
56    Sanity,
57    /// malloc failed
58    NoMemory,
59    /// problem with user-supplied function
60    BadFunction,
61    /// iterative process is out of control
62    RunAway,
63    /// exceeded max number of iterations
64    MaxIteration,
65    /// tried to divide by zero
66    ZeroDiv,
67    /// user specified an invalid tolerance
68    BadTolerance,
69    /// failed to reach the specified tolerance
70    Tolerance,
71    /// underflow
72    UnderFlow,
73    /// overflow
74    OverFlow,
75    /// loss of accuracy
76    Loss,
77    /// failed because of roundoff error
78    Round,
79    /// matrix, vector lengths are not conformant
80    BadLength,
81    /// matrix not square
82    NotSquare,
83    /// apparent singularity detected
84    Singularity,
85    /// integral or series is divergent
86    Diverge,
87    /// requested feature is not supported by the hardware
88    Unsupported,
89    /// requested feature not (yet) implemented
90    Unimplemented,
91    /// cache limit exceeded
92    Cache,
93    /// table limit exceeded
94    Table,
95    /// iteration is not making progress towards solution
96    NoProgress,
97    /// jacobian evaluations are not improving the solution
98    NoProgressJacobian,
99    /// cannot reach the specified tolerance in F
100    ToleranceF,
101    /// cannot reach the specified tolerance in X
102    ToleranceX,
103    /// cannot reach the specified tolerance in gradient
104    ToleranceG,
105    /// cannot reach the specified tolerance in gradient
106    #[allow(clippy::upper_case_acronyms)]
107    EOF,
108    /// Unknown value.
109    Unknown(i32),
110}
111
112impl Value {
113    pub fn is_success(self) -> bool {
114        self == Self::Success
115    }
116}
117
118#[doc(hidden)]
119#[allow(clippy::from_over_into)]
120impl Into<c_int> for Value {
121    fn into(self) -> c_int {
122        match self {
123            Self::Success => sys::GSL_SUCCESS,
124            Self::Failure => sys::GSL_FAILURE,
125            Self::Continue => sys::GSL_CONTINUE,
126            Self::Domain => sys::GSL_EDOM,
127            Self::Range => sys::GSL_ERANGE,
128            Self::Fault => sys::GSL_EFAULT,
129            Self::Invalid => sys::GSL_EINVAL,
130            Self::Failed => sys::GSL_EFAILED,
131            Self::Factorization => sys::GSL_EFACTOR,
132            Self::Sanity => sys::GSL_ESANITY,
133            Self::NoMemory => sys::GSL_ENOMEM,
134            Self::BadFunction => sys::GSL_EBADFUNC,
135            Self::RunAway => sys::GSL_ERUNAWAY,
136            Self::MaxIteration => sys::GSL_EMAXITER,
137            Self::ZeroDiv => sys::GSL_EZERODIV,
138            Self::BadTolerance => sys::GSL_EBADTOL,
139            Self::Tolerance => sys::GSL_ETOL,
140            Self::UnderFlow => sys::GSL_EUNDRFLW,
141            Self::OverFlow => sys::GSL_EOVRFLW,
142            Self::Loss => sys::GSL_ELOSS,
143            Self::Round => sys::GSL_EROUND,
144            Self::BadLength => sys::GSL_EBADLEN,
145            Self::NotSquare => sys::GSL_ENOTSQR,
146            Self::Singularity => sys::GSL_ESING,
147            Self::Diverge => sys::GSL_EDIVERGE,
148            Self::Unsupported => sys::GSL_EUNSUP,
149            Self::Unimplemented => sys::GSL_EUNIMPL,
150            Self::Cache => sys::GSL_ECACHE,
151            Self::Table => sys::GSL_ETABLE,
152            Self::NoProgress => sys::GSL_ENOPROG,
153            Self::NoProgressJacobian => sys::GSL_ENOPROGJ,
154            Self::ToleranceF => sys::GSL_ETOLF,
155            Self::ToleranceX => sys::GSL_ETOLX,
156            Self::ToleranceG => sys::GSL_ETOLG,
157            Self::EOF => sys::GSL_EOF,
158            Self::Unknown(x) => x,
159        }
160    }
161}
162
163#[doc(hidden)]
164impl From<c_int> for Value {
165    fn from(v: c_int) -> Value {
166        match v {
167            sys::GSL_SUCCESS => Self::Success,
168            sys::GSL_FAILURE => Self::Failure,
169            sys::GSL_CONTINUE => Self::Continue,
170            sys::GSL_EDOM => Self::Domain,
171            sys::GSL_ERANGE => Self::Range,
172            sys::GSL_EFAULT => Self::Fault,
173            sys::GSL_EINVAL => Self::Invalid,
174            sys::GSL_EFAILED => Self::Failed,
175            sys::GSL_EFACTOR => Self::Factorization,
176            sys::GSL_ESANITY => Self::Sanity,
177            sys::GSL_ENOMEM => Self::NoMemory,
178            sys::GSL_EBADFUNC => Self::BadFunction,
179            sys::GSL_ERUNAWAY => Self::RunAway,
180            sys::GSL_EMAXITER => Self::MaxIteration,
181            sys::GSL_EZERODIV => Self::ZeroDiv,
182            sys::GSL_EBADTOL => Self::BadTolerance,
183            sys::GSL_ETOL => Self::Tolerance,
184            sys::GSL_EUNDRFLW => Self::UnderFlow,
185            sys::GSL_EOVRFLW => Self::OverFlow,
186            sys::GSL_ELOSS => Self::Loss,
187            sys::GSL_EROUND => Self::Round,
188            sys::GSL_EBADLEN => Self::BadLength,
189            sys::GSL_ENOTSQR => Self::NotSquare,
190            sys::GSL_ESING => Self::Singularity,
191            sys::GSL_EDIVERGE => Self::Diverge,
192            sys::GSL_EUNSUP => Self::Unsupported,
193            sys::GSL_EUNIMPL => Self::Unimplemented,
194            sys::GSL_ECACHE => Self::Cache,
195            sys::GSL_ETABLE => Self::Table,
196            sys::GSL_ENOPROG => Self::NoProgress,
197            sys::GSL_ENOPROGJ => Self::NoProgressJacobian,
198            sys::GSL_ETOLF => Self::ToleranceF,
199            sys::GSL_ETOLX => Self::ToleranceX,
200            sys::GSL_ETOLG => Self::ToleranceG,
201            sys::GSL_EOF => Self::EOF,
202            x => Self::Unknown(x),
203        }
204    }
205}
206
207#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
208pub enum EigenSort {
209    /// ascending order in numerical value
210    ValAsc,
211    /// descending order in numerical value
212    ValDesc,
213    /// ascending order in magnitude
214    AbsAsc,
215    /// descending order in magnitude
216    AbsDesc,
217}
218
219#[doc(hidden)]
220#[allow(clippy::from_over_into)]
221impl Into<sys::gsl_eigen_sort_t> for EigenSort {
222    fn into(self) -> sys::gsl_eigen_sort_t {
223        match self {
224            Self::ValAsc => sys::gsl_eigen_sort_t_GSL_EIGEN_SORT_VAL_ASC,
225            Self::ValDesc => sys::gsl_eigen_sort_t_GSL_EIGEN_SORT_VAL_DESC,
226            Self::AbsAsc => sys::gsl_eigen_sort_t_GSL_EIGEN_SORT_ABS_ASC,
227            Self::AbsDesc => sys::gsl_eigen_sort_t_GSL_EIGEN_SORT_ABS_DESC,
228        }
229    }
230}
231
232#[doc(hidden)]
233impl From<sys::gsl_eigen_sort_t> for EigenSort {
234    fn from(v: sys::gsl_eigen_sort_t) -> EigenSort {
235        match v {
236            sys::gsl_eigen_sort_t_GSL_EIGEN_SORT_VAL_ASC => Self::ValAsc,
237            sys::gsl_eigen_sort_t_GSL_EIGEN_SORT_VAL_DESC => Self::ValDesc,
238            sys::gsl_eigen_sort_t_GSL_EIGEN_SORT_ABS_ASC => Self::AbsAsc,
239            sys::gsl_eigen_sort_t_GSL_EIGEN_SORT_ABS_DESC => Self::AbsDesc,
240            _ => panic!("Unknown EigenSort value"),
241        }
242    }
243}
244
245/// This gives the sign in the formula:
246///
247/// ```text
248/// h(f) = \sum x(t) exp(+/- 2 pi i f t)
249/// ```
250///
251/// where - is the forward transform direction and + the inverse direction
252#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
253pub enum FftDirection {
254    Forward,
255    Backward,
256}
257
258#[doc(hidden)]
259#[allow(clippy::from_over_into)]
260impl Into<sys::gsl_fft_direction> for FftDirection {
261    fn into(self) -> sys::gsl_fft_direction {
262        match self {
263            Self::Forward => sys::gsl_fft_direction_gsl_fft_forward,
264            Self::Backward => sys::gsl_fft_direction_gsl_fft_backward,
265        }
266    }
267}
268
269#[doc(hidden)]
270impl From<sys::gsl_fft_direction> for FftDirection {
271    fn from(v: sys::gsl_fft_direction) -> FftDirection {
272        match v {
273            sys::gsl_fft_direction_gsl_fft_forward => Self::Forward,
274            sys::gsl_fft_direction_gsl_fft_backward => Self::Backward,
275            _ => panic!("Unknown FftDirection value"),
276        }
277    }
278}
279
280/// The low-level integration rules in QUADPACK are identified by small integers (1-6). We'll use
281/// symbolic constants to refer to them.
282#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
283pub enum GaussKronrodRule {
284    /// 15 point Gauss-Kronrod rule
285    Gauss15,
286    /// 21 point Gauss-Kronrod rule
287    Gauss21,
288    /// 31 point Gauss-Kronrod rule
289    Gauss31,
290    /// 41 point Gauss-Kronrod rule
291    Gauss41,
292    /// 51 point Gauss-Kronrod rule
293    Gauss51,
294    /// 61 point Gauss-Kronrod rule
295    Gauss61,
296}
297
298#[doc(hidden)]
299#[allow(clippy::from_over_into)]
300impl Into<::std::os::raw::c_int> for GaussKronrodRule {
301    fn into(self) -> std::os::raw::c_int {
302        let x = match self {
303            Self::Gauss15 => sys::GSL_INTEG_GAUSS15,
304            Self::Gauss21 => sys::GSL_INTEG_GAUSS21,
305            Self::Gauss31 => sys::GSL_INTEG_GAUSS31,
306            Self::Gauss41 => sys::GSL_INTEG_GAUSS41,
307            Self::Gauss51 => sys::GSL_INTEG_GAUSS51,
308            Self::Gauss61 => sys::GSL_INTEG_GAUSS61,
309        };
310        x as _
311    }
312}
313
314#[doc(hidden)]
315impl From<::std::os::raw::c_int> for GaussKronrodRule {
316    fn from(v: std::os::raw::c_int) -> GaussKronrodRule {
317        match v as _ {
318            sys::GSL_INTEG_GAUSS15 => Self::Gauss15,
319            sys::GSL_INTEG_GAUSS21 => Self::Gauss21,
320            sys::GSL_INTEG_GAUSS31 => Self::Gauss31,
321            sys::GSL_INTEG_GAUSS41 => Self::Gauss41,
322            sys::GSL_INTEG_GAUSS51 => Self::Gauss51,
323            sys::GSL_INTEG_GAUSS61 => Self::Gauss61,
324            _ => panic!("Unknown GaussKronrodRule value"),
325        }
326    }
327}
328
329#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
330/// Used by workspace for QAWO integrator
331pub enum IntegrationQawo {
332    Cosine,
333    Sine,
334}
335
336#[doc(hidden)]
337#[allow(clippy::from_over_into)]
338impl Into<sys::gsl_integration_qawo_enum> for IntegrationQawo {
339    fn into(self) -> sys::gsl_integration_qawo_enum {
340        match self {
341            Self::Cosine => sys::gsl_integration_qawo_enum_GSL_INTEG_COSINE,
342            Self::Sine => sys::gsl_integration_qawo_enum_GSL_INTEG_SINE,
343        }
344    }
345}
346
347#[doc(hidden)]
348impl From<sys::gsl_integration_qawo_enum> for IntegrationQawo {
349    fn from(v: sys::gsl_integration_qawo_enum) -> IntegrationQawo {
350        match v {
351            sys::gsl_integration_qawo_enum_GSL_INTEG_COSINE => Self::Cosine,
352            sys::gsl_integration_qawo_enum_GSL_INTEG_SINE => Self::Sine,
353            _ => panic!("Unknown IntegrationQawo value"),
354        }
355    }
356}
357
358/// Used by VegasMonteCarlo struct
359///
360/// The possible choices are GSL_VEGAS_MODE_IMPORTANCE, GSL_VEGAS_MODE_
361/// STRATIFIED, GSL_VEGAS_MODE_IMPORTANCE_ONLY. This determines whether vegas
362/// will use importance sampling or stratified sampling, or whether it can pick on
363/// its own. In low dimensions vegas uses strict stratified sampling (more precisely,
364/// stratified sampling is chosen if there are fewer than 2 bins per box).
365#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
366pub enum VegasMode {
367    Importance,
368    ImportanceOnly,
369    Stratified,
370}
371
372#[doc(hidden)]
373#[allow(clippy::from_over_into)]
374impl Into<::std::os::raw::c_int> for VegasMode {
375    fn into(self) -> std::os::raw::c_int {
376        match self {
377            Self::Importance => sys::GSL_VEGAS_MODE_IMPORTANCE,
378            Self::ImportanceOnly => sys::GSL_VEGAS_MODE_IMPORTANCE_ONLY,
379            Self::Stratified => sys::GSL_VEGAS_MODE_STRATIFIED,
380        }
381    }
382}
383
384#[doc(hidden)]
385impl From<::std::os::raw::c_int> for VegasMode {
386    fn from(v: std::os::raw::c_int) -> VegasMode {
387        match v {
388            sys::GSL_VEGAS_MODE_IMPORTANCE => Self::Importance,
389            sys::GSL_VEGAS_MODE_IMPORTANCE_ONLY => Self::ImportanceOnly,
390            sys::GSL_VEGAS_MODE_STRATIFIED => Self::Stratified,
391            _ => panic!("Unknown VegasMode value"),
392        }
393    }
394}
395
396/// Possible return values for an hadjust() evolution method for ordinary differential equations
397#[allow(clippy::upper_case_acronyms)]
398#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
399pub enum ODEiv {
400    /// step was increased
401    Inc,
402    /// step unchanged
403    Nil,
404    /// step decreased
405    Dec,
406}
407
408#[doc(hidden)]
409#[allow(clippy::from_over_into)]
410impl Into<c_int> for ODEiv {
411    fn into(self) -> c_int {
412        match self {
413            Self::Inc => sys::GSL_ODEIV_HADJ_INC,
414            Self::Nil => sys::GSL_ODEIV_HADJ_NIL,
415            Self::Dec => sys::GSL_ODEIV_HADJ_DEC,
416        }
417    }
418}
419
420#[doc(hidden)]
421impl From<c_int> for ODEiv {
422    fn from(v: c_int) -> ODEiv {
423        match v {
424            sys::GSL_ODEIV_HADJ_INC => Self::Inc,
425            sys::GSL_ODEIV_HADJ_NIL => Self::Nil,
426            sys::GSL_ODEIV_HADJ_DEC => Self::Dec,
427            _ => panic!("Unknown ODEiv value"),
428        }
429    }
430}
431
432#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
433pub enum WaveletDirection {
434    Forward,
435    Backward,
436}
437
438#[doc(hidden)]
439#[allow(clippy::from_over_into)]
440impl Into<sys::gsl_wavelet_direction> for WaveletDirection {
441    fn into(self) -> sys::gsl_wavelet_direction {
442        match self {
443            Self::Forward => sys::gsl_wavelet_direction_gsl_wavelet_forward,
444            Self::Backward => sys::gsl_wavelet_direction_gsl_wavelet_backward,
445        }
446    }
447}
448
449#[doc(hidden)]
450impl From<sys::gsl_wavelet_direction> for WaveletDirection {
451    fn from(v: sys::gsl_wavelet_direction) -> WaveletDirection {
452        match v {
453            sys::gsl_wavelet_direction_gsl_wavelet_forward => Self::Forward,
454            sys::gsl_wavelet_direction_gsl_wavelet_backward => Self::Backward,
455            _ => panic!("Unknown WaveletDirection value"),
456        }
457    }
458}
459
460#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
461pub enum SfLegendreNorm {
462    Schmidt,
463    SphericalHarmonic,
464    Full,
465    None,
466}
467
468#[doc(hidden)]
469#[allow(clippy::from_over_into)]
470impl Into<sys::gsl_sf_legendre_t> for SfLegendreNorm {
471    fn into(self) -> sys::gsl_sf_legendre_t {
472        match self {
473            SfLegendreNorm::Schmidt => sys::gsl_sf_legendre_t_GSL_SF_LEGENDRE_SCHMIDT,
474            SfLegendreNorm::SphericalHarmonic => sys::gsl_sf_legendre_t_GSL_SF_LEGENDRE_SPHARM,
475            SfLegendreNorm::Full => sys::gsl_sf_legendre_t_GSL_SF_LEGENDRE_FULL,
476            SfLegendreNorm::None => sys::gsl_sf_legendre_t_GSL_SF_LEGENDRE_NONE,
477        }
478    }
479}
480
481#[doc(hidden)]
482impl From<sys::gsl_sf_legendre_t> for SfLegendreNorm {
483    fn from(v: sys::gsl_sf_legendre_t) -> SfLegendreNorm {
484        match v {
485            sys::gsl_sf_legendre_t_GSL_SF_LEGENDRE_SCHMIDT => SfLegendreNorm::Schmidt,
486            sys::gsl_sf_legendre_t_GSL_SF_LEGENDRE_SPHARM => SfLegendreNorm::SphericalHarmonic,
487            sys::gsl_sf_legendre_t_GSL_SF_LEGENDRE_FULL => SfLegendreNorm::Full,
488            sys::gsl_sf_legendre_t_GSL_SF_LEGENDRE_NONE => SfLegendreNorm::None,
489            _ => panic!("Unknown SfLegendreNorm value"),
490        }
491    }
492}
493
494#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
495pub enum CblasTranspose {
496    NoTranspose,
497    Transpose,
498    ConjugateTranspose,
499}
500
501#[doc(hidden)]
502#[allow(clippy::from_over_into)]
503impl Into<sys::CBLAS_TRANSPOSE> for CblasTranspose {
504    fn into(self) -> sys::CBLAS_TRANSPOSE {
505        match self {
506            Self::NoTranspose => sys::CBLAS_TRANSPOSE_CblasNoTrans,
507            Self::Transpose => sys::CBLAS_TRANSPOSE_CblasTrans,
508            Self::ConjugateTranspose => sys::CBLAS_TRANSPOSE_CblasConjTrans,
509        }
510    }
511}
512
513#[doc(hidden)]
514impl From<sys::CBLAS_TRANSPOSE> for CblasTranspose {
515    fn from(v: sys::CBLAS_TRANSPOSE) -> CblasTranspose {
516        match v {
517            sys::CBLAS_TRANSPOSE_CblasNoTrans => Self::NoTranspose,
518            sys::CBLAS_TRANSPOSE_CblasTrans => Self::Transpose,
519            sys::CBLAS_TRANSPOSE_CblasConjTrans => Self::ConjugateTranspose,
520            _ => panic!("Unknown CblasTranspose value"),
521        }
522    }
523}
524
525#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
526pub enum CblasUplo {
527    Upper,
528    Lower,
529}
530
531#[doc(hidden)]
532#[allow(clippy::from_over_into)]
533impl Into<sys::CBLAS_UPLO> for CblasUplo {
534    fn into(self) -> sys::CBLAS_UPLO {
535        match self {
536            Self::Upper => sys::CBLAS_UPLO_CblasUpper,
537            Self::Lower => sys::CBLAS_UPLO_CblasLower,
538        }
539    }
540}
541
542#[doc(hidden)]
543impl From<sys::CBLAS_UPLO> for CblasUplo {
544    fn from(v: sys::CBLAS_UPLO) -> CblasUplo {
545        match v {
546            sys::CBLAS_UPLO_CblasUpper => Self::Upper,
547            sys::CBLAS_UPLO_CblasLower => Self::Lower,
548            _ => panic!("Unknown CblasUplo value"),
549        }
550    }
551}
552
553#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
554pub enum CblasOrder {
555    RowMajor,
556    ColumnMajor,
557}
558
559#[doc(hidden)]
560#[allow(clippy::from_over_into)]
561impl Into<sys::CBLAS_ORDER> for CblasOrder {
562    fn into(self) -> sys::CBLAS_ORDER {
563        match self {
564            Self::RowMajor => sys::CBLAS_ORDER_CblasRowMajor,
565            Self::ColumnMajor => sys::CBLAS_ORDER_CblasColMajor,
566        }
567    }
568}
569
570#[doc(hidden)]
571impl From<sys::CBLAS_ORDER> for CblasOrder {
572    fn from(v: sys::CBLAS_ORDER) -> CblasOrder {
573        match v {
574            sys::CBLAS_ORDER_CblasRowMajor => Self::RowMajor,
575            sys::CBLAS_ORDER_CblasColMajor => Self::ColumnMajor,
576            _ => panic!("Unknown CblasOrder value"),
577        }
578    }
579}
580
581#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
582pub enum CblasSide {
583    Left,
584    Right,
585}
586
587#[doc(hidden)]
588#[allow(clippy::from_over_into)]
589impl Into<sys::CBLAS_SIDE> for CblasSide {
590    fn into(self) -> sys::CBLAS_SIDE {
591        match self {
592            Self::Left => sys::CBLAS_SIDE_CblasLeft,
593            Self::Right => sys::CBLAS_SIDE_CblasRight,
594        }
595    }
596}
597
598#[doc(hidden)]
599impl From<sys::CBLAS_SIDE> for CblasSide {
600    fn from(v: sys::CBLAS_SIDE) -> CblasSide {
601        match v {
602            sys::CBLAS_SIDE_CblasLeft => Self::Left,
603            sys::CBLAS_SIDE_CblasRight => Self::Right,
604            _ => panic!("Unknown CblasSide value"),
605        }
606    }
607}
608
609#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
610pub enum CblasDiag {
611    NonUnit,
612    Unit,
613}
614
615#[doc(hidden)]
616#[allow(clippy::from_over_into)]
617impl Into<sys::CBLAS_SIDE> for CblasDiag {
618    fn into(self) -> sys::CBLAS_SIDE {
619        match self {
620            Self::NonUnit => sys::CBLAS_DIAG_CblasNonUnit,
621            Self::Unit => sys::CBLAS_DIAG_CblasUnit,
622        }
623    }
624}
625
626#[doc(hidden)]
627impl From<sys::CBLAS_SIDE> for CblasDiag {
628    fn from(v: sys::CBLAS_SIDE) -> CblasDiag {
629        match v {
630            sys::CBLAS_DIAG_CblasNonUnit => Self::NonUnit,
631            sys::CBLAS_DIAG_CblasUnit => Self::Unit,
632            _ => panic!("Unknown CblasDiag value"),
633        }
634    }
635}
636
637#[cfg(feature = "v2_5")]
638#[cfg_attr(feature = "dox", doc(cfg(feature = "v2_5")))]
639#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
640pub enum FilterEnd {
641    PadZero,
642    PadValue,
643    Truncate,
644}
645
646#[doc(hidden)]
647#[allow(clippy::from_over_into)]
648#[cfg(feature = "v2_5")]
649impl Into<sys::gsl_filter_end_t> for FilterEnd {
650    fn into(self) -> sys::gsl_filter_end_t {
651        match self {
652            Self::PadZero => sys::gsl_filter_end_t_GSL_FILTER_END_PADZERO,
653            Self::PadValue => sys::gsl_filter_end_t_GSL_FILTER_END_PADVALUE,
654            Self::Truncate => sys::gsl_filter_end_t_GSL_FILTER_END_TRUNCATE,
655        }
656    }
657}
658
659#[doc(hidden)]
660#[cfg(feature = "v2_5")]
661impl From<sys::gsl_filter_end_t> for FilterEnd {
662    fn from(v: sys::gsl_filter_end_t) -> FilterEnd {
663        match v {
664            sys::gsl_filter_end_t_GSL_FILTER_END_PADZERO => Self::PadZero,
665            sys::gsl_filter_end_t_GSL_FILTER_END_PADVALUE => Self::PadValue,
666            sys::gsl_filter_end_t_GSL_FILTER_END_TRUNCATE => Self::Truncate,
667            _ => panic!("Unknown FilterEnd value"),
668        }
669    }
670}
671
672#[cfg(feature = "v2_5")]
673#[cfg_attr(feature = "dox", doc(cfg(feature = "v2_5")))]
674#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
675pub enum FilterScale {
676    MedianAbsoluteDeviation,
677    InterQuartileRange,
678    SN,
679    QN,
680}
681
682#[doc(hidden)]
683#[allow(clippy::from_over_into)]
684#[cfg(feature = "v2_5")]
685impl Into<sys::gsl_filter_scale_t> for FilterScale {
686    fn into(self) -> sys::gsl_filter_scale_t {
687        match self {
688            Self::MedianAbsoluteDeviation => sys::gsl_filter_scale_t_GSL_FILTER_SCALE_MAD,
689            Self::InterQuartileRange => sys::gsl_filter_scale_t_GSL_FILTER_SCALE_IQR,
690            Self::SN => sys::gsl_filter_scale_t_GSL_FILTER_SCALE_SN,
691            Self::QN => sys::gsl_filter_scale_t_GSL_FILTER_SCALE_QN,
692        }
693    }
694}
695
696#[doc(hidden)]
697#[cfg(feature = "v2_5")]
698impl From<sys::gsl_filter_scale_t> for FilterScale {
699    fn from(v: sys::gsl_filter_scale_t) -> FilterScale {
700        match v {
701            sys::gsl_filter_scale_t_GSL_FILTER_SCALE_MAD => Self::MedianAbsoluteDeviation,
702            sys::gsl_filter_scale_t_GSL_FILTER_SCALE_IQR => Self::InterQuartileRange,
703            sys::gsl_filter_scale_t_GSL_FILTER_SCALE_SN => Self::SN,
704            sys::gsl_filter_scale_t_GSL_FILTER_SCALE_QN => Self::QN,
705            _ => panic!("Unknown FilterScale value"),
706        }
707    }
708}