toon-members
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Toon-members] TooN/internal mbase.hh slice_error.hh


From: Edward Rosten
Subject: [Toon-members] TooN/internal mbase.hh slice_error.hh
Date: Mon, 24 Aug 2009 13:22:13 +0000

CVSROOT:        /cvsroot/toon
Module name:    TooN
Changes by:     Edward Rosten <edrosten>        09/08/24 13:22:13

Modified files:
        internal       : mbase.hh slice_error.hh 

Log message:
        Added generic slicing to matrices.
        
        Removed unneeded check functions from slice_error.hh

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/mbase.hh?cvsroot=toon&r1=1.32&r2=1.33
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/slice_error.hh?cvsroot=toon&r1=1.10&r2=1.11

Patches:
Index: mbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/mbase.hh,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- mbase.hh    22 May 2009 10:31:43 -0000      1.32
+++ mbase.hh    24 Aug 2009 13:22:13 -0000      1.33
@@ -161,38 +161,62 @@
        }
 
 
+       //Generic matrix slicing
+       template<int Rstart, int Cstart, int Rlength, int Clength>
+       Matrix<Rlength, Clength, Precision, 
Slice<SliceRowStride,SliceColStride> > slice(int rs, int cs, int rl, int cl){
+               Internal::CheckSlice<Rows, Rstart, Rlength>::check(num_rows(), 
rs, rl);
+               Internal::CheckSlice<Cols, Cstart, Clength>::check(num_cols(), 
cs, cl);
+
+               //Always pass the size and stride as a run-time parameter. It 
will be ignored
+               //by SliceHolder (above) if it is statically determined.
+               return Matrix<Rlength, Clength, Precision, 
Slice<SliceRowStride,SliceColStride> >(
+                      my_data+rowstride()*(Rstart==Dynamic?rs:Rstart) + 
colstride()*(Cstart==Dynamic?cs:Cstart), 
+                          Rlength==Dynamic?rl:Rlength, 
+                          Clength==Dynamic?cl:Clength, 
+                          rowstride(), colstride(), Slicing());
+       }
 
        template<int Rstart, int Cstart, int Rlength, int Clength>
-       Matrix<Rlength, Clength, Precision, 
Slice<SliceRowStride,SliceColStride> > slice()
-       {
+       const Matrix<Rlength, Clength, Precision, 
Slice<SliceRowStride,SliceColStride> > slice(int rs, int cs, int rl, int cl) 
const{
+               Internal::CheckSlice<Rows, Rstart, Rlength>::check(num_rows(), 
rs, rl);
+               Internal::CheckSlice<Cols, Cstart, Clength>::check(num_cols(), 
cs, cl);
+
                //Always pass the size and 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, 
Slice<SliceRowStride,SliceColStride> >(my_data+rowstride()*Rstart + 
colstride()*Cstart, Rlength, Clength, rowstride(), colstride(), Slicing());
+               return Matrix<Rlength, Clength, Precision, 
Slice<SliceRowStride,SliceColStride> >(
+                      
const_cast<Precision*>(my_data)+rowstride()*(Rstart==Dynamic?rs:Rstart) + 
colstride()*(Cstart==Dynamic?cs:Cstart), 
+                          Rlength==Dynamic?rl:Rlength, 
+                          Clength==Dynamic?cl:Clength, 
+                          rowstride(), colstride(), Slicing());
+       }
+
+       //Special cases of slicing
+       template<int Rstart, int Cstart, int Rlength, int Clength>
+       Matrix<Rlength, Clength, Precision, 
Slice<SliceRowStride,SliceColStride> > slice()
+       {
+               //Extra checking in the static case
+               Internal::CheckSlice<Rows, Rstart, Rlength>::check();
+               Internal::CheckSlice<Cols, Cstart, Clength>::check();
+               return slice<Rstart, Cstart, Rlength, Clength>(Rstart, Cstart, 
Rlength, Clength);
        }
 
        template<int Rstart, int Cstart, int Rlength, int Clength>
        const Matrix<Rlength, Clength, Precision, 
Slice<SliceRowStride,SliceColStride> > slice() const
        {
-               Internal::CheckStaticSlice<Rows, Rstart, 
Rlength>::check(num_rows());
-               Internal::CheckStaticSlice<Cols, Cstart, 
Clength>::check(num_cols());
-               return Matrix<Rlength, Clength, Precision, 
Slice<SliceRowStride,SliceColStride> 
>(const_cast<Precision*>(my_data+rowstride()*Rstart + colstride()*Cstart), 
Rlength, Clength, rowstride(), colstride(), Slicing());
+               Internal::CheckSlice<Rows, Rstart, Rlength>::check();
+               Internal::CheckSlice<Cols, Cstart, Clength>::check();
+               return slice<Rstart, Cstart, Rlength, Clength>(Rstart, Cstart, 
Rlength, Clength);
        }
 
        Matrix<-1, -1, Precision, Slice<SliceRowStride,SliceColStride> > 
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, 
Slice<SliceRowStride,SliceColStride> >(my_data+rowstride()*rs +colstride()*cs, 
rl, cl, rowstride(), colstride(), Slicing());
+               return slice<Dynamic, Dynamic, Dynamic, Dynamic>(rs, cs, rl, 
cl);
        }
 
        const Matrix<-1, -1, Precision, Slice<SliceRowStride,SliceColStride> > 
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, 
Slice<SliceRowStride,SliceColStride> 
>(const_cast<Precision*>(my_data+rowstride()*rs +colstride()*cs), rl, cl, 
rowstride(), colstride(), Slicing());
+               return slice<Dynamic, Dynamic, Dynamic, Dynamic>(rs, cs, rl, 
cl);
        }
 
-
+       //Other slice related functions.
        Matrix<Cols, Rows, Precision, Slice<SliceColStride,SliceRowStride> > 
T(){
                return Matrix<Cols, Rows, Precision, 
Slice<SliceColStride,SliceRowStride> >(my_data, num_cols(), num_rows(), 
colstride(), rowstride(), Slicing());
        }

Index: slice_error.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/slice_error.hh,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- slice_error.hh      24 Aug 2009 13:00:15 -0000      1.10
+++ slice_error.hh      24 Aug 2009 13:22:13 -0000      1.11
@@ -137,45 +137,6 @@
                }
        };      
 
-       template<int Size, int Start, int Length> 
-       struct CheckStaticSlice
-       {
-               static void check(int/*size*/)
-               {
-                       BadSlice<(Start < 0) || (Length < 1) || 
(Start+Length>Size)>::check();
-               }
-       };
-       
-       template<int Start, int Length> struct CheckStaticSlice<-1, Start, 
Length>{
-               static void check(int size)
-               {
-                       BadSlice<(Start < 0) || (Length < 1)>::check();
-                       if(Start + Length > size)
-                       {
-                               #ifdef TOON_TEST_INTERNALS
-                                       throw Internal::SliceError();
-                               #elif !defined TOON_NDEBUG_SLICE
-                                       std::cerr << "TooN slice out of range" 
<< std::endl;
-                                       std::abort();
-                               #endif
-                       }
-               }
-       };
-
-       struct CheckDynamicSlice{
-               static void check(int size, int start, int length){
-                       if(start < 0 || start + length > size)
-                       {
-                               #ifdef TOON_TEST_INTERNALS
-                                       throw Internal::SliceError();
-                               #elif !defined TOON_NDEBUG_SLICE
-                                       std::cerr << "TooN slice out of range" 
<< std::endl;
-                                       std::abort();
-                               #endif
-                       }
-               }
-       };
-
        #ifdef TOON_TEST_INTERNALS
                template<bool StaticBad> 
                struct BadSlice{
@@ -184,9 +145,6 @@
                        }
                };
        #endif
-
-
-
 }
 
 }




reply via email to

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