Skip to main content

sprs_rssn/
num_matrixmarket.rs

1use num_complex::Complex;
2use num_traits::cast::NumCast;
3use std::fmt;
4use std::fmt::Display;
5use std::str::SplitWhitespace;
6
7use crate::io::IoError::BadMatrixMarketFile;
8use crate::num_kinds::Pattern;
9
10pub struct Displayable<T>(T);
11
12impl Display for Displayable<&Pattern> {
13    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
14        // write nothing for pattern
15        write!(f, "")
16    }
17}
18
19pub trait MatrixMarketDisplay
20where
21    Self: Sized,
22{
23    fn mm_display(&self) -> Displayable<&Self> {
24        Displayable(self)
25    }
26}
27
28impl<T> MatrixMarketDisplay for T
29where
30    for<'a> Displayable<&'a T>: Display,
31{
32    fn mm_display(&self) -> Displayable<&Self> {
33        Displayable(self)
34    }
35}
36
37macro_rules! default_matrixmarket_display_impl {
38    ($t: ty) => {
39        impl Display for Displayable<$t> {
40            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41                write!(f, "{}", self.0)
42            }
43        }
44        impl Display for Displayable<&$t> {
45            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46                write!(f, "{}", self.0)
47            }
48        }
49    };
50}
51
52macro_rules! complex_matrixmarket_display_impl {
53    ($t: ty) => {
54        impl Display for Displayable<Complex<$t>> {
55            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
56                write!(f, "{} {}", self.0.re, self.0.im)
57            }
58        }
59        impl Display for Displayable<&Complex<$t>> {
60            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61                write!(f, "{} {}", self.0.re, self.0.im)
62            }
63        }
64    };
65}
66
67default_matrixmarket_display_impl!(i8);
68default_matrixmarket_display_impl!(u8);
69default_matrixmarket_display_impl!(i16);
70default_matrixmarket_display_impl!(u16);
71default_matrixmarket_display_impl!(i32);
72default_matrixmarket_display_impl!(u32);
73default_matrixmarket_display_impl!(i64);
74default_matrixmarket_display_impl!(u64);
75default_matrixmarket_display_impl!(isize);
76default_matrixmarket_display_impl!(usize);
77default_matrixmarket_display_impl!(f32);
78default_matrixmarket_display_impl!(f64);
79
80complex_matrixmarket_display_impl!(f64);
81complex_matrixmarket_display_impl!(f32);
82
83pub trait MatrixMarketRead: Sized {
84    fn mm_read(r: &mut SplitWhitespace) -> Result<Self, crate::io::IoError>;
85}
86impl MatrixMarketRead for Pattern {
87    fn mm_read(_: &mut SplitWhitespace) -> Result<Self, crate::io::IoError> {
88        Ok(Pattern {})
89    }
90}
91
92macro_rules! matrixmarket_read_impl {
93    (Complex<$t:ty>) => {
94        impl MatrixMarketRead for Complex<$t> {
95            fn mm_read(
96                r: &mut SplitWhitespace,
97            ) -> Result<Self, crate::io::IoError> {
98                let re = r.next().ok_or(BadMatrixMarketFile).and_then(|s| {
99                    s.parse::<$t>().or(Err(BadMatrixMarketFile))
100                })?;
101                let im = r.next().ok_or(BadMatrixMarketFile).and_then(|s| {
102                    s.parse::<$t>().or(Err(BadMatrixMarketFile))
103                })?;
104                Ok(Complex::<$t>::new(re, im))
105            }
106        }
107    };
108    ($t: ty) => {
109        impl MatrixMarketRead for $t {
110            fn mm_read(
111                r: &mut SplitWhitespace,
112            ) -> Result<Self, crate::io::IoError> {
113                let val =
114                    r.next().ok_or(BadMatrixMarketFile).and_then(|s| {
115                        s.parse::<$t>().or(Err(BadMatrixMarketFile))
116                    })?;
117                NumCast::from(val).ok_or_else(|| BadMatrixMarketFile)
118            }
119        }
120    };
121}
122
123matrixmarket_read_impl!(i8);
124matrixmarket_read_impl!(u8);
125matrixmarket_read_impl!(i16);
126matrixmarket_read_impl!(u16);
127matrixmarket_read_impl!(i32);
128matrixmarket_read_impl!(u32);
129matrixmarket_read_impl!(i64);
130matrixmarket_read_impl!(u64);
131matrixmarket_read_impl!(isize);
132matrixmarket_read_impl!(usize);
133matrixmarket_read_impl!(f32);
134matrixmarket_read_impl!(f64);
135matrixmarket_read_impl!(Complex<f64>);
136matrixmarket_read_impl!(Complex<f32>);
137
138pub trait MatrixMarketConjugate
139where
140    Self: Sized,
141{
142    fn mm_conj(&self) -> Option<Self>;
143}
144impl MatrixMarketConjugate for Pattern {
145    fn mm_conj(&self) -> Option<Self> {
146        None
147    }
148}
149
150macro_rules! matrixmarket_conjugate_impl {
151    (Complex<$t:ty>) => {
152        impl MatrixMarketConjugate for Complex<$t> {
153            fn mm_conj(&self) -> Option<Self> {
154                Some(self.conj())
155            }
156        }
157    };
158    ($t: ty) => {
159        impl MatrixMarketConjugate for $t {
160            fn mm_conj(&self) -> Option<Self> {
161                None
162            }
163        }
164    };
165}
166
167matrixmarket_conjugate_impl!(i8);
168matrixmarket_conjugate_impl!(u8);
169matrixmarket_conjugate_impl!(i16);
170matrixmarket_conjugate_impl!(u16);
171matrixmarket_conjugate_impl!(i32);
172matrixmarket_conjugate_impl!(u32);
173matrixmarket_conjugate_impl!(i64);
174matrixmarket_conjugate_impl!(u64);
175matrixmarket_conjugate_impl!(isize);
176matrixmarket_conjugate_impl!(usize);
177matrixmarket_conjugate_impl!(f32);
178matrixmarket_conjugate_impl!(f64);
179matrixmarket_conjugate_impl!(Complex<f64>);
180matrixmarket_conjugate_impl!(Complex<f32>);