2 full-storage.cc -- implement Full_storage
4 source file of the Flower Library
6 (c) 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_
);
33 Full_storage::resize_cols(int newh
)
35 if (newh
<= max_height_i_
) {
40 Real
** newa
=new Real
*[newh
];
42 for (; j
< height_i_
; j
++)
43 newa
[j
] = els_p_p_
[j
];
45 newa
[j
] = new Real
[max_width_i_
];
49 height_i_
= max_height_i_
= newh
;
53 Full_storage::resize_rows(int neww
)
55 if (neww
<= max_width_i_
) {
59 for (int i
=0; i
< max_height_i_
; i
++) {
60 Real
* newa
= new Real
[neww
];
61 for (int k
=0; k
< width_i_
; k
++)
62 newa
[k
] = els_p_p_
[i
][k
];
67 width_i_
= max_width_i_
= neww
;
70 Full_storage::~Full_storage() {
71 for (int i
=0; i
< max_height_i_
; i
++)
72 delete [] els_p_p_
[i
];
77 Full_storage::resize(int rows
, int cols
)
87 Full_storage::mult_ok(int i
, int j
) const
93 Full_storage::trans_ok(int i
, int j
) const
100 Full_storage::trans_next(int &i
, int &j
) const
102 assert(trans_ok(i
,j
));
104 if (i
>= height_i_
) {
111 Full_storage::mult_next(int &i
, int &j
) const
113 assert(mult_ok(i
,j
));
122 Full_storage::delete_column(int k
)
124 assert(0 <= k
&&k
<width_i_
);
125 for (int i
=0; i
< height_i_
; i
++)
126 for (int j
=k
+1; j
<width_i_
; j
++)
127 els_p_p_
[i
][j
-1]=els_p_p_
[i
][j
];
131 Full_storage::delete_row(int k
)
133 assert(0 <= k
&&k
<height_i_
);
134 for (int i
=k
+1; i
< height_i_
; i
++)
135 for (int j
=0; j
< width_i_
; j
++)
136 els_p_p_
[i
-1][j
]=els_p_p_
[i
][j
];
142 Full_storage::insert_row(int k
)
144 assert(0 <= k
&& k
<=height_i_
);
145 resize_cols(height_i_
+1);
146 for (int i
=height_i_
-1; i
> k
; i
--)
147 for (int j
=0; j
<width_i_
; j
++)
148 els_p_p_
[i
][j
]=els_p_p_
[i
-1][j
];
154 Full_storage::row(int n
) const
157 for (int j
= 0; j
< width_i_
; j
++)
158 r
.push(els_p_p_
[n
][j
]);
163 Full_storage::column(int n
) const
167 for (int i
= 0; i
<height_i_
; i
++)
168 r
.push(els_p_p_
[i
][n
]);
173 Full_storage::Full_storage(Full_storage
&s
)
179 Full_storage::clone()
181 return new Full_storage(*this);
186 Matrix_storage::get_full(int n
, int m
)
188 return new Full_storage(n
,m
);
192 Full_storage::try_right_multiply(Matrix_storage
* dest
, Matrix_storage
const * right
)
194 if (dest
->name() != Full_storage::static_name() ||
195 right
->name() != Full_storage::static_name())
198 Full_storage
*d_l
= (Full_storage
*)dest
;
199 Full_storage
*r_l
= (Full_storage
*)right
;
201 d_l
->set_size(height_i_
, r_l
->width_i_
);
202 for (int i
=0; i
< d_l
->height_i_
; i
++)
203 for (int j
= 0; j
< d_l
->width_i_
; j
++) {
204 Real
&r(d_l
->els_p_p_
[i
][j
]);
206 for (int k
= 0; k
< width_i_
; k
++)
207 r
+= els_p_p_
[i
][k
] * r_l
->els_p_p_
[k
][j
];
214 IMPLEMENT_STATIC_NAME(Full_storage
);
215 IMPLEMENT_STATIC_NAME(Matrix_storage
);