00001 #ifndef ATLFAST_SLICEITER_H
00002 #define ATLFAST_SLICEITER_H
00003 #include <valarray>
00004
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 Slice_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 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); }
00033 T& operator() (size_t i) {return ref(i); }
00034 T& operator*() {return ref(curr); }
00035
00036 friend
00037 bool operator==(const Slice_iter<T>& p, const Slice_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 bool operator!=(const Slice_iter<T>& p, const Slice_iter<T>& q){
00047
00048 return (!p==q);
00049 }
00050
00051 friend
00052 bool operator< (const Slice_iter<T>& p, const Slice_iter<T>& 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