toon-members
[Top][All Lists]
Advanced

[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;
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]