[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Toon-members] TooN TooN.h internal/vbase.hh test/slice_test.cc
From: |
Edward Rosten |
Subject: |
[Toon-members] TooN TooN.h internal/vbase.hh test/slice_test.cc |
Date: |
Tue, 25 Aug 2009 16:58:28 +0000 |
CVSROOT: /cvsroot/toon
Module name: TooN
Changes by: Edward Rosten <edrosten> 09/08/25 16:58:27
Modified files:
. : TooN.h
internal : vbase.hh
test : slice_test.cc
Log message:
Slicing with End.
***EXPERIMENTAL***
***THIS WILL CHANGE***
It is very hard to get the syntax acceptable.
The following examples all work:
cout << v.slice<1, End<0> >() << endl;
cout << v.slice<1, End<-1> >() << endl;
cout << v.slice(2, End()) << endl;
cout << v.slice(2, End(-1)) << endl;
Note the re-use of End.
End<-10> does not work, since every different integer has to be
enumerated
by hand.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/TooN/TooN.h?cvsroot=toon&r1=1.51&r2=1.52
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/vbase.hh?cvsroot=toon&r1=1.31&r2=1.32
http://cvs.savannah.gnu.org/viewcvs/TooN/test/slice_test.cc?cvsroot=toon&r1=1.2&r2=1.3
Patches:
Index: TooN.h
===================================================================
RCS file: /cvsroot/toon/TooN/TooN.h,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -b -r1.51 -r1.52
--- TooN.h 18 Aug 2009 14:15:39 -0000 1.51
+++ TooN.h 25 Aug 2009 16:58:27 -0000 1.52
@@ -232,6 +232,32 @@
///Template size value used to indicate dynamically sized vectors and
matrices.
static const int Dynamic = -1;
+ namespace Internal
+ {
+ template<int I> struct KnownEndMarker
+ {
+ static const int End=I;
+ };
+
+ struct EndMarker
+ {
+ int e;
+ };
+ };
+
+ template<int I> Internal::KnownEndMarker<I> End();
+
+ inline Internal::EndMarker End()
+ {
+ Internal::EndMarker end = {0};
+ return end;
+ }
+ inline Internal::EndMarker End(int e)
+ {
+ Internal::EndMarker end = {e};
+ return end;
+ }
+
///All TooN classes default to using this precision for computations
and storage.
typedef double DefaultPrecision;
}
Index: internal/vbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/vbase.hh,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -b -r1.31 -r1.32
--- internal/vbase.hh 25 Aug 2009 15:30:16 -0000 1.31
+++ internal/vbase.hh 25 Aug 2009 16:58:27 -0000 1.32
@@ -133,6 +133,8 @@
return Vector<Length, Precision, SliceVBase<Stride>
>(const_cast<Precision*>(my_data) + stride() * (Start==Dynamic?start:Start),
Length==Dynamic?length:Length, stride(), Slicing());
}
+
+
//Special case slice operations
template<int Start, int Length> Vector<Length, Precision,
SliceVBase<Stride> > slice(){
Internal::CheckSlice<Size, Start, Length>::check();
@@ -152,6 +154,37 @@
return slice<Dynamic, Dynamic>(start, length);
}
+ //Vector slice with End
+ //eg:
+ //.slice<1, End<> >()
+ template<int Start, int End>
+ Vector<(Size==Dynamic?Dynamic:Size-Start+End), Precision,
SliceVBase<Stride> > sliceend(){
+ static const int Len = (Size==Dynamic?Dynamic:Size-Start+End);
+ return slice<Start, Len>();
+ }
+
+ #define TOON_INTERNAL_MAKE_END(X)\
+ template<int Start, KnownEndMarker<X>(*End)()> \
+ Vector<(Size==Dynamic?Dynamic:Size-Start-X), Precision,
SliceVBase<Stride> > slice(){\
+ return sliceend<Start, X>();\
+ }
+
+ TOON_INTERNAL_MAKE_END(0);
+ TOON_INTERNAL_MAKE_END(1);
+ TOON_INTERNAL_MAKE_END(2);
+ TOON_INTERNAL_MAKE_END(3);
+ TOON_INTERNAL_MAKE_END(4);
+ TOON_INTERNAL_MAKE_END(5);
+ TOON_INTERNAL_MAKE_END(6);
+ TOON_INTERNAL_MAKE_END(7);
+ TOON_INTERNAL_MAKE_END(8);
+ TOON_INTERNAL_MAKE_END(9);
+
+ Vector<Dynamic, Precision, SliceVBase<Stride> > slice(int i,
Internal::EndMarker e)
+ {
+ return slice(i, size()-i+e.e);
+ }
+
//Other slices below
const Matrix<1, Size, Precision, Slice<1,Stride> > as_row() const{
return Matrix<1, Size, Precision, Slice<1,Stride>
>(const_cast<Precision*>(my_data), 1, size(), 1, stride(), Slicing());
Index: test/slice_test.cc
===================================================================
RCS file: /cvsroot/toon/TooN/test/slice_test.cc,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- test/slice_test.cc 25 Aug 2009 15:27:32 -0000 1.2
+++ test/slice_test.cc 25 Aug 2009 16:58:27 -0000 1.3
@@ -24,4 +24,8 @@
cout << project(v) << endl;
+ cout << v.slice<1, End<0> >() << endl;
+ cout << v.slice<1, End<-1> >() << endl;
+ cout << v.slice(2, End()) << endl;
+ cout << v.slice(2, End(-1)) << endl;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Toon-members] TooN TooN.h internal/vbase.hh test/slice_test.cc,
Edward Rosten <=