Main Page   Namespace List   Compound List   File List   Compound Members  

Slice_iter.h

Go to the documentation of this file.
00001 #ifndef ATLFAST_SLICEITER_H
00002 #define ATLFAST_SLICEITER_H
00003 #include <valarray>
00004 
00005 //=================================================
00006 //
00007 // Slice_iter
00008 //
00009 //  from Sjoustrup's "the C++ programming language" ch 22.4.6
00010 //
00011 
00012 
00013 namespace Atlfast {
00014   using std::valarray;
00015   using std::slice;
00016 
00017   template<class T> class Slice_iter{
00018     valarray<T>* v;
00019     slice s;
00020     size_t curr;   //index of current element
00021     T& ref(size_t i) const {return (*v)[s.start()+i*s.stride()];}
00022   public:
00023     Slice_iter(valarray<T>* vv, slice ss): v(vv), s(ss), curr(0){}
00024     Slice_iter end() const{
00025       Slice_iter t = *this;
00026       t.curr=s.size();
00027       return t;
00028     }
00029     Slice_iter& operator++(){curr++; return *this;}
00030     Slice_iter  operator++(int){Slice_iter t=*this; curr++; return t;}
00031     
00032     T& operator[] (size_t i) {return ref(i); }    //C style subscript  
00033     T& operator() (size_t i) {return ref(i); }    //Fortran style subscript  
00034     T& operator*()           {return ref(curr); } //current element
00035 
00036     friend
00037       bool operator==(const Slice_iter<T>& p, const Slice_iter<T>& q){
00038       //      bool operator==<>(const Slice_iter<T>& p, const Slice_iter<T>& q){
00039       return 
00040         p.curr==q.curr && 
00041         p.s.stride()==q.s.stride() && 
00042         p.s.start() == q.s.start();
00043     }
00044     
00045     friend
00046       bool operator!=(const Slice_iter<T>& p, const Slice_iter<T>& q){
00047       //      bool operator!=<>(const Slice_iter<T>& p, const Slice_iter<T>& q){
00048       return  (!p==q);
00049     }
00050     
00051     friend
00052       bool operator< (const Slice_iter<T>& p, const Slice_iter<T>& q){
00053       //      bool operator< <>(const Slice_iter<T>& p, const Slice_iter<T>& q){
00054       return 
00055         p.curr<q.curr && 
00056         p.s.stride() == q.s.stride() && 
00057         p.s.start()  == q.s.start();
00058     }
00059     
00060   };
00061 }//namespace
00062 #endif
00063 

Generated on Wed May 1 14:43:49 2002 for AtlfastUtils by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001