#ifndef SPECIFICELEMENTVISITOR_H #define SPECIFICELEMENTVISITOR_H #include #include "AbsBeamline/BeamlineVisitor.h" #include "AbsBeamline/AlignWrapper.h" #include "AbsBeamline/BeamBeam.h" #include "AbsBeamline/CCollimator.h" #include "AbsBeamline/Corrector.h" #include "AbsBeamline/Cyclotron.h" #include "AbsBeamline/Diagnostic.h" #include "AbsBeamline/Drift.h" #include "AbsBeamline/Degrader.h" #include "AbsBeamline/ElementBase.h" #include "AbsBeamline/FlexibleCollimator.h" #include "AbsBeamline/Lambertson.h" #include "AbsBeamline/Offset.h" #include "AbsBeamline/Marker.h" #include "AbsBeamline/Monitor.h" #include "AbsBeamline/Multipole.h" #include "AbsBeamline/MultipoleT.h" #include "AbsBeamline/MultipoleTStraight.h" #include "AbsBeamline/MultipoleTCurvedConstRadius.h" #include "AbsBeamline/MultipoleTCurvedVarRadius.h" #include "AbsBeamline/Patch.h" #include "AbsBeamline/Probe.h" #include "AbsBeamline/RBend.h" #include "AbsBeamline/Ring.h" #include "AbsBeamline/RFCavity.h" #include "AbsBeamline/VariableRFCavity.h" #include "AbsBeamline/VariableRFCavityFringeField.h" #include "AbsBeamline/TravelingWave.h" #include "AbsBeamline/RFQuadrupole.h" #include "AbsBeamline/SBend.h" #include "AbsBeamline/SBend3D.h" #include "AbsBeamline/ScalingFFAMagnet.h" #include "AbsBeamline/Separator.h" #include "AbsBeamline/Septum.h" #include "AbsBeamline/Solenoid.h" #include "AbsBeamline/Source.h" #include "AbsBeamline/ParallelPlate.h" #include "AbsBeamline/CyclotronValley.h" #include "AbsBeamline/Stripper.h" #include "Beamlines/FlaggedElmPtr.h" #include "ComponentWrappers/CorrectorWrapper.h" #include "ComponentWrappers/CyclotronWrapper.h" #include "ComponentWrappers/MultipoleWrapper.h" #include "ComponentWrappers/RBendWrapper.h" #include "ComponentWrappers/SBendWrapper.h" #include "Algorithms/MapIntegrator.h" #include "Algorithms/TrackIntegrator.h" template struct CastsTrait { typedef std::list ElementList_t; static void apply(ElementList_t &, const ELEM2 &) { } }; template struct CastsTrait { typedef std::list ElementList_t; static void apply(ElementList_t &allElements, const ELEM &element) { allElements.push_back(dynamic_cast(&element)); } }; template class SpecificElementVisitor: public BeamlineVisitor { public: SpecificElementVisitor(const Beamline &beamline); virtual void execute(); /// Apply the algorithm to a beam-beam. virtual void visitBeamBeam(const BeamBeam &); /// Apply the algorithm to a collimator. virtual void visitCCollimator(const CCollimator &); /// Apply the algorithm to an arbitrary component. virtual void visitComponent(const Component &); /// Apply the algorithm to an cyclotron virtual void visitCyclotron(const Cyclotron &); /// Apply the algorithm to an opal ring.. virtual void visitRing(const Ring &); /// Apply the algorithm to a corrector. virtual void visitCorrector(const Corrector &); /// Apply the algorithm to a drift. virtual void visitDegrader(const Degrader &); /// Apply the algorithm to a diagnostic. virtual void visitDiagnostic(const Diagnostic &); /// Apply the algorithm to a drift. virtual void visitDrift(const Drift &); /// Apply the algorithm to a flexible collimator virtual void visitFlexibleCollimator(const FlexibleCollimator &); /// Apply the algorithm to a Lambertson. virtual void visitLambertson(const Lambertson &); /// Apply the algorithm to a marker. virtual void visitMarker(const Marker &); /// Apply the algorithm to a monitor. virtual void visitMonitor(const Monitor &); /// Apply the algorithm to a multipole. virtual void visitMultipole(const Multipole &); /// Apply the algorithm to a multipoleT. virtual void visitMultipoleT(const MultipoleT &); /// Apply the algorithm to a multipoleTStraight. virtual void visitMultipoleTStraight(const MultipoleTStraight &); /// Apply the algorithm to a multipoleT. virtual void visitMultipoleTCurvedConstRadius(const MultipoleTCurvedConstRadius &); /// Apply the algorithm to a multipoleT. virtual void visitMultipoleTCurvedVarRadius(const MultipoleTCurvedVarRadius &); /// Apply the algorithm to an Offset. virtual void visitOffset(const Offset &); /// Apply the algorithm to a patch. virtual void visitPatch(const Patch &pat); /// Apply the algorithm to a probe. virtual void visitProbe(const Probe &prob); /// Apply the algorithm to a rectangular bend. virtual void visitRBend(const RBend &); /// Apply the algorithm to a rectangular bend. virtual void visitRBend3D(const RBend3D &); /// Apply the algorithm to a RF cavity. virtual void visitVariableRFCavity(const VariableRFCavity &vcav); /// Apply the algorithm to a RF cavity. virtual void visitVariableRFCavityFringeField (const VariableRFCavityFringeField &vcav); /// Apply the algorithm to a RF cavity. virtual void visitRFCavity(const RFCavity &); /// Apply the algorithm to a RF cavity. virtual void visitTravelingWave(const TravelingWave &); /// Apply the algorithm to a RF quadrupole. virtual void visitRFQuadrupole(const RFQuadrupole &); /// Apply the algorithm to a sector bend. virtual void visitSBend(const SBend &); /// Apply the algorithm to a sector bend. virtual void visitSBend3D(const SBend3D &); /// Apply the algorithm to a separator. virtual void visitSeparator(const Separator &); /// Apply the algorithm to a septum. virtual void visitSeptum(const Septum &); /// Apply the algorithm to a solenoid. virtual void visitSolenoid(const Solenoid &); /// Apply the algorithm to a solenoid. virtual void visitSource(const Source &); /// Apply the algorithm to a spiral sector magnet. virtual void visitScalingFFAMagnet(const ScalingFFAMagnet &); /// Apply the algorithm to a ParallelPlate. virtual void visitParallelPlate(const ParallelPlate &); /// Apply the algorithm to a CyclotronValley. virtual void visitCyclotronValley(const CyclotronValley &); /// Apply the algorithm to a charge stripper. virtual void visitStripper(const Stripper &); /// Apply the algorithm to a beam line. virtual void visitBeamline(const Beamline &); /// Apply the algorithm to a FlaggedElmPtr. virtual void visitFlaggedElmPtr(const FlaggedElmPtr &); /// Apply the algorithm to an align wrapper.. virtual void visitAlignWrapper(const AlignWrapper &); /// Apply the algorithm to an corrector wrapper.. virtual void visitCorrectorWrapper(const CorrectorWrapper &); /// Apply the algorithm to an cyclotron wrapper.. virtual void visitCyclotronWrapper(const CyclotronWrapper &); /// Apply the algorithm to an multipole wrapper.. virtual void visitMultipoleWrapper(const MultipoleWrapper &); /// Apply the algorithm to an RBend wrapper.. virtual void visitRBendWrapper(const RBendWrapper &); /// Apply the algorithm to an SBend wrapper.. virtual void visitSBendWrapper(const SBendWrapper &); /// Apply the algorithm to a generic integrator. virtual void visitIntegrator(const Integrator &); /// Apply the algorithm to an integrator capable of mapping. virtual void visitMapIntegrator(const MapIntegrator &); /// Apply the algorithm to an integrator capable of tracking. virtual void visitTrackIntegrator(const TrackIntegrator &); size_t size() const; typedef std::list ElementList_t; typedef typename ElementList_t::iterator iterator_t; typedef typename ElementList_t::const_iterator const_iterator_t; typedef typename ElementList_t::reference reference_t; typedef typename ElementList_t::const_reference const_reference_t; iterator_t begin(); const_iterator_t begin() const; iterator_t end(); const_iterator_t end() const; reference_t front(); const_reference_t front() const; private: ElementList_t allElementsOfTypeE; }; template SpecificElementVisitor::SpecificElementVisitor(const Beamline &beamline): BeamlineVisitor(), allElementsOfTypeE() { beamline.iterate(*this, false); } template void SpecificElementVisitor::execute() { } template void SpecificElementVisitor::visitBeamBeam(const BeamBeam &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitCCollimator(const CCollimator &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitComponent(const Component &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitCyclotron(const Cyclotron &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitRing(const Ring &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitCorrector(const Corrector &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitDegrader(const Degrader &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitDiagnostic(const Diagnostic &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitDrift(const Drift &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitFlexibleCollimator(const FlexibleCollimator &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitLambertson(const Lambertson &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitMarker(const Marker &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitMonitor(const Monitor &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitMultipole(const Multipole &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitMultipoleT(const MultipoleT &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitMultipoleTStraight(const MultipoleTStraight &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitMultipoleTCurvedConstRadius(const MultipoleTCurvedConstRadius &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitMultipoleTCurvedVarRadius(const MultipoleTCurvedVarRadius &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitOffset(const Offset &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitPatch(const Patch &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitProbe(const Probe &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitRBend(const RBend &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitRBend3D(const RBend3D &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitVariableRFCavity (const VariableRFCavity &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitVariableRFCavityFringeField (const VariableRFCavityFringeField &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitRFCavity(const RFCavity &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitTravelingWave(const TravelingWave &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitRFQuadrupole(const RFQuadrupole &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitSBend(const SBend &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitSBend3D(const SBend3D &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitScalingFFAMagnet(const ScalingFFAMagnet &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitSeparator(const Separator &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitSeptum(const Septum &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitSolenoid(const Solenoid &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitSource(const Source &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitParallelPlate(const ParallelPlate &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitCyclotronValley(const CyclotronValley &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitStripper(const Stripper &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitBeamline(const Beamline &element) { element.iterate(*this, false); } template void SpecificElementVisitor::visitFlaggedElmPtr(const FlaggedElmPtr &element) { const ElementBase* wrappedElement = element.getElement(); wrappedElement->accept(*this); } template void SpecificElementVisitor::visitAlignWrapper(const AlignWrapper &element) { const ElementBase* wrappedElement = element.getElement(); wrappedElement->accept(*this); } template void SpecificElementVisitor::visitCorrectorWrapper(const CorrectorWrapper &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitCyclotronWrapper(const CyclotronWrapper &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitMultipoleWrapper(const MultipoleWrapper &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitRBendWrapper(const RBendWrapper &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitSBendWrapper(const SBendWrapper &element) { CastsTrait::apply(allElementsOfTypeE, element); } template void SpecificElementVisitor::visitIntegrator(const Integrator &element) { } template void SpecificElementVisitor::visitMapIntegrator(const MapIntegrator &element) { } template void SpecificElementVisitor::visitTrackIntegrator(const TrackIntegrator &element) { } template size_t SpecificElementVisitor::size() const{ return allElementsOfTypeE.size(); } template typename SpecificElementVisitor::iterator_t SpecificElementVisitor::begin(){ return allElementsOfTypeE.begin(); } template typename SpecificElementVisitor::const_iterator_t SpecificElementVisitor::begin() const{ return allElementsOfTypeE.begin(); } template typename SpecificElementVisitor::iterator_t SpecificElementVisitor::end(){ return allElementsOfTypeE.end(); } template typename SpecificElementVisitor::const_iterator_t SpecificElementVisitor::end() const{ return allElementsOfTypeE.end(); } template typename SpecificElementVisitor::reference_t SpecificElementVisitor::front() { return allElementsOfTypeE.front(); } template typename SpecificElementVisitor::const_reference_t SpecificElementVisitor::front() const{ return allElementsOfTypeE.front(); } #endif