]> git.donarmstrong.com Git - lilypond.git/commitdiff
*** empty log message ***
authorJoe Neeman <joeneeman@gmail.com>
Mon, 24 Jul 2006 11:51:23 +0000 (11:51 +0000)
committerJoe Neeman <joeneeman@gmail.com>
Mon, 24 Jul 2006 11:51:23 +0000 (11:51 +0000)
flower/include/matrix.hh [new file with mode: 0644]

diff --git a/flower/include/matrix.hh b/flower/include/matrix.hh
new file mode 100644 (file)
index 0000000..4429ccc
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+  matrix.hh -- declare and implement 2d arrays
+
+  source file of the Flower Library
+
+  (c) 2006 Joe Neeman <joeneeman@gmail.com>
+*/
+
+#ifndef MATRIX_HH
+#define MATRIX_HH
+
+#include "std-vector.hh"
+
+template<class T, class A=std::allocator<T> >
+class Matrix
+{
+public:
+  Matrix<T, A> ()
+  {
+    rank_ = 0;
+  }
+
+  Matrix<T, A> (vsize rows, vsize columns, T const &t)
+  : data_(rows * columns, t)
+  {
+    rank_ = rows;
+  }
+
+  const T &at (vsize row, vsize col) const
+  {
+    assert (row < rank_ && col * rank_ + row < data_.size ());
+
+    return data_[col * rank_ + row];
+  }
+
+  T &at (vsize row, vsize col)
+  {
+    assert (row < rank_ && col * rank_ + row < data_.size ());
+
+    return data_[col * rank_ + row];
+  }
+
+  void resize (vsize rows, vsize columns, T const &t)
+  {
+    if (rows == rank_)
+      data_.resize (rows * columns, t);
+    else
+      {
+       vector<T,A> new_data;
+       new_data.resize (rows * columns, t);
+       vsize cur_cols = rank_ ? data_.size () / rank_: 0;
+
+       for (vsize i = 0; i < cur_cols; i++)
+         for (vsize j = 0; j < rank_; j++)
+           new_data[i*rows + j] = data_[i*rank_ + j];
+       rank_ = rows;
+       data_ = new_data;
+      }
+  }
+
+private:
+  vector<T, A> data_;
+  vsize rank_;
+};
+
+#endif /* MATRIX_HH */