1
/*************************************************************************
3
* Copyright (c) 2010 Kohei Yoshida
5
* Permission is hereby granted, free of charge, to any person
6
* obtaining a copy of this software and associated documentation
7
* files (the "Software"), to deal in the Software without
8
* restriction, including without limitation the rights to use,
9
* copy, modify, merge, publish, distribute, sublicense, and/or sell
10
* copies of the Software, and to permit persons to whom the
11
* Software is furnished to do so, subject to the following
14
* The above copyright notice and this permission notice shall be
15
* included in all copies or substantial portions of the Software.
17
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24
* OTHER DEALINGS IN THE SOFTWARE.
26
************************************************************************/
30
template<typename _String, typename _Flag>
31
typename mixed_type_matrix<_String,_Flag>::storage_base*
32
mixed_type_matrix<_String,_Flag>::create_storage(size_t rows, size_t cols, matrix_density_t density)
36
case matrix_density_filled_zero:
37
return new filled_storage_type(rows, cols, matrix_init_element_zero);
38
case matrix_density_filled_empty:
39
return new filled_storage_type(rows, cols, matrix_init_element_empty);
40
case matrix_density_sparse_zero:
41
return new sparse_storage_type(rows, cols, matrix_init_element_zero);
42
case matrix_density_sparse_empty:
43
return new sparse_storage_type(rows, cols, matrix_init_element_empty);
45
throw matrix_error("unknown density type");
50
template<typename _String, typename _Flag>
51
mixed_type_matrix<_String,_Flag>::mixed_type_matrix() :
54
mp_storage = create_storage(0, 0, matrix_density_filled_zero);
57
template<typename _String, typename _Flag>
58
mixed_type_matrix<_String,_Flag>::mixed_type_matrix(matrix_density_t density) :
61
mp_storage = create_storage(0, 0, density);
64
template<typename _String, typename _Flag>
65
mixed_type_matrix<_String,_Flag>::mixed_type_matrix(size_t rows, size_t cols, matrix_density_t density) :
68
mp_storage = create_storage(rows, cols, density);
71
template<typename _String, typename _Flag>
72
mixed_type_matrix<_String,_Flag>::mixed_type_matrix(const mixed_type_matrix& r) :
73
mp_storage(r.mp_storage->clone())
77
template<typename _String, typename _Flag>
78
mixed_type_matrix<_String,_Flag>::~mixed_type_matrix()
83
template<typename _String, typename _Flag>
84
typename mixed_type_matrix<_String,_Flag>::const_iterator
85
mixed_type_matrix<_String,_Flag>::begin() const
87
return mp_storage->begin();
90
template<typename _String, typename _Flag>
91
typename mixed_type_matrix<_String,_Flag>::const_iterator
92
mixed_type_matrix<_String,_Flag>::end() const
94
return mp_storage->end();
97
template<typename _String, typename _Flag>
98
mixed_type_matrix<_String,_Flag>&
99
mixed_type_matrix<_String,_Flag>::operator= (const mixed_type_matrix& r)
106
mp_storage = r.mp_storage->clone();
110
template<typename _String, typename _Flag>
111
matrix_element_t mixed_type_matrix<_String,_Flag>::get_type(size_t row, size_t col) const
113
return mp_storage->get_type(row, col);
116
template<typename _String, typename _Flag>
117
double mixed_type_matrix<_String,_Flag>::get_numeric(size_t row, size_t col) const
119
return mp_storage->get_numeric(row, col);
122
template<typename _String, typename _Flag>
123
bool mixed_type_matrix<_String,_Flag>::get_boolean(size_t row, size_t col) const
125
return mp_storage->get_boolean(row, col);
128
template<typename _String, typename _Flag>
129
const typename mixed_type_matrix<_String,_Flag>::string_type*
130
mixed_type_matrix<_String,_Flag>::get_string(size_t row, size_t col) const
132
return mp_storage->get_string(row, col);
135
template<typename _String, typename _Flag>
136
void mixed_type_matrix<_String,_Flag>::set_numeric(size_t row, size_t col, double val)
138
mp_storage->get_element(row, col).set_numeric(val);
141
template<typename _String, typename _Flag>
142
void mixed_type_matrix<_String,_Flag>::set_boolean(size_t row, size_t col, bool val)
144
mp_storage->get_element(row, col).set_boolean(val);
147
template<typename _String, typename _Flag>
148
void mixed_type_matrix<_String,_Flag>::set_string(size_t row, size_t col, string_type* str)
150
mp_storage->get_element(row, col).set_string(str);
153
template<typename _String, typename _Flag>
154
void mixed_type_matrix<_String,_Flag>::set_flag(size_t row, size_t col, flag_type flag)
156
mp_storage->get_flag_storage().set_flag(row, col, flag);
159
template<typename _String, typename _Flag>
160
typename mixed_type_matrix<_String,_Flag>::flag_type
161
mixed_type_matrix<_String,_Flag>::get_flag(size_t row, size_t col) const
163
return mp_storage->get_flag_storage().get_flag(row, col);
166
template<typename _String, typename _Flag>
167
void mixed_type_matrix<_String,_Flag>::clear_flag(size_t row, size_t col)
169
return mp_storage->get_flag_storage().clear_flag(row, col);
172
template<typename _String, typename _Flag>
173
void mixed_type_matrix<_String,_Flag>::set_empty(size_t row, size_t col)
175
mp_storage->get_element(row, col).set_empty();
178
template<typename _String, typename _Flag>
179
void mixed_type_matrix<_String,_Flag>::set(size_t row, size_t col, double val)
181
set_numeric(row, col, val);
184
template<typename _String, typename _Flag>
185
void mixed_type_matrix<_String,_Flag>::set(size_t row, size_t col, bool val)
187
set_boolean(row, col, val);
190
template<typename _String, typename _Flag>
191
void mixed_type_matrix<_String,_Flag>::set(size_t row, size_t col, string_type* str)
193
set_string(row, col, str);
196
template<typename _String, typename _Flag>
197
typename mixed_type_matrix<_String,_Flag>::size_pair_type
198
mixed_type_matrix<_String,_Flag>::size() const
200
size_pair_type size_pair(mp_storage->rows(), mp_storage->cols());
204
template<typename _String, typename _Flag>
205
mixed_type_matrix<_String,_Flag>&
206
mixed_type_matrix<_String,_Flag>::transpose()
208
mp_storage->transpose();
212
template<typename _String, typename _Flag>
213
void mixed_type_matrix<_String,_Flag>::assign(const mixed_type_matrix& r)
216
// assignment to self.
219
size_t row_count = ::std::min(mp_storage->rows(), r.mp_storage->rows());
220
size_t col_count = ::std::min(mp_storage->cols(), r.mp_storage->cols());
221
for (size_t i = 0; i < row_count; ++i)
222
for (size_t j = 0; j < col_count; ++j)
223
mp_storage->get_element(i, j) = r.mp_storage->get_element(i, j);
226
template<typename _String, typename _Flag>
227
void mixed_type_matrix<_String,_Flag>::resize(size_t row, size_t col)
229
mp_storage->resize(row, col);
232
template<typename _String, typename _Flag>
233
void mixed_type_matrix<_String,_Flag>::clear()
238
template<typename _String, typename _Flag>
239
bool mixed_type_matrix<_String,_Flag>::numeric() const
241
return mp_storage->numeric();
244
template<typename _String, typename _Flag>
245
bool mixed_type_matrix<_String,_Flag>::empty() const
247
return mp_storage->empty();
250
template<typename _String, typename _Flag>
251
void mixed_type_matrix<_String,_Flag>::swap(mixed_type_matrix& r)
253
::std::swap(mp_storage, r.mp_storage);
257
template<typename _String, typename _Flag>
258
void mixed_type_matrix<_String,_Flag>::dump() const
261
size_t rows = mp_storage->rows(), cols = mp_storage->cols();
262
cout << "rows: " << mp_storage->rows() << " cols: " << mp_storage->cols() << endl;
263
for (size_t i = 0; i < rows; ++i)
265
cout << "row " << i << ": ";
266
for (size_t j = 0; j < cols; ++j)
268
matrix_element_t etype = mp_storage->get_type(i, j);
271
cout << "(col " << j << ": ";
274
case element_boolean:
275
cout << boolalpha << mp_storage->get_boolean(i, j) << noboolalpha;
280
case element_numeric:
281
cout << mp_storage->get_numeric(i, j);
284
cout << "'" << mp_storage->get_string(i, j) << "'";
295
template<typename _String, typename _Flag>
296
void mixed_type_matrix<_String,_Flag>::dump_flags() const
298
mp_storage->get_flag_storage().dump();