00001 #ifndef TRKREPITER_H 00002 #define TRKREPITER_H 00003 #include "boost/shared_ptr.hpp" 00004 #include <iterator> 00005 00006 //FIXME: only works on Linux: class TrkHitOnTrkIter : public std::iterator_traits<TrkHitOnTrk *> 00007 //FIXME: only works on Linux: class TrkHitOnTrkIter : public std::random_access_iterator<const TrkHitOnTrk, ptrdiff_t> 00008 //FIXME: only works on SunOS58: class TrkHitOnTrkIter : public std::iterator<std::random_access_iterator_tag,TrkHitOnTrk> 00009 // 00010 // 00011 //FIXME: new idea: give TrkRepIter a constructor which tells it 00012 // to iterate either of all reps, or unique ones only 00013 // (i.e. give the iterator a memory of those reps it 00014 // has already seeni, or search the vector 'in front' 00015 // of the current position?) 00016 // Furthermore, give a reference to the TrkRecoTrk vector 00017 // of sharep pointers of reps... 00018 00019 class TrkRep; 00020 00021 class TrkRepIter 00022 { 00023 public: 00024 typedef std::random_access_iterator_tag iterator_category; 00025 // typedef const TrkRep value_type; 00026 typedef TrkRep value_type; 00027 typedef ptrdiff_t difference_type; 00028 typedef value_type* pointer; 00029 typedef value_type& reference; 00030 00031 TrkRepIter(const TrkRepIter& rhs) : _l(rhs._l),_i(rhs._i) {}; 00032 00033 pointer get() const { return (*_l)[_i]; } 00034 pointer operator->() const { return get(); } 00035 reference operator*() const { return *get(); } 00036 00037 TrkRepIter& operator-=(int i) { _i-=i; return *this; } 00038 TrkRepIter& operator+=(int i) { _i+=i; return *this; } 00039 TrkRepIter& operator--() { --_i; return *this; } // prefix -- 00040 TrkRepIter& operator++() { ++_i; return *this; } // prefix ++ 00041 00042 TrkRepIter operator--(int) { TrkRepIter x(*this); --_i; return x; } // postfix -- 00043 TrkRepIter operator++(int) { TrkRepIter x(*this); ++_i; return x; } // postfix ++ 00044 00045 00046 ptrdiff_t operator-(const TrkRepIter& i) const { return _i - i._i; } 00047 bool operator==(const TrkRepIter& i) const { return _l.get() == i._l.get() 00048 && _i == i._i; } 00049 bool operator!=(const TrkRepIter& i) const { return !operator==(i); } 00050 00051 private: 00052 friend class TrkRecoTrk; // allow TrkRecoTrk to create TrkRepIters -- and nobody else! 00053 typedef std::vector<pointer> TRL; 00054 TrkRepIter(boost::shared_ptr<TRL> l,int i) : _l(l),_i(i) {}; 00055 00056 boost::shared_ptr< std::vector<pointer> > _l; 00057 unsigned _i; 00058 }; 00059 #endif