[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Toon-members] TooN TooN.h internal/allocator.hh internal/matr...
From: |
Tom Drummond |
Subject: |
[Toon-members] TooN TooN.h internal/allocator.hh internal/matr... |
Date: |
Fri, 06 Mar 2009 14:51:41 +0000 |
CVSROOT: /cvsroot/toon
Module name: TooN
Changes by: Tom Drummond <twd20> 09/03/06 14:51:41
Modified files:
. : TooN.h
internal : allocator.hh matrix.hh mbase.hh vbase.hh
test : mat_test.cc
Log message:
Remove the distinction between RowMajor and ColMajor in generic matrix
base.
BROKEN BROKEN BORKEN BROKEN!!
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/TooN/TooN.h?cvsroot=toon&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/allocator.hh?cvsroot=toon&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/matrix.hh?cvsroot=toon&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/mbase.hh?cvsroot=toon&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/vbase.hh?cvsroot=toon&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/TooN/test/mat_test.cc?cvsroot=toon&r1=1.5&r2=1.6
Patches:
Index: TooN.h
===================================================================
RCS file: /cvsroot/toon/TooN/TooN.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- TooN.h 18 Feb 2009 20:29:10 -0000 1.22
+++ TooN.h 6 Mar 2009 14:51:41 -0000 1.23
@@ -25,7 +25,7 @@
#endif
- template<int Stride> struct Slice;
+ template<int RowStride, int ColStride> struct Slice;
template<int Size, class Precision, class Base> struct Vector;
template<int Rows, int Cols, class Precision, class Base> struct Matrix;
Index: internal/allocator.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/allocator.hh,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- internal/allocator.hh 24 Feb 2009 17:47:51 -0000 1.14
+++ internal/allocator.hh 6 Mar 2009 14:51:41 -0000 1.15
@@ -330,8 +330,19 @@
};
+template<int S> struct RowStrideHolder: public StrideHolder<S>
+{
+ RowStrideHolder(int i)
+ :StrideHolder<S>(i){}
+};
+template<int S> struct ColStrideHolder: public StrideHolder<S>
+{
+ ColStrideHolder(int i)
+ :StrideHolder<S>(i){}
+};
+
Index: internal/matrix.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/matrix.hh,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- internal/matrix.hh 6 Mar 2009 13:09:43 -0000 1.10
+++ internal/matrix.hh 6 Mar 2009 14:51:41 -0000 1.11
@@ -2,8 +2,11 @@
class Matrix : public Layout::template Layout<Rows, Cols, Precision>
{
private:
- using Layout::template Layout<Rows, Cols, Precision>::my_data;
+ //using Layout::template Layout<Rows, Cols, Precision>::my_data;
public:
+
+ using Layout::template Layout<Rows, Cols, Precision>::my_data;
+
using Layout::template Layout<Rows, Cols, Precision>::num_rows;
using Layout::template Layout<Rows, Cols, Precision>::num_cols;
Index: internal/mbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/mbase.hh,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- internal/mbase.hh 6 Mar 2009 12:19:52 -0000 1.15
+++ internal/mbase.hh 6 Mar 2009 14:51:41 -0000 1.16
@@ -1,49 +1,26 @@
-//Slicing and etc...
-//SS = static size, static stride
-//DS = dynamic size, static stride (can use DD)
-//Dl = dynamic size, linked stride: for RowMajor user instantiated dynamic
matrices, stride==cols
-//DD = dynamic size, dynamic stride
-//SD = static size, dynamic stride.
-
-//SS.slice<>() -> SS
-//SS.slice() -> DS
-//DS.slice<>() -> SS
-//DS.slice() -> DS
-//Dc.slice<>() -> SD
-//Dl.silce() -> DD
-//DD.slice<>() -> SD
-//DD.slice() -> DD
-//SD.slice<>() -> SD
-//SD.slice() -> DD
-
-
// As usual, a positive integer means static and -1 means dynamic.
// The new case is that for strides, -2 means that the stride is
// the same as num_cols/num_rows, which must be dynamically sized.
template<int,int,class,class> class Matrix;
-template<int Rows, int Cols, class Precision, int Stride, class Mem> struct
GenericRowMajor;
-template<int Rows, int Cols, class Precision, int Stride, class Mem> struct
GenericColMajor;
-
////////////////////////////////////////////////////////////////////////////////
//Closure used to acquire strides
//-1 means dynamic stride
//-2 means dynamic stride is tied to size for a normal matrix
-//-3 means dynamic stride is tied to size for a transposed matrix
-template<int Stride> struct Slice
+template<int RowStride, int ColStride> struct Slice
{
- struct RowMajor
- {
- template<int Rows, int Cols, class Precision> struct Layout:
public GenericRowMajor<Rows, Cols, Precision, Stride, MatrixSlice<Rows, Cols,
Precision> >
+ struct Layout{
+ template<int Rows, int Cols, class Precision> struct Layout:
public GenericMBase<Rows, Cols, Precision, RowStride, ColStride,
MatrixSlice<Rows, Cols, Precision> >
{
//Optional constructors.
Layout(Precision* p)
-
:GenericRowMajor<Rows,Cols,Precision,Stride,MatrixSlice<Rows, Cols, Precision>
>(p)
+
:GenericMBase<Rows,Cols,Precision,RowStride,ColStride,MatrixSlice<Rows, Cols,
Precision> >(p)
{
}
+#if 0
Layout(Precision* p, int stride)
:GenericRowMajor<Rows,Cols,Precision,Stride,MatrixSlice<Rows, Cols, Precision>
>(p, stride)
{
@@ -53,41 +30,13 @@
:GenericRowMajor<Rows,Cols,Precision,Stride,MatrixSlice<Rows, Cols, Precision>
>(p, rows, cols)
{
}
+#endif
- Layout(Precision* p, int rows, int cols, int stride)
-
:GenericRowMajor<Rows,Cols,Precision,Stride,MatrixSlice<Rows, Cols, Precision>
>(p, rows, cols, stride)
- {
- }
-
- };
- };
-
- struct ColMajor
- {
- template<int Rows, int Cols, class Precision> struct Layout:
public GenericColMajor<Rows, Cols, Precision, Stride, MatrixSlice<Rows, Cols,
Precision> >
- {
- //Optional constructors.
-
- Layout(Precision* p)
-
:GenericColMajor<Rows,Cols,Precision,Stride,MatrixSlice<Rows, Cols, Precision>
>(p)
- {
- }
-
- Layout(Precision* p, int stride)
-
:GenericColMajor<Rows,Cols,Precision,Stride,MatrixSlice<Rows, Cols, Precision>
>(p, stride)
- {
- }
-
- Layout(Precision* p, int rows, int cols)
-
:GenericColMajor<Rows,Cols,Precision,Stride,MatrixSlice<Rows, Cols, Precision>
>(p, rows, cols)
- {
- }
- Layout(Precision* p, int rows, int cols, int stride)
-
:GenericColMajor<Rows,Cols,Precision,Stride,MatrixSlice<Rows, Cols, Precision>
>(p, rows, cols, stride)
+ Layout(Precision* p, int rows, int cols, int rowstride,
int colstride)
+
:GenericMBase<Rows,Cols,Precision,RowStride,ColStride,MatrixSlice<Rows, Cols,
Precision> >(p, rows, cols, rowstride, colstride)
{
}
-
};
};
};
@@ -134,34 +83,54 @@
// Row major matrix implementation
//
-template<int Rows, int Cols, class Precision, int Stride, class Mem> struct
GenericRowMajor: public Mem, StrideHolder<Stride>
+template<int Rows, int Cols, class Precision, int RowStride, int ColStride,
class Mem> struct GenericMBase
+ : public Mem,
+ RowStrideHolder<RowStride>,
+ ColStrideHolder<ColStride>
{
//Slices can never have tied strides
- static const int SliceStride = Stride == -2?-1: Stride;
+ static const int SliceRowStride = RowStride == -2?-1: RowStride;
+ static const int SliceColStride = ColStride == -2?-1: ColStride;
- int stride() const {
- if(Stride == -2) //Normal tied stride
+ int rowstride() const {
+ if(RowStride == -2) { //Normal tied stride
return num_cols();
- else
- return StrideHolder<Stride>::stride();
+ } else {
+ return RowStrideHolder<RowStride>::stride();
+ }
+ }
+
+ int colstride() const {
+ if(ColStride == -2) { //Normal tied stride
+ return num_row();
+ } else {
+ return ColStrideHolder<ColStride>::stride();
+ }
}
//Optional constructors
- GenericRowMajor(){}
+ GenericMBaser(){}
- GenericRowMajor(Precision* p)
+ GenericMBase(Precision* p)
:Mem(p) {}
+ // We think we don't need these any more
+#if 0
GenericRowMajor(Precision* p, int s)
:Mem(p),StrideHolder<Stride>(s) {}
GenericRowMajor(Precision* p, int r, int c)
:Mem(p, r, c) {}
+#endif
- GenericRowMajor(Precision* p, int r, int c, int stride)
- :Mem(p, r, c),StrideHolder<Stride>(stride) {}
- GenericRowMajor(int r, int c)
+ GenericMBase(Precision* p, int r, int c, int rowstride, int colstride)
+ :Mem(p, r, c),
+ RowStrideHolder<RowStride>(rowstride)
+ ColStrideHolder<ColStride>(colstride)
+ {}
+
+ GenericMBase(int r, int c)
:Mem(r, c) {}
using Mem::my_data;
@@ -169,63 +138,65 @@
using Mem::num_rows;
Precision& operator()(int r, int c){
- return my_data[r*stride() + c];
+ return my_data[r*rowstride() + c*colstride()];
}
const Precision& operator()(int r, int c) const {
- return my_data[r*stride() + c];
+ return my_data[r*rowstride() + c*colstride()];
}
-
- typedef Vector<Cols, Precision, SliceVBase<1> > Vec;
+ // this is the type of vector obtained by [ ]
+ typedef Vector<Cols, Precision, SliceVBase<SliceColStride> > Vec;
Vec operator[](int r) {
Internal::check_index(num_rows(), r);
- return Vec(my_data + stride()* r, num_cols(), 1, Slicing());
+ return Vec(my_data + rowstride()* r, num_cols(), colstride(),
Slicing());
}
const Vec operator[](int r) const {
Internal::check_index(num_rows(), r);
- return Vec(const_cast<Precision*>(my_data + stride()* r),
num_cols(), 1, Slicing());
+ return Vec(const_cast<Precision*>(my_data + rowstride()* r),
num_cols(), colstride(), Slicing());
}
+
+
template<int Rstart, int Cstart, int Rlength, int Clength>
- Matrix<Rlength, Clength, Precision, typename
Slice<SliceStride>::RowMajor> slice()
+ Matrix<Rlength, Clength, Precision, typename
Slice<SliceRowStride,SliceColStride> > slice()
{
//Always pass the stride as a run-time parameter. It will be
ignored
//by SliceHolder (above) if it is statically determined.
Internal::CheckStaticSlice<Rows, Rstart,
Rlength>::check(num_rows());
Internal::CheckStaticSlice<Cols, Cstart,
Clength>::check(num_cols());
- return Matrix<Rlength, Clength, Precision, typename
Slice<SliceStride>::RowMajor>(my_data+stride()*Rstart + Cstart, stride(),
Slicing());
+ return Matrix<Rlength, Clength, Precision, typename
Slice<SliceRowStride,SliceColStride>::Layout>(my_data+rowstride()*Rstart +
colstride()*Cstart, rowstride(), colstride(), Slicing());
}
template<int Rstart, int Cstart, int Rlength, int Clength>
- const Matrix<Rlength, Clength, Precision, typename
Slice<SliceStride>::RowMajor> slice() const
+ const Matrix<Rlength, Clength, Precision, typename
Slice<SliceRowStride,SliceColStride>::Layout> slice() const
{
Internal::CheckStaticSlice<Rows, Rstart,
Rlength>::check(num_rows());
Internal::CheckStaticSlice<Cols, Cstart,
Clength>::check(num_cols());
- return Matrix<Rlength, Clength, Precision, typename
Slice<SliceStride>::RowMajor>(const_cast<Precision*>(my_data+stride()*Rstart +
Cstart), stride(), Slicing());
+ return Matrix<Rlength, Clength, Precision, typename
Slice<SliceRowStride,SliceColStride>::Layout>(const_cast<Precision*>(my_data+rowstride()*Rstart
+ colstride()*Cstart), rowstride(), colstride(), Slicing());
}
- Matrix<-1, -1, Precision, typename Slice<SliceStride>::RowMajor >
slice(int rs, int cs, int rl, int cl){
+ Matrix<-1, -1, Precision, typename
Slice<SliceRowStride,SliceColStride>::RowMajor > slice(int rs, int cs, int rl,
int cl){
Internal::CheckDynamicSlice::check(num_rows(), rs, rl);
Internal::CheckDynamicSlice::check(num_cols(), cs, cl);
- return Matrix<-1, -1, Precision, typename
Slice<SliceStride>::RowMajor >(my_data+stride()*rs +cs, rl, cl, stride(),
Slicing());
+ return Matrix<-1, -1, Precision, typename
Slice<SliceRowStride,SliceColStride>::RowMajor >(my_data+rowstride()*rs
+colstride()*cs, rl, cl, rowstride(), colstride(), Slicing());
}
- const Matrix<-1, -1, Precision, typename Slice<SliceStride>::RowMajor >
slice(int rs, int cs, int rl, int cl) const {
+ const Matrix<-1, -1, Precision, typename
Slice<SliceRowStride,SliceColStride>::RowMajor > slice(int rs, int cs, int rl,
int cl) const {
Internal::CheckDynamicSlice::check(num_rows(), rs, rl);
Internal::CheckDynamicSlice::check(num_cols(), cs, cl);
- return Matrix<-1, -1, Precision, typename
Slice<SliceStride>::RowMajor >(const_cast<Precision*>(my_data+stride()*rs +cs),
rl, cl, stride(), Slicing());
+ return Matrix<-1, -1, Precision, typename
Slice<SliceRowStride,SliceColStride>::RowMajor
>(const_cast<Precision*>(my_data+stride()*rs +colstride()*cs), rl, cl,
rowstride(), colstride(), Slicing());
}
- Matrix<Cols, Rows, Precision, typename Slice<Stride>::ColMajor> T(){
- return Matrix<Cols, Rows, Precision, typename
Slice<Stride>::ColMajor>(my_data, num_cols(), num_rows(), stride(), Slicing());
+ Matrix<Cols, Rows, Precision, typename
Slice<SliceColStride,SliceRowStride>::Layout> T(){
+ return Matrix<Cols, Rows, Precision, typename
Slice<SliceColStride,SliceRowStride>::Layout>(my_data, num_cols(), num_rows(),
colstride(), rowstride(), Slicing());
}
- const Matrix<Cols, Rows, Precision, typename Slice<Stride>::ColMajor>
T() const{
- return Matrix<Cols, Rows, Precision, typename
Slice<Stride>::ColMajor>(const_cast<Precision*>(my_data), num_cols(),
num_rows(), stride(), Slicing());
+ const Matrix<Cols, Rows, Precision, typename
Slice<SliceColStride,SliceRowStride>::Layout> T() const{
+ return Matrix<Cols, Rows, Precision, typename
Slice<SliceColStride,SliceRowStride>::Layout>(const_cast<Precision*>(my_data),
num_cols(), num_rows(), colstride(), rowstride(), Slicing());
}
};
@@ -234,104 +205,3 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-// Column major matrix implementation
-//
-
-template<int Rows, int Cols, class Precision, int Stride, class Mem> struct
GenericColMajor: public Mem, public StrideHolder<Stride>
-{
- //Slices can never have tied strides
- static const int SliceStride = Stride == -2?-1: Stride;
-
- int stride() const {
- if(Stride == -2) //Normal tied stride
- return num_rows();
- else
- return StrideHolder<Stride>::stride();
- }
-
-
- //Optional constructors
-
- GenericColMajor(){}
-
- GenericColMajor(Precision* p)
- :Mem(p) {}
-
- GenericColMajor(Precision* p, int s)
- :Mem(p),StrideHolder<Stride>(s) {}
-
- GenericColMajor(Precision* p, int r, int c)
- :Mem(p, r, c) {}
-
- GenericColMajor(Precision* p, int r, int c, int stride)
- :Mem(p, r, c),StrideHolder<Stride>(stride) {}
-
- GenericColMajor(int r, int c)
- :Mem(r, c) {}
-
- using Mem::my_data;
- using Mem::num_cols;
- using Mem::num_rows;
-
- Precision& operator()(int r, int c){
- return my_data[c*stride() + r];
- }
-
- const Precision& operator()(int r, int c) const {
- return my_data[c*stride() + r];
- }
-
- typedef Vector<Cols, Precision, SliceVBase<SliceStride> > Vec;
- Vec operator[](int r) {
- Internal::check_index(num_rows(), r);
- return Vec(my_data + r, num_cols(), stride(), Slicing());
- }
-
- const Vec operator[](int r) const {
- Internal::check_index(num_rows(), r);
- return Vec(const_cast<Precision*>(my_data + r), num_cols(),
stride(), Slicing());
- }
-
- template<int Rstart, int Cstart, int Rlength, int Clength>
- Matrix<Rlength, Clength, Precision, typename
Slice<SliceStride>::ColMajor> slice()
- {
- Internal::CheckStaticSlice<Rows, Rstart,
Rlength>::check(num_rows());
- Internal::CheckStaticSlice<Cols, Cstart,
Clength>::check(num_cols());
- //Always pass the stride as a run-time parameter. It will be
ignored
- //by SliceHolder (above) if it is statically determined.
- return Matrix<Rlength, Clength, Precision, typename
Slice<SliceStride>::ColMajor>(my_data+Rstart + stride()*Cstart, stride(),
Slicing());
- }
-
- template<int Rstart, int Cstart, int Rlength, int Clength>
- const Matrix<Rlength, Clength, Precision, typename
Slice<SliceStride>::ColMajor> slice() const
- {
- Internal::CheckStaticSlice<Rows, Rstart,
Rlength>::check(num_rows());
- Internal::CheckStaticSlice<Cols, Cstart,
Clength>::check(num_cols());
- return Matrix<Rlength, Clength, Precision, typename
Slice<SliceStride>::ColMajor>(const_cast<Precision*>(my_data+Rstart +
stride()*Cstart), stride(), Slicing());
- }
-
- Matrix<-1, -1, Precision, typename Slice<SliceStride>::ColMajor >
slice(int rs, int cs, int rl, int cl){
- Internal::CheckDynamicSlice::check(num_rows(), rs, rl);
- Internal::CheckDynamicSlice::check(num_cols(), cs, cl);
- return Matrix<-1, -1, Precision, typename
Slice<SliceStride>::ColMajor >(my_data+rs +stride()*cs, rl, cl, stride(),
Slicing());
- }
-
- const Matrix<-1, -1, Precision, typename Slice<SliceStride>::ColMajor >
slice(int rs, int cs, int rl, int cl)const{
- Internal::CheckDynamicSlice::check(num_rows(), rs, rl);
- Internal::CheckDynamicSlice::check(num_cols(), cs, cl);
- return Matrix<-1, -1, Precision, typename
Slice<SliceStride>::ColMajor >(const_cast<Precision*>(my_data+rs +stride()*cs),
rl, cl, stride(), Slicing());
- }
-
- Matrix<Cols, Rows, Precision, typename Slice<Stride>::RowMajor> T(){
- return Matrix<Cols, Rows, Precision, typename
Slice<Stride>::RowMajor>(my_data, num_cols(), num_rows(), stride(), Slicing());
- }
-
- const Matrix<Cols, Rows, Precision, typename Slice<Stride>::RowMajor>
T() const {
- return Matrix<Cols, Rows, Precision, typename
Slice<Stride>::RowMajor>(const_cast<Precision*>(my_data), num_cols(),
num_rows(), stride(), Slicing());
- }
-};
-
-
-
Index: internal/vbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/vbase.hh,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- internal/vbase.hh 6 Mar 2009 12:19:52 -0000 1.15
+++ internal/vbase.hh 6 Mar 2009 14:51:41 -0000 1.16
@@ -110,19 +110,19 @@
return Vector<-1, Precision, SliceVBase<Stride>
>(const_cast<Precision*>(my_data + stride()*start), length, stride(),
Slicing());
}
- const Matrix<1, Size, Precision, typename Slice<Stride>::ColMajor>
as_row() const{
- return Matrix<1, Size, Precision, typename
Slice<Stride>::ColMajor>(const_cast<Precision*>(my_data), 1, Size, stride(),
Slicing());
+ const Matrix<1, Size, Precision, typename Slice<1,Stride>::Layout>
as_row() const{
+ return Matrix<1, Size, Precision, typename
Slice<1,Stride>::Layout>(const_cast<Precision*>(my_data), 1, Size, 1, stride(),
Slicing());
}
- Matrix<1, Size, Precision, typename Slice<Stride>::ColMajor> as_row(){
- return Matrix<1, Size, Precision, typename
Slice<Stride>::ColMajor>(my_data, 1, Size, stride(), Slicing());
+ Matrix<1, Size, Precision, typename Slice<1,Stride>::Layout> as_row(){
+ return Matrix<1, Size, Precision, typename
Slice<1,Stride>::Layout>(my_data, 1, Size, 1, stride(), Slicing());
}
- const Matrix<Size, 1, Precision, typename Slice<Stride>::RowMajor>
as_col() const{
- return Matrix<Size, 1, Precision, typename
Slice<Stride>::RowMajor>(const_cast<Precision*>(my_data), Size, 1, stride(),
Slicing());
+ const Matrix<Size, 1, Precision, typename Slice<Stride,1>::Layout>
as_col() const{
+ return Matrix<Size, 1, Precision, typename
Slice<Stride,1>::Layout>(const_cast<Precision*>(my_data), Size, 1, stride(), 1,
Slicing());
}
- Matrix<Size, 1, Precision, typename Slice<Stride>::RowMajor> as_col(){
- return Matrix<Size, 1, Precision, typename
Slice<Stride>::RowMajor>(my_data, Size, 1, stride(), Slicing());
+ Matrix<Size, 1, Precision, typename Slice<Stride,1>::Layout> as_col(){
+ return Matrix<Size, 1, Precision, typename
Slice<Stride,1>::Layout>(my_data, Size, 1, stride(), 1, Slicing());
}
};
Index: test/mat_test.cc
===================================================================
RCS file: /cvsroot/toon/TooN/test/mat_test.cc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- test/mat_test.cc 24 Feb 2009 18:16:12 -0000 1.5
+++ test/mat_test.cc 6 Mar 2009 14:51:41 -0000 1.6
@@ -53,6 +53,9 @@
Matrix<3,4> m;
set(m);
foo(m);
+
+ cout << m.my_data << endl;
+
Matrix<3,4,double,ColMajor> n;
set(n);
foo(n);
- [Toon-members] TooN TooN.h internal/allocator.hh internal/matr...,
Tom Drummond <=