00001 #ifndef DCHAIN_WHOLECANDIDATEITR_H 00002 #define DCHAIN_WHOLECANDIDATEITR_H 00003 // -*- C++ -*- 00004 // 00005 // Package: DChain 00006 // Module: WholeCandidateItr 00007 // 00008 // Description: a const Iterator though whole of LabeledCandidateList 00009 // 00010 // Usage: 00011 // <usage> 00012 // 00013 // Author: Simon Patton 00014 // Created: Wed Sep 11 21:51:25 EDT 1996 00015 // $Id: WholeCandidateItr.h,v 1.1.1.1 2009/03/03 06:06:56 maqm Exp $ 00016 // 00017 // Revision history 00018 // 00019 // $Log: WholeCandidateItr.h,v $ 00020 // Revision 1.1.1.1 2009/03/03 06:06:56 maqm 00021 // first import of DecayChain 00022 // 00023 // Revision 1.1 2006/01/11 20:28:18 cdj 00024 // massive class renaming, addition of [] for selection and unit tests 00025 // 00026 // 00027 00028 // system include files 00029 #include <iterator> 00030 00031 // user include files 00032 #include "DecayChain/Iterator/candidateitr.h" // distance 00033 #include "DecayChain/Element/LabeledCandidate.h" 00034 #include "DecayChain/List/IndexedLabeledCandidates.h" 00035 00036 00037 // forward declarations 00038 //template < class CandidateClass > class IndexedLabeledCandidates ; 00039 namespace dchain { 00040 00041 //template < class CandidateClass > class LabeledCandidate ; 00042 template < class CandidateClass > class LabeledCandidateList ; 00043 00044 template < class CandidateClass > 00045 class WholeCandidateItr 00046 { 00047 // friend classses and functions 00048 friend class LabeledCandidateList< CandidateClass > ; 00049 00050 public: 00051 // constants, enums and typedefs 00052 typedef const LabeledCandidate<CandidateClass> value_type; 00053 typedef dchain::candidateitr::size_type distance_type; 00054 typedef dchain::candidateitr::size_type size_type; 00055 typedef dchain::candidateitr::difference_type difference_type; 00056 typedef std::random_access_iterator_tag iterator_category; 00057 typedef const LabeledCandidate<CandidateClass>* pointer; 00058 typedef const LabeledCandidate<CandidateClass>& reference; 00059 00060 00061 // Constructors and destructor 00062 WholeCandidateItr( const WholeCandidateItr< CandidateClass >& aOtherItr ) ; 00063 virtual ~WholeCandidateItr() {} 00064 00065 // assignment operator(s) 00066 const WholeCandidateItr& operator=( const WholeCandidateItr< CandidateClass >& aOtherItr ) ; 00067 00068 // member functions 00069 WholeCandidateItr< CandidateClass >& operator++() ; 00070 WholeCandidateItr< CandidateClass > operator++( int ) ; 00071 WholeCandidateItr< CandidateClass >& operator--() ; 00072 WholeCandidateItr< CandidateClass > operator--( int ) ; 00073 WholeCandidateItr< CandidateClass >& operator+=( difference_type n ) ; 00074 WholeCandidateItr< CandidateClass > operator+( difference_type n ) ; 00075 WholeCandidateItr< CandidateClass >& operator-=( difference_type n ) ; 00076 WholeCandidateItr< CandidateClass > operator-( difference_type n ) ; 00077 00078 // const member functions 00079 const LabeledCandidate< CandidateClass >& operator*() const ; 00080 const LabeledCandidate< CandidateClass >& operator[]( size_type n ) const ; 00081 difference_type operator-( const WholeCandidateItr< CandidateClass >& aOtherItr ) const ; 00082 00083 bool operator==( const WholeCandidateItr< CandidateClass >& aOtherItr ) const ; 00084 bool operator!=( const WholeCandidateItr< CandidateClass >& aOtherItr ) const ; 00085 bool operator<( const WholeCandidateItr< CandidateClass >& aOtherItr ) const ; 00086 bool operator>( const WholeCandidateItr< CandidateClass >& aOtherItr ) const ; 00087 bool operator>=( const WholeCandidateItr< CandidateClass >& aOtherItr ) const ; 00088 bool operator<=( const WholeCandidateItr< CandidateClass >& aOtherItr ) const ; 00089 00090 // static member functions 00091 00092 protected: 00093 // Constructors and destructor 00094 WholeCandidateItr( const IndexedLabeledCandidates< CandidateClass >* aList , 00095 const size_type aIndex ) ; 00096 00097 // protected member functions 00098 00099 // protected const member functions 00100 IndexedLabeledCandidates< CandidateClass >* indexedCandidates() const ; 00101 size_type index() const ; 00102 00103 private: 00104 // Constructors and destructor 00105 WholeCandidateItr() ; // stop default 00106 00107 // private member functions 00108 00109 // private const member functions 00110 00111 // data members 00112 IndexedLabeledCandidates< CandidateClass >* m_indexedCandidates ; 00113 size_type m_index ; 00114 00115 // static data members 00116 00117 } ; 00118 00119 // inline function definitions 00120 00121 // user include files 00122 // 00123 // forward definitions of inline functions 00124 // 00125 00126 template < class CandidateClass > 00127 inline 00128 IndexedLabeledCandidates< CandidateClass >* WholeCandidateItr< CandidateClass >::indexedCandidates() const 00129 { 00130 return ( m_indexedCandidates ) ; 00131 } 00132 00133 template < class CandidateClass > 00134 inline 00135 typename WholeCandidateItr<CandidateClass>::size_type WholeCandidateItr< CandidateClass >::index() const 00136 { 00137 return ( m_index ) ; 00138 } 00139 00140 // 00141 // constructors and destructor 00142 // 00143 00144 template < class CandidateClass > 00145 inline 00146 WholeCandidateItr< CandidateClass >::WholeCandidateItr( const WholeCandidateItr< CandidateClass >& aOtherItr ) : 00147 m_indexedCandidates( aOtherItr.indexedCandidates() ) , 00148 m_index( aOtherItr.index() ) 00149 { 00150 } 00151 00152 template < class CandidateClass > 00153 inline 00154 WholeCandidateItr< CandidateClass >::WholeCandidateItr( const IndexedLabeledCandidates< CandidateClass >* aList , 00155 const size_type aIndex ) : 00156 // cast away const as const_itr can be assocciated with a non-const list, 00157 // but only const lists use this constructor 00158 m_indexedCandidates( (IndexedLabeledCandidates< CandidateClass >*)aList ) , 00159 m_index( aIndex ) 00160 { 00161 } 00162 00163 // 00164 // assignment operators 00165 // 00166 00167 template < class CandidateClass > 00168 inline 00169 const WholeCandidateItr< CandidateClass >& WholeCandidateItr< CandidateClass >::operator=( const WholeCandidateItr< CandidateClass >& aOtherItr ) 00170 { 00171 m_indexedCandidates = aOtherItr.indexedCandidates() ; 00172 m_index = aOtherItr.index() ; 00173 return ( *this ) ; 00174 } 00175 00176 // 00177 // member functions 00178 // 00179 00180 template < class CandidateClass > 00181 inline 00182 WholeCandidateItr< CandidateClass >& WholeCandidateItr< CandidateClass >::operator++() 00183 { 00184 ++m_index ; 00185 return ( *this ) ; 00186 } 00187 00188 template < class CandidateClass > 00189 inline 00190 WholeCandidateItr< CandidateClass > WholeCandidateItr< CandidateClass >::operator++( int ) 00191 { 00192 WholeCandidateItr tmp( *this ) ; 00193 ++m_index ; 00194 return ( tmp ) ; 00195 } 00196 00197 template < class CandidateClass > 00198 inline 00199 WholeCandidateItr< CandidateClass >& WholeCandidateItr< CandidateClass >::operator--() 00200 { 00201 --m_index ; 00202 return ( *this ) ; 00203 } 00204 00205 template < class CandidateClass > 00206 inline 00207 WholeCandidateItr< CandidateClass > WholeCandidateItr< CandidateClass >::operator--( int ) 00208 { 00209 WholeCandidateItr tmp( *this ) ; 00210 --m_index ; 00211 return ( tmp ) ; 00212 } 00213 00214 template < class CandidateClass > 00215 inline 00216 WholeCandidateItr< CandidateClass >& WholeCandidateItr< CandidateClass >::operator+=( difference_type n ) 00217 { 00218 m_index += n ; 00219 return( *this ) ; 00220 } 00221 00222 template < class CandidateClass > 00223 inline 00224 WholeCandidateItr< CandidateClass > WholeCandidateItr< CandidateClass >::operator+( difference_type n ) 00225 { 00226 WholeCandidateItr tmp( *this ) ; 00227 return ( tmp += n ) ; 00228 } 00229 00230 template < class CandidateClass > 00231 inline 00232 WholeCandidateItr< CandidateClass >& WholeCandidateItr< CandidateClass >::operator-=( difference_type n ) 00233 { 00234 m_index -= n ; 00235 return( *this ) ; 00236 } 00237 00238 template < class CandidateClass > 00239 inline 00240 WholeCandidateItr< CandidateClass > WholeCandidateItr< CandidateClass >::operator-( difference_type n ) 00241 { 00242 WholeCandidateItr tmp( *this ) ; 00243 return ( tmp -= n ) ; 00244 } 00245 00246 // 00247 // const member functions 00248 // 00249 00250 template < class CandidateClass > 00251 inline 00252 const LabeledCandidate< CandidateClass >& WholeCandidateItr< CandidateClass >::operator*() const 00253 { 00254 return ( (*m_indexedCandidates).labeledCandidateClass( m_index ) ) ; 00255 } 00256 00257 template < class CandidateClass > 00258 inline 00259 const LabeledCandidate< CandidateClass >& WholeCandidateItr< CandidateClass >::operator[]( size_type n ) const 00260 { 00261 return ( (*m_indexedCandidates).labeledCandidateClass( m_index + n ) ) ; 00262 } 00263 00264 template < class CandidateClass > 00265 inline 00266 typename WholeCandidateItr<CandidateClass>::difference_type 00267 WholeCandidateItr< CandidateClass >::operator-( const WholeCandidateItr& aOtherItr ) const 00268 { 00269 return ( m_index - aOtherItr.index() ) ; 00270 } 00271 00272 template < class CandidateClass > 00273 inline 00274 bool WholeCandidateItr< CandidateClass >::operator==( const WholeCandidateItr& aOtherItr ) const 00275 { 00276 return ( ( m_index == aOtherItr.index() ) && 00277 ( m_indexedCandidates == aOtherItr.indexedCandidates() ) ) ; 00278 } 00279 00280 template < class CandidateClass > 00281 inline 00282 bool WholeCandidateItr< CandidateClass >::operator!=( const WholeCandidateItr& aOtherItr ) const 00283 { 00284 return ( ( m_index != aOtherItr.index() ) || 00285 ( m_indexedCandidates != aOtherItr.indexedCandidates() ) ) ; 00286 } 00287 00288 template < class CandidateClass > 00289 inline 00290 bool WholeCandidateItr< CandidateClass >::operator<( const WholeCandidateItr& aOtherItr ) const 00291 { 00292 return ( ( m_index < aOtherItr.index() ) && 00293 ( m_indexedCandidates == aOtherItr.indexedCandidates() ) ) ; 00294 } 00295 00296 template < class CandidateClass > 00297 inline 00298 bool WholeCandidateItr< CandidateClass >::operator>( const WholeCandidateItr& aOtherItr ) const 00299 { 00300 return ( ( m_index > aOtherItr.index() ) && 00301 ( m_indexedCandidates == aOtherItr.indexedCandidates() ) ) ; 00302 } 00303 00304 template < class CandidateClass > 00305 inline 00306 bool WholeCandidateItr< CandidateClass >::operator>=( const WholeCandidateItr& aOtherItr ) const 00307 { 00308 return ( ( m_index >= aOtherItr.index() ) && 00309 ( m_indexedCandidates == aOtherItr.indexedCandidates() ) ) ; 00310 } 00311 00312 template < class CandidateClass > 00313 inline 00314 bool WholeCandidateItr< CandidateClass >::operator<=( const WholeCandidateItr& aOtherItr ) const 00315 { 00316 return ( ( m_index <= aOtherItr.index() ) && 00317 ( m_indexedCandidates == aOtherItr.indexedCandidates() ) ) ; 00318 } 00319 } 00320 00321 #endif /* DCHAIN_WHOLECANDIDATEITR_H */