00001 #ifndef HEPMC_GEN_EVENT_ITERATORS_H
00002 #define HEPMC_GEN_EVENT_ITERATORS_H
00003
00004
00006
00007
00009
00010
00011 #include <stdexcept>
00012
00013 #include "HepMC/GenEvent.h"
00014 #include "HepMC/GenVertex.h"
00015
00016 namespace HepMC {
00017
00019
00026 class GenEventVertexRange {
00027
00028 public:
00029
00031 GenEventVertexRange( GenEvent & e ) : m_event(e) {}
00033 GenEvent::vertex_iterator begin() { return m_event.vertices_begin(); }
00034 GenEvent::vertex_iterator end() { return m_event.vertices_end(); }
00035
00036 private:
00039 GenEventVertexRange& operator=( GenEventVertexRange & );
00040
00041 private:
00042 GenEvent & m_event;
00043
00044 };
00045
00047
00055 class ConstGenEventVertexRange {
00056
00057 public:
00058
00060 ConstGenEventVertexRange( GenEvent const & e ) : m_event(e) {}
00062 GenEvent::vertex_const_iterator begin() const { return m_event.vertices_begin(); }
00063 GenEvent::vertex_const_iterator end() const { return m_event.vertices_end(); }
00064
00065 private:
00068 ConstGenEventVertexRange& operator=( ConstGenEventVertexRange & );
00069
00070 private:
00071 GenEvent const & m_event;
00072
00073 };
00074
00076
00083 class GenEventParticleRange {
00084
00085 public:
00086
00088 GenEventParticleRange( GenEvent & e ) : m_event(e) {}
00090 GenEvent::particle_iterator begin() { return m_event.particles_begin(); }
00091 GenEvent::particle_iterator end() { return m_event.particles_end(); }
00092
00093 private:
00096 GenEventParticleRange& operator=( GenEventParticleRange & );
00097
00098 private:
00099 GenEvent & m_event;
00100
00101 };
00102
00104
00112 class ConstGenEventParticleRange {
00113
00114 public:
00115
00117 ConstGenEventParticleRange( GenEvent const & e ) : m_event(e) {}
00119 GenEvent::particle_const_iterator begin() const { return m_event.particles_begin(); }
00120 GenEvent::particle_const_iterator end() const { return m_event.particles_end(); }
00121
00122 private:
00125 ConstGenEventParticleRange& operator=( ConstGenEventParticleRange & );
00126
00127 private:
00128 GenEvent const & m_event;
00129
00130 };
00131
00133
00140 class GenVertexParticleRange {
00141
00142 public:
00143
00145 GenVertexParticleRange( GenVertex & v, IteratorRange range = relatives )
00146 : m_vertex(v),m_range(range) {}
00148 GenVertex::particle_iterator begin() { return m_vertex.particles_begin(m_range); }
00149 GenVertex::particle_iterator end() { return m_vertex.particles_end(m_range); }
00150
00151 private:
00154 GenVertexParticleRange& operator=( GenVertexParticleRange & );
00155
00156 private:
00157 GenVertex & m_vertex;
00158 IteratorRange m_range;
00159
00160 };
00161
00163
00170 class GenParticleProductionRange {
00171
00172 public:
00173
00175 GenParticleProductionRange( GenParticle const & p, IteratorRange range = relatives )
00176 : m_particle(p),m_range(range) {}
00178 GenVertex::particle_iterator begin();
00180 GenVertex::particle_iterator end();
00181
00182 private:
00185 GenParticleProductionRange& operator=( GenParticleProductionRange & );
00186
00187 private:
00188 GenParticle const & m_particle;
00189 IteratorRange m_range;
00190
00191 };
00192
00193 class ConstGenParticleProductionRange {
00194
00195 public:
00196
00198 ConstGenParticleProductionRange( GenParticle const & p, IteratorRange range = relatives )
00199 : m_particle(p),m_range(range) {}
00201 GenVertex::particle_iterator begin();
00203 GenVertex::particle_iterator end();
00204
00205 private:
00208 ConstGenParticleProductionRange& operator=( ConstGenParticleProductionRange & );
00209
00210 private:
00211 GenParticle const & m_particle;
00212 IteratorRange m_range;
00213
00214 };
00215
00217
00224 class GenParticleEndRange {
00225
00226 public:
00227
00229 GenParticleEndRange( GenParticle const & p, IteratorRange range = relatives )
00230 : m_particle(p),m_range(range) {}
00232 GenVertex::particle_iterator begin();
00234 GenVertex::particle_iterator end();
00235
00236 private:
00239 GenParticleEndRange& operator=( GenParticleEndRange & );
00240
00241 private:
00242 GenParticle const & m_particle;
00243 IteratorRange m_range;
00244
00245 };
00246
00247 class ConstGenParticleEndRange {
00248
00249 public:
00250
00252 ConstGenParticleEndRange( GenParticle const & p, IteratorRange range = relatives )
00253 : m_particle(p),m_range(range) {}
00255 GenVertex::particle_iterator begin();
00257 GenVertex::particle_iterator end();
00258
00259 private:
00262 ConstGenParticleEndRange& operator=( ConstGenParticleEndRange & );
00263
00264 private:
00265 GenParticle const & m_particle;
00266 IteratorRange m_range;
00267
00268 };
00269
00270
00271 inline GenVertex::particle_iterator GenParticleProductionRange::begin()
00272 {
00273 if ( ! m_particle.production_vertex() )
00274 throw(std::range_error("GenParticleProductionRange: GenParticle has no production_vertex"));
00275 return m_particle.production_vertex()->particles_begin(m_range);
00276 }
00277
00278 inline GenVertex::particle_iterator GenParticleProductionRange::end()
00279 {
00280 if ( ! m_particle.production_vertex() )
00281 throw(std::range_error("GenParticleProductionRange: GenParticle has no production_vertex"));
00282 return m_particle.production_vertex()->particles_end(m_range);
00283 }
00284
00285
00286 inline GenVertex::particle_iterator ConstGenParticleProductionRange::begin()
00287 {
00288 if ( ! m_particle.production_vertex() )
00289 throw(std::range_error("ConstGenParticleProductionRange: GenParticle has no production_vertex"));
00290 return m_particle.production_vertex()->particles_begin(m_range);
00291 }
00292
00293 inline GenVertex::particle_iterator ConstGenParticleProductionRange::end()
00294 {
00295 if ( ! m_particle.production_vertex() )
00296 throw(std::range_error("ConstGenParticleProductionRange: GenParticle has no production_vertex"));
00297 return m_particle.production_vertex()->particles_end(m_range);
00298 }
00299
00300 inline GenVertex::particle_iterator GenParticleEndRange::begin()
00301 {
00302 if ( ! m_particle.end_vertex() )
00303 throw(std::range_error("GenParticleEndRange: GenParticle has no end_vertex"));
00304 return m_particle.end_vertex()->particles_begin(m_range);
00305 }
00306 inline GenVertex::particle_iterator GenParticleEndRange::end()
00307 {
00308 if ( ! m_particle.end_vertex() )
00309 throw(std::range_error("GenParticleEndRange: GenParticle has no end_vertex"));
00310 return m_particle.end_vertex()->particles_end(m_range);
00311 }
00312
00313 inline GenVertex::particle_iterator ConstGenParticleEndRange::begin()
00314 {
00315 if ( ! m_particle.end_vertex() )
00316 throw(std::range_error("ConstGenParticleEndRange: GenParticle has no end_vertex"));
00317 return m_particle.end_vertex()->particles_begin(m_range);
00318 }
00319 inline GenVertex::particle_iterator ConstGenParticleEndRange::end()
00320 {
00321 if ( ! m_particle.end_vertex() )
00322 throw(std::range_error("ConstGenParticleEndRange: GenParticle has no end_vertex"));
00323 return m_particle.end_vertex()->particles_end(m_range);
00324 }
00325
00326 }
00327
00328 #endif // HEPMC_GEN_EVENT_ITERATORS_H