11 #ifndef HEPMC3_FEATURE_H
12 #define HEPMC3_FEATURE_H
55 template<
typename Feature_type>
60 using Evaluator_type = std::function<Feature_type(ConstGenParticlePtr)>;
61 using EvaluatorPtr = std::shared_ptr<Evaluator_type>;
64 Feature_type
operator()(ConstGenParticlePtr input)
const {
65 return (*m_internal)(input);
71 EvaluatorPtr functor = m_internal;
72 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) > value;};
77 EvaluatorPtr functor = m_internal;
78 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) < value;};
84 EvaluatorPtr functor = m_internal;
85 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) >= value;};
91 EvaluatorPtr functor = m_internal;
92 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) <= value;};
98 EvaluatorPtr functor = m_internal;
99 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) == value;};
105 EvaluatorPtr functor = m_internal;
106 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) != value;};
112 GenericFeature(Evaluator_type functor):m_internal(std::make_shared<Evaluator_type>(functor)) {}
120 EvaluatorPtr m_internal;
160 template<
typename Feature_type,
typename Dummy=
void>
165 using typename GenericFeature<Feature_type>::Evaluator_type;
166 using typename GenericFeature<Feature_type>::EvaluatorPtr;
181 EvaluatorPtr functor = m_internal;
182 Evaluator_type absfunctor = [functor](ConstGenParticlePtr p)->Feature_type{
return ::abs((*functor)(p));};
203 template<
typename Feature_type>
216 using typename GenericFeature<Feature_type>::Evaluator_type;
217 using typename GenericFeature<Feature_type>::EvaluatorPtr;
225 EvaluatorPtr functor = m_internal;
226 Evaluator_type absfunctor = [functor](ConstGenParticlePtr p)->Feature_type{
return ::abs((*functor)(p));};
231 EvaluatorPtr functor = m_internal;
232 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) > value;};
236 EvaluatorPtr functor = m_internal;
237 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) < value;};
241 EvaluatorPtr functor = m_internal;
242 return [value, functor](ConstGenParticlePtr input)->
bool{
243 Feature_type local = (*functor)(input);
244 return std::abs(local - value) < std::numeric_limits<double>::epsilon();
253 return !( (*this)==value );
267 template<
typename Feature_type>
268 class Feature<Feature_type, typename std::enable_if<std::is_floating_point<Feature_type>::value, void>
::type> :
public GenericFeature<Feature_type> {
272 using typename GenericFeature<Feature_type>::Evaluator_type;
273 using typename GenericFeature<Feature_type>::EvaluatorPtr;
287 EvaluatorPtr functor = m_internal;
288 Evaluator_type absfunctor = [functor](ConstGenParticlePtr p)->Feature_type{
return std::abs((*functor)(p));};
293 EvaluatorPtr functor = m_internal;
294 return [value, functor](ConstGenParticlePtr input)->
bool{
295 Feature_type local = (*functor)(input);
296 return std::less_equal<Feature_type>{}(fabs(local - value) , std::numeric_limits<Feature_type>::epsilon());
301 return !( (*this)==value );
315 template<
typename Feature_type>
GenericFeature(Evaluator_type functor)
Hide the constructor so no one can use GenericFeature directly.
virtual Filter operator==(Feature_type value) const
equality operator
virtual Filter operator!=(Feature_type value) const
inequality operator
Definition of class GenParticle.
Filter operator>=(Feature_type value) const
greater than or equals operator
GenericFeature defines the Feature interface GenericFeature is not intended to be used directly...
Defines Filter operations for combingin Filters.
Filter operator>(Feature_type value) const
greater than operator
Filter operator<(Feature_type value) const
less than operator
std::function< bool(ConstGenParticlePtr)> Filter
type of Filter
Expose GenericFeature interface to derived Feature class.
Filter operator<=(Feature_type value) const
less than or equals operator
GenericFeature(const GenericFeature ©)
Hide the copy constructor.
Feature_type operator()(ConstGenParticlePtr input) const
access the underlying feature value
Feature< Feature_type > abs(const Feature< Feature_type > &input)
Obtain the absolute value of a Feature. This works as you'd expect. If foo is a valid Feature...