]> git.donarmstrong.com Git - lilypond.git/blob - flower/full-storage.cc
release: 0.1.1
[lilypond.git] / flower / full-storage.cc
1 /*
2   full-storage.cc -- implement Full_storage
3
4   source file of the Flower Library
5
6   (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "full-storage.hh"
10
11
12 void
13 Full_storage::operator=(Full_storage const &fs)
14 {
15     resize(fs.height_i_, fs.width_i_);
16     OK();
17     fs.OK();
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];
21 }
22
23
24 void
25 Full_storage::OK() const
26 {
27 #ifndef NDEBUG
28
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_);
32 #endif
33 }
34
35
36
37
38 Full_storage::~Full_storage() 
39 {
40     for (int i=0; i < max_height_i_; i++)
41         delete [] els_p_p_[i];
42     delete[] els_p_p_;
43 }
44
45 void
46
47 Full_storage::resize(int rows, int cols)
48 {
49     OK();
50     resize_cols(rows);
51     resize_rows(cols);
52 }
53
54
55
56 bool
57 Full_storage::mult_ok(int i, int ) const
58 {
59     return i < height_i_;
60 }
61
62
63 bool
64 Full_storage::trans_ok(int , int j) const
65 {
66        return j < width_i_;
67
68
69
70
71 void
72 Full_storage::trans_next(int &i, int &j) const
73 {
74     assert(trans_ok(i,j));
75     i++;
76     if (i >= height_i_) {
77         i=0;
78         j ++;
79     }
80 }
81
82
83 void
84 Full_storage::mult_next(int &i, int &j) const
85 {
86     assert(mult_ok(i,j));
87     j++;
88     if (j >= width_i_) {
89         j=0;
90         i++;
91     }
92 }
93
94
95 void
96 Full_storage::delete_column(int k)
97 {
98     assert(0 <= k &&k<width_i_);    
99     for (int i=0; i< height_i_ ; i++)
100         for (int j=k+1; j <width_i_; j++)
101             els_p_p_[i][j-1]=els_p_p_[i][j];
102     width_i_--;
103 }
104
105
106 void
107 Full_storage::delete_row(int k)
108 {
109     assert(0 <= k &&k<height_i_);
110     for (int i=k+1; i < height_i_ ; i++)
111         for (int j=0; j < width_i_; j++)
112             els_p_p_[i-1][j]=els_p_p_[i][j];
113     height_i_--;
114 }
115
116
117
118 void
119 Full_storage::insert_row(int k)
120 {
121     assert(0 <= k&& k <=height_i_);
122     resize_cols(height_i_+1);
123     for (int i=height_i_-1; i > k ; i--)
124         for (int j=0; j <width_i_; j++)
125             els_p_p_[i][j]=els_p_p_[i-1][j];
126
127 }
128
129 bool
130 Full_storage::try_right_multiply(Matrix_storage * dest, Matrix_storage const * right)const
131 {
132     if (dest->name() != Full_storage::static_name() ||
133         right->name() != Full_storage::static_name())
134         return false;
135
136     Full_storage *d_l = (Full_storage*)dest;
137     Full_storage *r_l = (Full_storage*)right;
138     
139     d_l->set_size(height_i_, r_l->width_i_);
140     for (int i=0; i < d_l->height_i_; i++)
141         for (int j = 0; j < d_l->width_i_; j++) {
142             Real &r(d_l->els_p_p_[i][j]);
143             r=0.0;
144             for (int k = 0; k < width_i_; k++)
145                 r += els_p_p_[i][k] * r_l->els_p_p_[k][j];
146             
147         }
148     return true;
149     
150     
151 }
152 IMPLEMENT_IS_TYPE_B1(Full_storage,Matrix_storage);
153 void
154 Full_storage::resize_cols(int newh)
155 {
156     if (newh <= max_height_i_) {
157         height_i_=newh;
158         return;
159     }
160    
161     Real ** newa=new Real*[newh];
162     int j=0;
163     for (; j < height_i_; j++)
164         newa[j] = els_p_p_[j];
165     for (; j < newh; j++)
166         newa[j] = new Real[max_width_i_];
167     delete[] els_p_p_;
168     els_p_p_=newa;
169
170     height_i_ = max_height_i_ = newh;
171 }
172
173
174
175 Full_storage::Full_storage(Matrix_storage*m)
176 {
177     set_size(m->rows(), m->cols());
178     if ( !m->is_type_b ( Full_storage::static_name()))
179         for (int i=0; i<height_i_; i++)
180             for (int j=0; j<width_i_; j++)
181                 els_p_p_[i][j]=0.0;
182     for (int i,j=0; m->mult_ok(i,j); m->mult_next(i,j))
183         els_p_p_[i][j] = m->elem(i,j);
184 }
185
186
187 void
188 Full_storage::resize_rows(int neww)
189 {
190     if (neww <= max_width_i_) {
191         width_i_=neww;
192         return;
193     }
194     for (int i=0; i < max_height_i_ ; i++) {
195         Real* newa = new Real[neww];
196         for (int k=0; k < width_i_; k++)
197             newa[k] = els_p_p_[i][k];
198
199         delete[] els_p_p_[i];
200         els_p_p_[i] = newa;
201     }
202     width_i_ = max_width_i_ = neww;     
203 }
204
205 #ifdef INLINE
206 #undef INLINE
207 #endif
208 #define INLINE
209
210 #include "full-storage.icc"