00001 #ifndef StiSortedHitIterator_HH
00002 #define StiSortedHitIterator_HH
00003 #ifdef GNU_GCC
00004 #if __GNUC__<3
00005 #define HACK_forward_iterator
00006 #endif
00007 #endif
00008 #include <vector>
00009 #include <iterator>
00010 using namespace std;
00011 #include "StiHit.h"
00012 typedef StiHit Hit_t;
00013 #include "StiDetector.h"
00014 #include "StiHitContainer.h"
00015
00021 class StiSortedHitIterator
00022 #ifndef HACK_forward_iterator
00023 : public iterator<forward_iterator_tag, Hit_t, ptrdiff_t, Hit_t*, Hit_t&>
00024 #else
00025 : public forward_iterator<Hit_t, int>
00026 #endif
00027 {
00028 public:
00030 StiSortedHitIterator();
00032 StiSortedHitIterator(StiHitContainer * hitContainer,
00033 vector<StiDetector*>::iterator firstDet,
00034 vector<StiDetector*>::iterator lastDet);
00036 StiSortedHitIterator(const StiSortedHitIterator&iter);
00038 const StiSortedHitIterator& operator=(const StiSortedHitIterator&iter);
00040 ~StiSortedHitIterator() {};
00041
00043 bool operator==(const StiSortedHitIterator& rhs);
00045 bool operator!=(const StiSortedHitIterator& rhs);
00047 StiHit& operator*();
00049 StiSortedHitIterator& operator++();
00051 StiSortedHitIterator operator++(int);
00053
00054
00055 private:
00057 StiHit * _currentHit;
00059 StiHitContainer * _hitContainer;
00061 vector<StiDetector*>::iterator _currentDet;
00063 vector<StiDetector*>::iterator _firstDet;
00065 vector<StiDetector*>::iterator _lastDet;
00067 vector<StiHit*>::iterator _currentDetHit;
00069 vector<StiHit*>::iterator _lastDetHit;
00070 };
00071
00072
00073
00075 inline const StiSortedHitIterator& StiSortedHitIterator::operator=(const StiSortedHitIterator&iter)
00076 {
00077 _currentHit = iter._currentHit;
00078 _hitContainer = iter._hitContainer;
00079 _currentDet = iter._currentDet;
00080 _firstDet = iter._firstDet;
00081 _lastDet = iter._lastDet;
00082 _currentDetHit = iter._currentDetHit;
00083 _lastDetHit = iter._lastDetHit;
00084 return *this;
00085 }
00086
00087
00090 inline bool StiSortedHitIterator::operator==(const StiSortedHitIterator& rhs)
00091 {
00092 return _currentHit==rhs._currentHit;
00093 }
00094
00097 inline bool StiSortedHitIterator::operator!=(const StiSortedHitIterator& rhs)
00098 {
00099 return _currentHit!=rhs._currentHit;
00100 }
00101
00104 inline StiHit& StiSortedHitIterator::operator*()
00105 {
00106 assert(_currentHit);
00107 return *_currentHit;
00108 }
00109
00114 inline StiSortedHitIterator& StiSortedHitIterator::operator++()
00115 {
00116
00117
00118 if (_currentHit==0)
00119 return *this;
00120
00121 ++_currentDetHit;
00122 if (_currentDetHit<_lastDetHit)
00123 {
00124 _currentHit = *_currentDetHit;
00125 }
00126 else
00127 {
00128
00129
00130 if (_currentDet<_lastDet)
00131 {
00132
00133
00134 bool go = true;
00135 while (_currentDet<_lastDet && go )
00136 {
00137 ++_currentDet;
00138 if (_currentDet<_lastDet )
00139 {
00140
00141 if (_hitContainer->hasDetector(*_currentDet)) {
00142
00143 _currentDetHit = _hitContainer->hitsBegin(*_currentDet);
00144 _lastDetHit = _hitContainer->hitsEnd(*_currentDet);
00145 if (_currentDetHit < _lastDetHit)
00146 {
00147
00148
00149 _currentHit = *_currentDetHit;
00150 go = false;
00151 }
00152 }
00153 }
00154 else
00155 {
00156
00157
00158 _currentHit = 0;
00159 _currentDet = _lastDet;
00160 _currentDetHit = _lastDetHit;
00161 }
00162 }
00163 }
00164 else
00165 {
00166 _currentHit = 0;
00167 _currentDet = _lastDet;
00168 _currentDetHit = _lastDetHit;
00169 }
00170 }
00171 return *this;
00172 }
00173
00174
00179 inline StiSortedHitIterator StiSortedHitIterator::operator++(int)
00180 {
00181 StiSortedHitIterator temp = *this;
00182 ++(*this);
00183 return temp;
00184 }
00185
00186 #endif