00001 #ifndef ATLFAST_CSLICEITER_H
00002 #define ATLFAST_CSLICEITER_H
00003 #include <valarray>
00004 #include <cstddef>
00005
00006
00007
00008
00009
00010
00011
00012
00013 namespace Atlfast {
00014 using std::valarray;
00015 using std::slice;
00016
00017 template<class T> class Cslice_iter{
00018 valarray<T>* v;
00019 slice s;
00020 size_t curr;
00021 T& ref(size_t i) const {return (*v)[s.start()+i*s.stride()];}
00022 public:
00023 Cslice_iter(valarray<T>* vv, slice ss): v(vv), s(ss), curr(0){}
00024 Cslice_iter end() const{
00025 Cslice_iter t = *this;
00026 t.curr=s.size();
00027 return t;
00028 }
00029 const Cslice_iter& operator++(){curr++; return *this;}
00030 Cslice_iter operator++(int){Cslice_iter t=*this; curr++; return t;}
00031
00032 const T& operator[] (size_t i) const {return ref(i); }
00033 const T& operator() (size_t i) const {return ref(i); }
00034 const T& operator*() const {return ref(curr); }
00035
00036 friend
00037 bool operator == (const Cslice_iter<T>& p, const Cslice_iter<T>& q){
00038
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
00047 bool operator != (const Cslice_iter& p, const Cslice_iter& q){
00048 return (!p==q);
00049 }
00050
00051 friend
00052 bool operator < (const Cslice_iter& p, const Cslice_iter& q){
00053
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 }
00062 #endif
00063
00064
00065
00066
00067