]> git.donarmstrong.com Git - lilypond.git/blobdiff - flower/full-storage.cc
release: 0.1.61
[lilypond.git] / flower / full-storage.cc
index e9fb1f3ca527ff8bf6ffe12d475773e72b461d49..4fc5605cfb01b5d8f0e706bca174369b9b329362 100644 (file)
 
   source file of the Flower Library
 
-  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+  (c) 1996, 1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>
 */
 
 #include "full-storage.hh"
 
+
 void
 Full_storage::operator=(Full_storage const &fs)
 {
-    resize(fs.height_i_, fs.width_i_);
-    OK();
-    fs.OK();
-    for (int i=0; i<height_i_; i++)
-       for (int j=0; j<width_i_; j++)
-           els_p_p_[i][j]= fs.els_p_p_[i][j];
+  resize (fs.height_i_, fs.width_i_);
+  OK();
+  fs.OK();
+  for (int i=0; i<height_i_; i++)
+    for (int j=0; j<width_i_; j++)
+      els_p_p_[i][j]= fs.els_p_p_[i][j];
 }
 
+
 void
 Full_storage::OK() const
 {
 #ifndef NDEBUG
-    //    static Real dummy;           
-    assert(max_height_i_ >= height_i_ && max_width_i_ >= width_i_);
-    assert(height_i_ >= 0 && width_i_ >= 0);
-    assert(els_p_p_||!max_height_i_);
+  assert (max_height_i_ >= height_i_ && max_width_i_ >= width_i_);
+  assert (height_i_ >= 0 && width_i_ >= 0);
+  assert (els_p_p_||!max_height_i_);
 #endif
 }
-void
-Full_storage::resize_cols(int newh)
+
+
+
+
+Full_storage::~Full_storage() 
 {
-    if (newh <= max_height_i_) {
-       height_i_=newh;
-       return;
-    }
-   
-    Real ** newa=new Real*[newh];
-    int j=0;
-    for (; j < height_i_; j++)
-       newa[j] = els_p_p_[j];
-    for (; j < newh; j++)
-       newa[j] = new Real[max_width_i_];
-    delete[] els_p_p_;
-    els_p_p_=newa;
-
-    height_i_ = max_height_i_ = newh;
+  for (int i=0; i < max_height_i_; i++)
+    delete [] els_p_p_[i];
+  delete[] els_p_p_;
 }
 
 void
-Full_storage::resize_rows(int neww)
+Full_storage::resize (int rows, int cols)
 {
-    if (neww <= max_width_i_) {
-       width_i_=neww;
-       return;
-    }
-    for (int i=0; i < max_height_i_ ; i++) {
-       Real* newa = new Real[neww];
-       for (int k=0; k < width_i_; k++)
-           newa[k] = els_p_p_[i][k];
-
-       delete[] els_p_p_[i];
-       els_p_p_[i] = newa;
-    }
-    width_i_ = max_width_i_ = neww;    
-}
-
-Full_storage::~Full_storage() {
-    for (int i=0; i < max_height_i_; i++)
-       delete [] els_p_p_[i];
-    delete[] els_p_p_;
+  OK();
+  resize_cols (rows);
+  resize_rows (cols);
+  band_i_ = rows >? cols;
 }
 
 void
-Full_storage::resize(int rows, int cols)
+Full_storage::delete_column (int k)
 {
-    OK();
-    resize_cols(rows);
-    resize_rows(cols);
-
+  assert (0 <= k &&k<width_i_);    
+  for (int i=0; i< height_i_ ; i++)
+    for (int j=k+1; j <width_i_; j++)
+      els_p_p_[i][j-1]=els_p_p_[i][j];
+  width_i_--;
 }
 
 
-bool
-Full_storage::mult_ok(int i, int j) const
+void
+Full_storage::delete_row (int k)
 {
-    return valid(i,j);
+  assert (0 <= k &&k<height_i_);
+  for (int i=k+1; i < height_i_ ; i++)
+    for (int j=0; j < width_i_; j++)
+      els_p_p_[i-1][j]=els_p_p_[i][j];
+  height_i_--;
 }
 
-bool
-Full_storage::trans_ok(int i, int j) const
-{
-       return valid(i,j);
-} 
 
 
 void
-Full_storage::trans_next(int &i, int &j) const
+Full_storage::insert_row (int k)
 {
-    assert(trans_ok(i,j));
-    i++;
-    if (i >= height_i_) {
-       i=0;
-       j ++;
-    }
+  assert (0 <= k&& k <=height_i_);
+  resize_cols (height_i_+1);
+  for (int i=height_i_-1; i > k ; i--)
+    for (int j=0; j <width_i_; j++)
+      els_p_p_[i][j]=els_p_p_[i-1][j];
+
+}
+Array<Real>
+Full_storage::row (int n) const
+{
+  Array<Real> r;
+  for (int j = 0; j < cols(); j++)
+    r.push (elem (n,j));
+  return r;
 }
 
-void
-Full_storage::mult_next(int &i, int &j) const
+Array<Real>
+Full_storage::column (int n) const
 {
-    assert(mult_ok(i,j));
-    j++;
-    if (j >= width_i_) {
-       j=0;
-       i++;
-    }
+  Array<Real> r;
+  for (int i = 0; i < rows(); i++)
+    r.push (elem (i,n));
+  return r;
 }
 
 void
-Full_storage::delete_column(int k)
+Full_storage::set_size (int rows, int cols)
 {
-    assert(0 <= k &&k<width_i_);    
-    for (int i=0; i< height_i_ ; i++)
-       for (int j=k+1; j <width_i_; j++)
-           els_p_p_[i][j-1]=els_p_p_[i][j];
-    width_i_--;
+  resize (rows,cols);
 }
+       
 void
-Full_storage::delete_row(int k)
+Full_storage::set_size (int rows)
 {
-    assert(0 <= k &&k<height_i_);
-    for (int i=k+1; i < height_i_ ; i++)
-       for (int j=0; j < width_i_; j++)
-           els_p_p_[i-1][j]=els_p_p_[i][j];
-    height_i_--;
+      
+  resize (rows);
 }
+       
 
 
 void
-Full_storage::insert_row(int k)
+Full_storage::resize_cols (int newh)
 {
-    assert(0 <= k&& k <=height_i_);
-    resize_cols(height_i_+1);
-    for (int i=height_i_-1; i > k ; i--)
-       for (int j=0; j <width_i_; j++)
-           els_p_p_[i][j]=els_p_p_[i-1][j];
-
-}
-
+  if (newh <= max_height_i_) 
+    {
+      height_i_=newh;
+      return;
+    }
+   
+  Real ** newa=new Real*[newh];
+  int j=0;
+  for (; j < height_i_; j++)
+    newa[j] = els_p_p_[j];
+  for (; j < newh; j++)
+    newa[j] = new Real[max_width_i_];
+  delete[] els_p_p_;
+  els_p_p_=newa;
 
-Array<Real>
-Full_storage::row(int n) const
-{
-    Array<Real> r;
-    for (int j = 0; j < width_i_; j++)
-       r.push(els_p_p_[n][j]);
-    return r;
+  height_i_ = max_height_i_ = newh;
 }
 
-Array<Real>
-Full_storage::column(int n) const
-{
-    
-    Array<Real> r;
-    for (int i = 0; i<height_i_; i++)
-       r.push(els_p_p_[i][n]);
-    return r;
-}
 
 
-Full_storage::Full_storage(Full_storage&s)
-{
-    init();
-    (*this) = s;
-}
-Matrix_storage*
-Full_storage::clone()
+void
+Full_storage::resize_rows (int neww)
 {
-    return new Full_storage(*this);
+  if (neww <= max_width_i_) 
+    {
+      width_i_=neww;
+      return;
+    }
+  for (int i=0; i < max_height_i_ ; i++) 
+    {
+      Real* newa = new Real[neww];
+      for (int k=0; k < width_i_; k++)
+       newa[k] = els_p_p_[i][k];
+
+      delete[] els_p_p_[i];
+      els_p_p_[i] = newa;
+    }
+  width_i_ = max_width_i_ = neww;      
 }
 
+#ifdef INLINE
+#undef INLINE
+#endif
+#define INLINE
 
-Matrix_storage *
-Matrix_storage::get_full(int n, int m)
-{
-    return new Full_storage(n,m);
-}
 
-bool
-Full_storage::try_right_multiply(Matrix_storage * dest, Matrix_storage const * right)
-{
-    if (dest->name() != Full_storage::static_name() ||
-       right->name() != Full_storage::static_name())
-       return false;
-
-    Full_storage *d_l = (Full_storage*)dest;
-    Full_storage *r_l = (Full_storage*)right;
-    
-    d_l->set_size(height_i_, r_l->width_i_);
-    for (int i=0; i < d_l->height_i_; i++)
-       for (int j = 0; j < d_l->width_i_; j++) {
-           Real &r(d_l->els_p_p_[i][j]);
-           r=0.0;
-           for (int k = 0; k < width_i_; k++)
-               r += els_p_p_[i][k] * r_l->els_p_p_[k][j];
-           
-       }
-    return true;
-    
-    
-}
-IMPLEMENT_STATIC_NAME(Full_storage);
-IMPLEMENT_STATIC_NAME(Matrix_storage);
+#include "full-storage.icc"