toon-members
[Top][All Lists]
Advanced

[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;    
 }




reply via email to

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