toon-members
[Top][All Lists]
Advanced

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

[Toon-members] TooN helpers.h internal/vbase.hh test/slice_tes...


From: Edward Rosten
Subject: [Toon-members] TooN helpers.h internal/vbase.hh test/slice_tes...
Date: Wed, 26 Aug 2009 09:51:10 +0000

CVSROOT:        /cvsroot/toon
Module name:    TooN
Changes by:     Edward Rosten <edrosten>        09/08/26 09:51:10

Modified files:
        .              : helpers.h 
        internal       : vbase.hh 
        test           : slice_test.cc 

Log message:
        Reimplemented vector project/unproject using End.
        
        Fixed bugs:
                - Added const slices for End.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/TooN/helpers.h?cvsroot=toon&r1=1.82&r2=1.83
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/vbase.hh?cvsroot=toon&r1=1.35&r2=1.36
http://cvs.savannah.gnu.org/viewcvs/TooN/test/slice_test.cc?cvsroot=toon&r1=1.5&r2=1.6

Patches:
Index: helpers.h
===================================================================
RCS file: /cvsroot/toon/TooN/helpers.h,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -b -r1.82 -r1.83
--- helpers.h   24 Aug 2009 13:25:57 -0000      1.82
+++ helpers.h   26 Aug 2009 09:51:09 -0000      1.83
@@ -98,33 +98,17 @@
        ///For a vector \e v of length \e i, return \f$[v_1, v_2, \cdots, 
v_{i-1}] / v_i \f$
        ///@param v \e v
        ///@ingroup gLinAlg
-       template<int Size, typename Precision, typename Base> inline 
Vector<Size-1, Precision> project( const Vector<Size, Precision, Base> & v){
-               return v.template slice<0,Size-1>() / v[Size-1];
-       }
-       
-       /**
-         \overload
-       */
-       template<typename Precision, typename Base> inline Vector<-1, 
Precision> project( const Vector<-1, Precision, Base> & v){
-               return v.slice(0,v.size()-1) / v[v.size()-1];
+       template<int Size, typename Precision, typename Base> inline 
Vector<(Size==Dynamic?Dynamic:Size-1), Precision> project( const Vector<Size, 
Precision, Base> & v){
+               return v.template slice<0, End<-1> >() / v[v.size() - 1];
        }
        
+       //This should probably be done with an operator to prevent an extra 
new[] for dynamic vectors.
        ///For a vector \e v of length \e i, return \f$[v_1, v_2, \cdots, 
v_{i}, 1]\f$
        ///@param v \e v
        ///@ingroup gLinAlg
-       template<int Size, typename Precision, typename Base> inline 
Vector<Size+1, Precision> unproject( const Vector<Size, Precision, Base> & v){
-               Vector<Size+1, Precision> result;
-               result.template slice<0,Size>() = v;
-               result[Size] = 1;
-               return result;
-       }
-       
-       /**
-       \overload
-       */
-       template<typename Precision, typename Base> inline Vector<-1, 
Precision> unproject( const Vector<-1, Precision, Base> & v){
-               Vector<-1, Precision> result(v.size()+1);
-               result.slice(0,v.size()) = v;
+       template<int Size, typename Precision, typename Base> inline 
Vector<(Size==Dynamic?Dynamic:Size+1), Precision> unproject( const Vector<Size, 
Precision, Base> & v){
+               Vector<(Size==Dynamic?Dynamic:Size+1), Precision> 
result(v.size()+1);
+               result.template slice<0,End<-1> >() = v;
                result[v.size()] = 1;
                return result;
        }

Index: internal/vbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/vbase.hh,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -b -r1.35 -r1.36
--- internal/vbase.hh   26 Aug 2009 09:36:37 -0000      1.35
+++ internal/vbase.hh   26 Aug 2009 09:51:09 -0000      1.36
@@ -160,6 +160,11 @@
        Vector<(Size==Dynamic?Dynamic:Size-Start+(X)), Precision, 
SliceVBase<Stride> > slice(){\
                static const int Len = (Size==Dynamic?Dynamic:Size-Start+(X));\
                return slice<Start, Len>(Start, size() - Start + (X));\
+       }\
+       template<int Start, StaticEndMarker<(X)>(*End)()> \
+       const Vector<(Size==Dynamic?Dynamic:Size-Start+(X)), Precision, 
SliceVBase<Stride> > slice() const {\
+               static const int Len = (Size==Dynamic?Dynamic:Size-Start+(X));\
+               return slice<Start, Len>(Start, size() - Start + (X));\
        }
        
        #define TOON_INTERNAL_MAKE_END_99(D0)\
@@ -194,12 +199,22 @@
                return slice(i, size()-i+e.e);
        }               
 
+       const Vector<Dynamic, Precision, SliceVBase<Stride> > slice(int i, 
Internal::DynamicEndMarker e) const
+       {               
+               return slice(i, size()-i+e.e);
+       }               
+
        //Alternate form of dynamic slicing with End:
        Vector<Dynamic, Precision, SliceVBase<Stride> > slice(int i, 
Internal::DynamicEndMarker(*)())
        {               
                return slice(i, size()-i);
        }               
 
+       const Vector<Dynamic, Precision, SliceVBase<Stride> > slice(int i, 
Internal::DynamicEndMarker(*)()) const
+       {               
+               return slice(i, size()-i);
+       }               
+
        //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.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- test/slice_test.cc  26 Aug 2009 09:36:37 -0000      1.5
+++ test/slice_test.cc  26 Aug 2009 09:51:09 -0000      1.6
@@ -23,6 +23,11 @@
        cout << u.slice(2, 3) << endl << endl;
        
        cout << project(v) << endl;
+       cout << project(u) << endl;
+       cout << project(v.slice<1,End<0> >()) << endl;
+       cout << project(u.slice<1,End<0> >()) << endl;
+       cout << unproject(v) << endl;
+       cout << unproject(u) << endl;
 
        cout << v.slice<1, End<0> >() << endl;  
        cout << u.slice<1, End<0> >() << endl;  




reply via email to

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