sprs_rssn/
num_matrixmarket.rs1use 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!(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>);