toon-members
[Top][All Lists]
Advanced

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

[Toon-members] TooN TODO internal/mbase.hh internal/slice_erro...


From: Edward Rosten
Subject: [Toon-members] TooN TODO internal/mbase.hh internal/slice_erro...
Date: Wed, 11 Feb 2009 18:04:26 +0000

CVSROOT:        /cvsroot/toon
Module name:    TooN
Changes by:     Edward Rosten <edrosten>        09/02/11 18:04:25

Modified files:
        .              : TODO 
        internal       : mbase.hh slice_error.hh vbase.hh 
        test           : vec_test.cc 

Log message:
        Bounds and slice checking.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/TooN/TODO?cvsroot=toon&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/mbase.hh?cvsroot=toon&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/slice_error.hh?cvsroot=toon&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/vbase.hh?cvsroot=toon&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/TooN/test/vec_test.cc?cvsroot=toon&r1=1.3&r2=1.4

Patches:
Index: TODO
===================================================================
RCS file: /cvsroot/toon/TooN/TODO,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- TODO        11 Feb 2009 14:12:06 -0000      1.6
+++ TODO        11 Feb 2009 18:04:25 -0000      1.7
@@ -1,7 +1,3 @@
-bounds checking for matrices
-slice checking for matrices
-bounds checking for vectors
-slice checking for vectors
 .as_row() and .as_col() for vectors
 matrix operators
 iterators

Index: internal/mbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/mbase.hh,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- internal/mbase.hh   11 Feb 2009 14:12:06 -0000      1.11
+++ internal/mbase.hh   11 Feb 2009 18:04:25 -0000      1.12
@@ -179,10 +179,12 @@
        typedef Vector<Cols, Precision, SliceVBase<Cols, 1, Precision> > Vec;
        
        Vec operator[](int r) {
+               Internal::check_index(num_rows(), r);
                return Vec(my_data + stride()* r, num_cols(), 1, 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());
        }
 
@@ -191,20 +193,28 @@
        {
                //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());
        }
 
        template<int Rstart, int Cstart, int Rlength, int Clength>
        const Matrix<Rlength, Clength, Precision, typename 
Slice<SliceStride>::RowMajor> 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());
        }
 
        Matrix<-1, -1, Precision, typename Slice<SliceStride>::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());
        }
 
        const Matrix<-1, -1, Precision, typename Slice<SliceStride>::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());
        }
 
@@ -274,16 +284,20 @@
        
        typedef Vector<Cols, Precision, SliceVBase<Cols, Stride, Precision> > 
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());
@@ -292,14 +306,20 @@
        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());
        }
 

Index: internal/slice_error.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/slice_error.hh,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- internal/slice_error.hh     13 Jan 2009 13:31:32 -0000      1.4
+++ internal/slice_error.hh     11 Feb 2009 18:04:25 -0000      1.5
@@ -8,22 +8,33 @@
                static void check(){}
        };
 
-       template<int Size=-1, int Start=2147483647, int Length=-1> 
-       struct CheckSlice
+       template<int Size, int Start, int Length> 
+       struct CheckStaticSlice
        {
-               static void check()
+               static void check(int/*size*/)
                {
-                       BadSlice<(Start < 0) || (Start+Length>Size)>::check();
+                       BadSlice<(Start < 0) || (Length < 1) || 
(Start+Length>Size)>::check();
                }
        };      
 
-       template<int Start, int Length> 
-       struct CheckSlice<-1, Start, Length>
+       template<int Start, int Length> struct CheckStaticSlice<-1, Start, 
Length>{
+               static void check(int size)
        {
-               static void check(int size, int start, int length)
+                       BadSlice<(Start < 0) || (Length < 1)>::check();
+                       if(Start + Length > size)
                {
-                       BadSlice<(Start != 2147483647 && Start < 0)>::check();
+                               #ifdef TOON_TEST_INTERNALS
+                                       throw Internal::SliceError();
+                               #else
+                                       std::cerr << "Toon slice out of range 
(static slice, synamic vector)" << 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

Index: internal/vbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/vbase.hh,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- internal/vbase.hh   11 Feb 2009 14:12:06 -0000      1.10
+++ internal/vbase.hh   11 Feb 2009 18:04:25 -0000      1.11
@@ -65,31 +65,38 @@
        }
 
        using Mem::my_data;
+       using Mem::size;
 
        Precision& operator[](int i) {
+               Internal::check_index(size(), i);
                return my_data[i * stride()];
        }
 
        const Precision& operator[](int i) const {
+               Internal::check_index(size(), i);
                return my_data[i * stride()];
        }
 
 
        template<int Start, int Length> 
        Vector<Length, Precision, SliceVBase<Length, Stride, Precision> > 
slice(){
+               Internal::CheckStaticSlice<Size, Start, Length>::check(size());
                return Vector<Length, Precision, SliceVBase<Length, Stride, 
Precision> >(my_data + stride()*Start, stride(), Slicing());
        }
 
        template<int Start, int Length> 
        const Vector<Length, Precision, SliceVBase<Length, Stride, Precision> > 
slice() const {
+               Internal::CheckStaticSlice<Size, Start, Length>::check(size());
                return Vector<Length, Precision, SliceVBase<Length, Stride, 
Precision> >(const_cast<Precision*>(my_data + stride()*Start), stride(), 
Slicing());
        }
 
        Vector<-1, Precision, SliceVBase<-1, Stride, Precision> > slice(int 
start, int length){
+               Internal::CheckDynamicSlice::check(size(), start, length);
                return Vector<-1, Precision, SliceVBase<-1, Stride, Precision> 
>(my_data + stride()*start, length, stride(), Slicing());
        }
 
        const Vector<-1, Precision, SliceVBase<-1, Stride, Precision> > 
slice(int start, int length) const {
+               Internal::CheckDynamicSlice::check(size(), start, length);
                return Vector<-1, Precision, SliceVBase<-1, Stride, Precision> 
>(const_cast<Precision*>(my_data + stride()*start), length, stride(), 
Slicing());
        }
 };

Index: test/vec_test.cc
===================================================================
RCS file: /cvsroot/toon/TooN/test/vec_test.cc,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- test/vec_test.cc    13 Jan 2009 13:31:32 -0000      1.3
+++ test/vec_test.cc    11 Feb 2009 18:04:25 -0000      1.4
@@ -119,6 +119,37 @@
 }
 
 
+#define test_index(...) test_index_(__LINE__, __VA_ARGS__)
+template<class C> void test_index_(int func_lineno, C v)
+{
+       TRY{
+               v[-2];
+       }
+       EXPECT(BadIndex);
+
+       TRY{
+               v[-1];
+       }
+       EXPECT(BadIndex);
+
+       TRY{
+               v[0];
+       }
+       EXPECT(NoError);
+
+       TRY{
+               v[1];
+       }
+       EXPECT(NoError);
+
+       TRY{
+               v[2];
+       }
+       EXPECT(BadIndex);
+}
+
+
+
 int main()
 {
        test_static_static_slices(Vector<2>());
@@ -138,4 +169,7 @@
 
        test_static_dynamic_slices(Vector<>(4).slice(0,2));
        test_dynamic_slices(Vector<>(4).slice(0,2));
+
+       test_index(Vector<2>());
+       test_index(Vector<>(2));
 }




reply via email to

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