[Top][All Lists]
[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));
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Toon-members] TooN TODO internal/mbase.hh internal/slice_erro...,
Edward Rosten <=