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