File indexing completed on 2025-02-21 09:58:04
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef DD4HEP_VOLUMEPROCESSOR_H
0014 #define DD4HEP_VOLUMEPROCESSOR_H
0015
0016
0017 #include <DD4hep/DetElement.h>
0018 #include <DD4hep/Volumes.h>
0019
0020
0021 #include <memory>
0022
0023
0024 namespace dd4hep {
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 class PlacedVolumeProcessor {
0038 public:
0039
0040 PlacedVolumeProcessor() = default;
0041
0042 PlacedVolumeProcessor(PlacedVolumeProcessor&& copy) = default;
0043
0044 PlacedVolumeProcessor(const PlacedVolumeProcessor& copy) = default;
0045
0046 virtual ~PlacedVolumeProcessor() noexcept(false);
0047
0048 PlacedVolumeProcessor& operator=(const PlacedVolumeProcessor& copy) = default;
0049
0050 virtual int operator()(PlacedVolume pv, int level) = 0;
0051
0052 virtual int process(PlacedVolume pv, int level, bool recursive);
0053 };
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 template <typename T> class PlacementProcessor : virtual public PlacedVolumeProcessor {
0067 public:
0068
0069 T& processor;
0070 public:
0071
0072 PlacementProcessor() = delete;
0073
0074 PlacementProcessor(T& p) : processor(p) {}
0075
0076 PlacementProcessor(T&& p) = delete;
0077
0078 PlacementProcessor(PlacementProcessor&& copy) = default;
0079
0080 PlacementProcessor(const PlacementProcessor& copy) = default;
0081
0082 virtual ~PlacementProcessor() = default;
0083
0084 PlacementProcessor& operator=(const PlacementProcessor& copy) = default;
0085
0086 virtual int operator()(PlacedVolume pv, int level) final
0087 { return (processor)(pv, level); }
0088 };
0089
0090
0091 template <typename T> inline
0092 PlacementProcessor<typename std::remove_reference<T>::type> placementProcessor(T&& proc)
0093 { return PlacementProcessor<typename std::remove_reference<T>::type>(std::forward<T>(proc)); }
0094
0095
0096
0097
0098
0099
0100
0101
0102 template <typename T> class PlacementProcessorShared : public PlacedVolumeProcessor {
0103 public:
0104
0105 std::shared_ptr<T> processor;
0106 public:
0107
0108 PlacementProcessorShared() = delete;
0109
0110 PlacementProcessorShared(std::shared_ptr<T>& p) : processor(p) {}
0111
0112 PlacementProcessorShared(const PlacementProcessorShared& copy) = default;
0113
0114 virtual ~PlacementProcessorShared() = default;
0115
0116 PlacementProcessorShared& operator=(const PlacementProcessorShared& copy) = default;
0117
0118 virtual int operator()(PlacedVolume pv, int level) final
0119 { return (*processor)(pv, level); }
0120 };
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135 class PlacedVolumeScanner {
0136 public:
0137
0138 PlacedVolumeScanner() = default;
0139
0140 PlacedVolumeScanner(const PlacedVolumeScanner& copy) = default;
0141
0142 PlacedVolumeScanner& operator=(const PlacedVolumeScanner& copy) = default;
0143
0144
0145 template <typename Q>
0146 PlacedVolumeScanner(Q& proc, DetElement start, int level=0, bool recursive=true)
0147 { scan(proc, start.placement(), level, recursive); }
0148
0149
0150 template <typename Q>
0151 PlacedVolumeScanner(const Q& proc, DetElement start, int level=0, bool recursive=true)
0152 { scan(proc, start.placement(), level, recursive); }
0153
0154
0155 template <typename Q>
0156 PlacedVolumeScanner(Q& proc, PlacedVolume start, int level=0, bool recursive=true)
0157 { scan(proc, start, level, recursive); }
0158
0159
0160 template <typename Q>
0161 PlacedVolumeScanner(const Q& proc, PlacedVolume start, int level=0, bool recursive=true)
0162 { scan(proc, start, level, recursive); }
0163
0164
0165 int scanPlacements(PlacedVolumeProcessor& proc, PlacedVolume start, int level=0, bool recursive=true) const {
0166 return proc.process(start, level, recursive);
0167 }
0168
0169 template <typename Q>
0170 int scan(Q& p, PlacedVolume start, int level=0, bool recursive=true) const {
0171 auto proc = placementProcessor(p);
0172 return proc.process(start, level, recursive);
0173 }
0174
0175 template <typename Q>
0176 int scan(const Q& p, PlacedVolume start, int level=0, bool recursive=true) const {
0177 auto proc = placementProcessor(p);
0178 return proc.process(start, level, recursive);
0179 }
0180 };
0181 }
0182 #endif