sprs_rssn/
num_kinds.rs

1//! Trait to be able to know at runtime if a generic scalar is an integer, a float
2//! or a complex.
3
4use num_complex::{Complex32, Complex64};
5
6use std::{
7    fmt,
8    ops::{Add, Neg},
9};
10/// the type for Pattern data, it's special which contains no data
11#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
12pub struct Pattern;
13
14impl Add for Pattern {
15    type Output = Pattern;
16    fn add(self, _other: Pattern) -> Pattern {
17        Pattern {}
18    }
19}
20impl Neg for Pattern {
21    type Output = Pattern;
22    fn neg(self) -> Pattern {
23        Pattern {}
24    }
25}
26
27#[derive(Debug, Copy, Clone, PartialEq, Eq)]
28pub enum NumKind {
29    Integer,
30    Float,
31    Complex,
32    Pattern,
33}
34
35impl fmt::Display for NumKind {
36    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
37        match self {
38            Self::Integer => write!(f, "integer"),
39            Self::Float => write!(f, "real"),
40            Self::Complex => write!(f, "complex"),
41            Self::Pattern => write!(f, "pattern"),
42        }
43    }
44}
45
46pub trait PrimitiveKind {
47    /// Informs whether a generic primitive type contains an integer,
48    /// a float or a complex
49    fn num_kind() -> NumKind;
50}
51impl PrimitiveKind for Pattern {
52    fn num_kind() -> NumKind {
53        NumKind::Pattern
54    }
55}
56
57macro_rules! integer_prim_kind_impl {
58    ($prim: ty) => {
59        impl PrimitiveKind for $prim {
60            fn num_kind() -> NumKind {
61                NumKind::Integer
62            }
63        }
64    };
65}
66
67integer_prim_kind_impl!(i8);
68integer_prim_kind_impl!(u8);
69integer_prim_kind_impl!(i16);
70integer_prim_kind_impl!(u16);
71integer_prim_kind_impl!(i32);
72integer_prim_kind_impl!(u32);
73integer_prim_kind_impl!(i64);
74integer_prim_kind_impl!(u64);
75integer_prim_kind_impl!(isize);
76integer_prim_kind_impl!(usize);
77
78macro_rules! float_prim_kind_impl {
79    ($prim: ty) => {
80        impl PrimitiveKind for $prim {
81            fn num_kind() -> NumKind {
82                NumKind::Float
83            }
84        }
85    };
86}
87
88float_prim_kind_impl!(f32);
89float_prim_kind_impl!(f64);
90
91macro_rules! complex_prim_kind_impl {
92    ($prim: ty) => {
93        impl PrimitiveKind for $prim {
94            fn num_kind() -> NumKind {
95                NumKind::Complex
96            }
97        }
98    };
99}
100
101complex_prim_kind_impl!(Complex32);
102complex_prim_kind_impl!(Complex64);