2 full-storage.cc -- implement Full_storage
4 source file of the Flower Library
6 (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "full-storage.hh"
13 Full_storage::operator=(Full_storage
const &fs
)
15 resize (fs
.height_i_
, fs
.width_i_
);
18 for (int i
=0; i
<height_i_
; i
++)
19 for (int j
=0; j
<width_i_
; j
++)
20 els_p_p_
[i
][j
]= fs
.els_p_p_
[i
][j
];
25 Full_storage::OK() const
29 assert (max_height_i_
>= height_i_
&& max_width_i_
>= width_i_
);
30 assert (height_i_
>= 0 && width_i_
>= 0);
31 assert (els_p_p_
||!max_height_i_
);
38 Full_storage::~Full_storage()
40 for (int i
=0; i
< max_height_i_
; i
++)
41 delete [] els_p_p_
[i
];
47 Full_storage::resize (int rows
, int cols
)
57 Full_storage::mult_ok (int i
, int) const
64 Full_storage::trans_ok (int , int j
) const
72 Full_storage::trans_next (int &i
, int &j
) const
74 assert (trans_ok (i
,j
));
85 Full_storage::mult_next (int &i
, int &j
) const
87 assert (mult_ok (i
,j
));
98 Full_storage::delete_column (int k
)
100 assert (0 <= k
&&k
<width_i_
);
101 for (int i
=0; i
< height_i_
; i
++)
102 for (int j
=k
+1; j
<width_i_
; j
++)
103 els_p_p_
[i
][j
-1]=els_p_p_
[i
][j
];
109 Full_storage::delete_row (int k
)
111 assert (0 <= k
&&k
<height_i_
);
112 for (int i
=k
+1; i
< height_i_
; i
++)
113 for (int j
=0; j
< width_i_
; j
++)
114 els_p_p_
[i
-1][j
]=els_p_p_
[i
][j
];
121 Full_storage::insert_row (int k
)
123 assert (0 <= k
&& k
<=height_i_
);
124 resize_cols (height_i_
+1);
125 for (int i
=height_i_
-1; i
> k
; i
--)
126 for (int j
=0; j
<width_i_
; j
++)
127 els_p_p_
[i
][j
]=els_p_p_
[i
-1][j
];
132 Full_storage::try_right_multiply (Matrix_storage
* dest
, Matrix_storage
const * right
) const
134 if (dest
->name() != Full_storage::static_name () ||
135 right
->name() != Full_storage::static_name ())
138 Full_storage
*d_l
= (Full_storage
*)dest
;
139 Full_storage
*r_l
= (Full_storage
*)right
;
141 d_l
->set_size (height_i_
, r_l
->width_i_
);
142 for (int i
=0; i
< d_l
->height_i_
; i
++)
143 for (int j
= 0; j
< d_l
->width_i_
; j
++)
145 Real
&r (d_l
->els_p_p_
[i
][j
]);
147 for (int k
= 0; k
< width_i_
; k
++)
148 r
+= els_p_p_
[i
][k
] * r_l
->els_p_p_
[k
][j
];
155 IMPLEMENT_IS_TYPE_B1(Full_storage
,Matrix_storage
);
157 Full_storage::resize_cols (int newh
)
159 if (newh
<= max_height_i_
)
165 Real
** newa
=new Real
*[newh
];
167 for (; j
< height_i_
; j
++)
168 newa
[j
] = els_p_p_
[j
];
169 for (; j
< newh
; j
++)
170 newa
[j
] = new Real
[max_width_i_
];
174 height_i_
= max_height_i_
= newh
;
179 Full_storage::Full_storage (Matrix_storage
*m
)
181 set_size (m
->rows(), m
->cols ());
182 if (!m
->is_type_b (Full_storage::static_name()))
183 for (int i
=0; i
<height_i_
; i
++)
184 for (int j
=0; j
<width_i_
; j
++)
186 for (int i
,j
=0; m
->mult_ok (i
,j
); m
->mult_next (i
,j
))
187 els_p_p_
[i
][j
] = m
->elem (i
,j
);
192 Full_storage::resize_rows (int neww
)
194 if (neww
<= max_width_i_
)
199 for (int i
=0; i
< max_height_i_
; i
++)
201 Real
* newa
= new Real
[neww
];
202 for (int k
=0; k
< width_i_
; k
++)
203 newa
[k
] = els_p_p_
[i
][k
];
205 delete[] els_p_p_
[i
];
208 width_i_
= max_width_i_
= neww
;
216 #include "full-storage.icc"