[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: |
Edward Rosten |
Subject: |
[Toon-members] TooN TooN.h internal/allocator.hh internal/matr... |
Date: |
Thu, 26 Mar 2009 14:31:48 +0000 |
CVSROOT: /cvsroot/toon
Module name: TooN
Changes by: Edward Rosten <edrosten> 09/03/26 14:31:47
Modified files:
. : TooN.h
internal : allocator.hh matrix.hh mbase.hh
test : test_foreign.cc
Log message:
Rewritten the slicing interface.
Now, matrix can pass on a generic SliceSpec object which will hold data
needed
to perform a slice. This is forwarded by the Base class on to
GenericMBase.
However, in GenericMBase, a mechanism is used to block the system to
silently
ignore superfluous data.
There is no public interface yet.
test/test_foreign.cc demos the private interface. Exacly one class in
SliceSpec
will allow the code to compile.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/TooN/TooN.h?cvsroot=toon&r1=1.26&r2=1.27
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/allocator.hh?cvsroot=toon&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/matrix.hh?cvsroot=toon&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/mbase.hh?cvsroot=toon&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/TooN/test/test_foreign.cc?cvsroot=toon&r1=1.1&r2=1.2
Patches:
Index: TooN.h
===================================================================
RCS file: /cvsroot/toon/TooN/TooN.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- TooN.h 25 Mar 2009 22:19:38 -0000 1.26
+++ TooN.h 26 Mar 2009 14:31:43 -0000 1.27
@@ -20,6 +20,7 @@
struct StaticSliceError{};
struct SizeMismatch{};
struct StaticSizeMismatch{};
+
}
#endif
@@ -36,11 +37,38 @@
static const unsigned int max_bytes_on_stack=1000;
struct Slicing{};
template<int RowStride, int ColStride> struct Slice;
+
+ struct SpecifySize{};
+ struct SpecifyStride{};
+ struct SpecifyRows{};
+ struct SpecifyCols{};
+
+ struct NoIgnore{};
+
+ //Some helper classes to label integer data with a specific
meaning,
+ //for creating slices of external data.
+ struct Spec_____{ };
+ struct Spec____C{int cs;};
+ struct Spec___R_{int rs ;};
+ struct Spec___RC{int rs, cs;};
+ struct Spec__C__{int c ;};
+ struct Spec__C_C{int c , cs;};
+ struct Spec__CR_{int c, rs ;};
+ struct Spec__CRC{int c, rs, cs;};
+ struct Spec_R___{int r ;};
+ struct Spec_R__C{int r, cs;};
+ struct Spec_R_R_{int r, rs ;};
+ struct Spec_R_RC{int r, rs, cs;};
+ struct Spec_RC__{int r, c ;};
+ struct Spec_RC_C{int r, c, cs;};
+ struct Spec_RCR_{int r, c, rs ;};
+ struct Spec_RCRC{int r, c, rs, cs;};
}
template<int Size, class Precision, class Base> struct Vector;
template<int Rows, int Cols, class Precision, class Base> struct Matrix;
template<typename T> class Operator;
+ template<typename T> class SliceSpec: public T{};
#include <TooN/internal/allocator.hh>
Index: internal/allocator.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/allocator.hh,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- internal/allocator.hh 25 Mar 2009 22:19:39 -0000 1.19
+++ internal/allocator.hh 26 Mar 2009 14:31:45 -0000 1.20
@@ -256,10 +256,8 @@
Precision* const my_data;
const int my_cols;
- MatrixSlice(Precision* d, int r, int c)
- :my_data(d),my_cols(c)
- {
- }
+ MatrixSlice(Precision* d, int r, int c) :my_data(d),my_cols(c) { }
+ MatrixSlice(Precision* d, int c, const Internal::SpecifyCols&)
:my_data(d),my_cols(c) { }
int num_rows() const {
return Rows;
@@ -275,10 +273,8 @@
Precision* const my_data;
const int my_rows;
- MatrixSlice(Precision* d, int r, int c)
- :my_data(d),my_rows(r)
- {
- }
+ MatrixSlice(Precision* d, int r, int c) :my_data(d),my_rows(r) { }
+ MatrixSlice(Precision* d, int r, const Internal::SpecifyRows&)
:my_data(d),my_rows(r) { }
int num_rows() const {
return my_rows;
@@ -331,6 +327,10 @@
StrideHolder(int s)
:my_stride(s){}
+ //This constructor is not allowed to ignore the argument
+ StrideHolder(int s, const Internal::NoIgnore&)
+ :my_stride(s){}
+
const int my_stride;
int stride() const {
return my_stride;
@@ -343,6 +343,9 @@
RowStrideHolder(int i)
:StrideHolder<S>(i){}
+ RowStrideHolder(int i, const Internal::NoIgnore& n)
+ :StrideHolder<S>(i, n){}
+
RowStrideHolder()
{}
};
@@ -353,6 +356,9 @@
ColStrideHolder(int i)
:StrideHolder<S>(i){}
+ ColStrideHolder(int i, const Internal::NoIgnore& n)
+ :StrideHolder<S>(i, n){}
+
ColStrideHolder()
{}
};
Index: internal/matrix.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/matrix.hh,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- internal/matrix.hh 25 Mar 2009 21:47:01 -0000 1.19
+++ internal/matrix.hh 26 Mar 2009 14:31:46 -0000 1.20
@@ -24,12 +24,10 @@
:Layout::template Layout<Rows,Cols,Precision>(rows, cols)
{}
- Matrix(Precision* p, int rows, int cols)
- :Layout::template Layout<Rows,Cols,Precision>(p, rows, cols)
- {}
-
- Matrix(Precision* p)
- :Layout::template Layout<Rows,Cols,Precision>(p)
+ // Pass on a generic struct holding data about a slice
+ template<class C>
+ Matrix(Precision* data, const SliceSpec<C>& slice)
+ :Layout::template Layout<Rows,Cols,Precision>(data, slice)
{}
//See vector.hh and allocator.hh for details about why the
Index: internal/mbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/mbase.hh,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- internal/mbase.hh 25 Mar 2009 21:47:01 -0000 1.21
+++ internal/mbase.hh 26 Mar 2009 14:31:47 -0000 1.22
@@ -17,7 +17,7 @@
{
//Optional constructors.
Layout(Precision* p, int rowstride, int colstride)
-
:GenericMBase<Rows,Cols,Precision,RowStride,ColStride,MatrixSlice<Rows, Cols,
Precision> >(p, rowstride, colstride)
+
:GenericMBase<Rows,Cols,Precision,RowStride,ColStride,MatrixSlice<Rows, Cols,
Precision> >(p, rowstride, colstride, Internal::SpecifyStride())
{
}
@@ -61,10 +61,17 @@
:Mem(p)
{}
+ //Both size and stride require two integer parameters.
+ //In the case where only one is required, the meaning is
+ //ambiguous. Therefore a tag is used to specify the meaning.
+ GenericMBase(Precision* p, int r, int c, Internal::SpecifySize)
+ :Mem(p, r, c)
+ {}
- GenericMBase(Precision* p, int rs, int cs)
+ GenericMBase(Precision* p, int rs, int cs, Internal::SpecifyStride)
:Mem(p),RowStrideHolder<RowStride>(rs),ColStrideHolder<ColStride>(cs) {}
+
GenericMBase(Precision* p, int r, int c, int rowstride, int colstride)
:Mem(p, r, c),
RowStrideHolder<RowStride>(rowstride),
@@ -74,6 +81,25 @@
GenericMBase(int r, int c)
:Mem(r, c) {}
+ //Unpack slice specifications in to specific constructors
+ //These slice specifications are not allowed to ignore superfluous data.
+ GenericMBase(Precision* p, const Spec_____& s):Mem(p
)
{}
+ GenericMBase(Precision* p, const Spec____C& s):Mem(p
)
,ColStrideHolder<ColStride>(s.cs,Internal::NoIgnore()){}
+ GenericMBase(Precision* p, const Spec___R_& s):Mem(p
), RowStrideHolder<RowStride>(s.rs, Internal::NoIgnore())
{}
+ GenericMBase(Precision* p, const Spec___RC& s):Mem(p
), RowStrideHolder<RowStride>(s.rs,
Internal::NoIgnore()),ColStrideHolder<ColStride>(s.cs,Internal::NoIgnore()){}
+ GenericMBase(Precision* p, const Spec__C__& s):Mem(p, s.c
,SpecifyCols())
{}
+ GenericMBase(Precision* p, const Spec__C_C& s):Mem(p, s.c,
SpecifyCols())
,ColStrideHolder<ColStride>(s.cs,Internal::NoIgnore()){}
+ GenericMBase(Precision* p, const Spec__CR_& s):Mem(p, s.c,
SpecifyCols()), RowStrideHolder<RowStride>(s.rs, Internal::NoIgnore())
{}
+ GenericMBase(Precision* p, const Spec__CRC& s):Mem(p, s.c,
SpecifyCols()), RowStrideHolder<RowStride>(s.rs,
Internal::NoIgnore()),ColStrideHolder<ColStride>(s.cs,Internal::NoIgnore()){}
+ GenericMBase(Precision* p, const Spec_R___& s):Mem(p, s.r,
SpecifyRows())
{}
+ GenericMBase(Precision* p, const Spec_R__C& s):Mem(p, s.r,
SpecifyRows())
,ColStrideHolder<ColStride>(s.cs,Internal::NoIgnore()){}
+ GenericMBase(Precision* p, const Spec_R_R_& s):Mem(p, s.r,
SpecifyRows()), RowStrideHolder<RowStride>(s.rs, Internal::NoIgnore())
{}
+ GenericMBase(Precision* p, const Spec_R_RC& s):Mem(p, s.r,
SpecifyRows()), RowStrideHolder<RowStride>(s.rs,
Internal::NoIgnore()),ColStrideHolder<ColStride>(s.cs,Internal::NoIgnore()){}
+ GenericMBase(Precision* p, const Spec_RC__& s):Mem(p, s.r, s.c
)
{}
+ GenericMBase(Precision* p, const Spec_RC_C& s):Mem(p, s.r, s.c
)
,ColStrideHolder<ColStride>(s.cs,Internal::NoIgnore()){}
+ GenericMBase(Precision* p, const Spec_RCR_& s):Mem(p, s.r, s.c
), RowStrideHolder<RowStride>(s.rs, Internal::NoIgnore())
{}
+ GenericMBase(Precision* p, const Spec_RCRC& s):Mem(p, s.r, s.c
), RowStrideHolder<RowStride>(s.rs,
Internal::NoIgnore()),ColStrideHolder<ColStride>(s.cs,Internal::NoIgnore()){}
+
using Mem::my_data;
using Mem::num_cols;
using Mem::num_rows;
@@ -184,37 +210,69 @@
// Helper classes for matrices constructed as references to foreign data
//
-
-struct RowMajorContigRef
+namespace Reference
{
+
+ struct RowMajor
+ {
template<int Rows, int Cols, class Precision> struct Layout: public
Internal::GenericMBase<Rows, Cols, Precision, (Rows==-1?-2:Rows), 1,
Internal::MatrixSlice<Rows, Cols, Precision> >
{
- //Optional constructors.
-
+ template<class T> Layout(Precision* p, SliceSpec<T>
spec)
+ :Internal::GenericMBase<Rows, Cols, Precision,
(Rows==-1?-2:Rows), 1, Internal::MatrixSlice<Rows, Cols, Precision> >(p, spec)
+ {
+ }
+ };
+ };
+/*
+ struct ColMajor
+ {
+ template<int Rows, int Cols, class Precision> struct Layout:
public Internal::GenericMBase<Rows, Cols, Precision, 1, (Rows==-1?-2:Rows),
Internal::MatrixSlice<Rows, Cols, Precision> >
+ {
+ //Size fixed. Only data required.
Layout(Precision* p)
- :Internal::GenericMBase<Rows, Cols, Precision,
(Rows==-1?-2:Rows), 1, Internal::MatrixSlice<Rows, Cols, Precision> >(p)
+ :Internal::GenericMBase<Rows, Cols, Precision, 1,
(Rows==-1?-2:Rows), Internal::MatrixSlice<Rows, Cols, Precision> >(p)
{
}
+ //Size dynamic: size and data needed.
Layout(Precision* p, int rows, int cols)
- :Internal::GenericMBase<Rows, Cols, Precision, (Rows == -1 ? -2
: Rows), 1, Internal::MatrixAlloc<Rows, Cols, Precision> >(p, rows, cols)
+ :Internal::GenericMBase<Rows, Cols, Precision, 1, (Rows
== -1 ? -2 : Rows), Internal::MatrixAlloc<Rows, Cols, Precision> >(p, rows,
cols, Internal::SpecifySize())
{}
};
-};
+ };
-struct ColMajorContigRef
-{
- template<int Rows, int Cols, class Precision> struct Layout: public
Internal::GenericMBase<Rows, Cols, Precision, 1, (Rows==-1?-2:Rows),
Internal::MatrixSlice<Rows, Cols, Precision> >
+
+ template<int Stride=-1> struct ColMajorStride
+ {
+ template<int Rows, int Cols, class Precision> struct Layout:
public Internal::GenericMBase<Rows, Cols, Precision, 1, Stride,
Internal::MatrixSlice<Rows, Cols, Precision> >
{
- //Optional constructors.
+ //Size and stride fixed. Only data required.
Layout(Precision* p)
- :Internal::GenericMBase<Rows, Cols, Precision, 1,
(Rows==-1?-2:Rows), Internal::MatrixSlice<Rows, Cols, Precision> >(p)
+ :Internal::GenericMBase<Rows, Cols, Precision, 1,
Stride, Internal::MatrixSlice<Rows, Cols, Precision> >(p)
+ {
+ }
+
+ //Size fixed. Data and stride required.
+ Layout(Precision* p, int stride)
+ :Internal::GenericMBase<Rows, Cols, Precision, 1,
Stride, Internal::MatrixSlice<Rows, Cols, Precision> >(p, 1, stride,
Internal::SpecifySize())
{
}
+ //Stride fixed. Data and size required.
Layout(Precision* p, int rows, int cols)
- :Internal::GenericMBase<Rows, Cols, Precision, 1, (Rows == -1 ?
-2 : Rows), Internal::MatrixAlloc<Rows, Cols, Precision> >(p, rows, cols)
+ :Internal::GenericMBase<Rows, Cols, Precision, 1,
Stride, Internal::MatrixAlloc<Rows, Cols, Precision> >(p, rows, cols,
Internal::SpecifySize())
+ {}
+
+ //Dynamic: Stride, data and size required.
+ Layout(Precision* p, int rows, int cols, int stride)
+ :Internal::GenericMBase<Rows, Cols, Precision, 1,
Stride, Internal::MatrixAlloc<Rows, Cols, Precision> >(p, rows, cols, 1, stride)
{}
};
-};
+ };*/
+}
+
+
+
+
+
Index: test/test_foreign.cc
===================================================================
RCS file: /cvsroot/toon/TooN/test/test_foreign.cc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- test/test_foreign.cc 25 Mar 2009 21:47:01 -0000 1.1
+++ test/test_foreign.cc 26 Mar 2009 14:31:47 -0000 1.2
@@ -8,11 +8,13 @@
{
double data[]={1, 2, 3, 4};
+ SliceSpec<Internal::Spec_____> spec;
+
Matrix<2> m = Identity;
cout << m << endl;
- Matrix<2, 2, double, RowMajorContigRef> n(data);
+ Matrix<2, 2, double, Reference::RowMajor> n(data, spec);
cout << n << endl;