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"
12 Full_storage::operator=(Full_storage const &fs)
14 resize(fs.height_i_, fs.width_i_);
17 for (int i=0; i<height_i_; i++)
18 for (int j=0; j<width_i_; j++)
19 els_p_p_[i][j]= fs.els_p_p_[i][j];
23 Full_storage::OK() const
27 assert(max_height_i_ >= height_i_ && max_width_i_ >= width_i_);
28 assert(height_i_ >= 0 && width_i_ >= 0);
29 assert(els_p_p_||!max_height_i_);
34 Full_storage::resize_cols(int newh)
36 if (newh <= max_height_i_) {
41 Real ** newa=new Real*[newh];
43 for (; j < height_i_; j++)
44 newa[j] = els_p_p_[j];
46 newa[j] = new Real[max_width_i_];
50 height_i_ = max_height_i_ = newh;
54 Full_storage::Full_storage(Matrix_storage*m)
56 set_size(m->rows(), m->cols());
57 if ( !m->is_type_b ( Full_storage::static_name()))
58 for (int i=0; i<height_i_; i++)
59 for (int j=0; j<width_i_; j++)
61 for (int i,j=0; m->mult_ok(i,j); m->mult_next(i,j))
62 els_p_p_[i][j] = m->elem(i,j);
66 Full_storage::resize_rows(int neww)
68 if (neww <= max_width_i_) {
72 for (int i=0; i < max_height_i_ ; i++) {
73 Real* newa = new Real[neww];
74 for (int k=0; k < width_i_; k++)
75 newa[k] = els_p_p_[i][k];
80 width_i_ = max_width_i_ = neww;
83 Full_storage::~Full_storage() {
84 for (int i=0; i < max_height_i_; i++)
85 delete [] els_p_p_[i];
90 Full_storage::resize(int rows, int cols)
99 Full_storage::mult_ok(int i, int ) const
101 return i < height_i_;
105 Full_storage::trans_ok(int , int j) const
112 Full_storage::trans_next(int &i, int &j) const
114 assert(trans_ok(i,j));
116 if (i >= height_i_) {
123 Full_storage::mult_next(int &i, int &j) const
125 assert(mult_ok(i,j));
134 Full_storage::delete_column(int k)
136 assert(0 <= k &&k<width_i_);
137 for (int i=0; i< height_i_ ; i++)
138 for (int j=k+1; j <width_i_; j++)
139 els_p_p_[i][j-1]=els_p_p_[i][j];
143 Full_storage::delete_row(int k)
145 assert(0 <= k &&k<height_i_);
146 for (int i=k+1; i < height_i_ ; i++)
147 for (int j=0; j < width_i_; j++)
148 els_p_p_[i-1][j]=els_p_p_[i][j];
154 Full_storage::insert_row(int k)
156 assert(0 <= k&& k <=height_i_);
157 resize_cols(height_i_+1);
158 for (int i=height_i_-1; i > k ; i--)
159 for (int j=0; j <width_i_; j++)
160 els_p_p_[i][j]=els_p_p_[i-1][j];
165 Full_storage::dim()const
167 assert (rows()==cols());
171 Full_storage::Full_storage(Full_storage const&s)
178 Full_storage::try_right_multiply(Matrix_storage * dest, Matrix_storage const * right)const
180 if (dest->name() != Full_storage::static_name() ||
181 right->name() != Full_storage::static_name())
184 Full_storage *d_l = (Full_storage*)dest;
185 Full_storage *r_l = (Full_storage*)right;
187 d_l->set_size(height_i_, r_l->width_i_);
188 for (int i=0; i < d_l->height_i_; i++)
189 for (int j = 0; j < d_l->width_i_; j++) {
190 Real &r(d_l->els_p_p_[i][j]);
192 for (int k = 0; k < width_i_; k++)
193 r += els_p_p_[i][k] * r_l->els_p_p_[k][j];
200 IMPLEMENT_IS_TYPE_B1(Full_storage,Matrix_storage);