/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1995 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Criteria. * * $Id$ * $CurLog$ */ #ifndef IvlCriterion_H_ #define IvlCriterion_H_ #include "cplus_bugs.h" #include "ivl/bool.h" #include "ivl/List.h" class IvlEvent; class IvlBaseCriterion { friend class IvlAndCriterion; friend class IvlOrCriterion; protected: IvlBaseCriterion (); ~IvlBaseCriterion (); public: virtual bool Test (IvlEvent&) = 0; }; class IvlOrCriterion; class IvlAndCriterion : public IvlBaseCriterion { friend class IvlOrCriterion; protected: IvlListOf Conditions; bool Test (IvlEvent&); public: IvlAndCriterion (); ~IvlAndCriterion (); IvlAndCriterion& operator &= (IvlBaseCriterion&); IvlAndCriterion& operator &= (IvlOrCriterion&); IvlAndCriterion& operator &= (IvlAndCriterion&); }; class IvlOrCriterion : public IvlBaseCriterion { friend class IvlAndCriterion; protected: IvlListOf Alternatives; bool Test (IvlEvent&); public: IvlOrCriterion (); ~IvlOrCriterion (); IvlOrCriterion& operator |= (IvlBaseCriterion&); IvlOrCriterion& operator |= (IvlOrCriterion&); IvlOrCriterion& operator |= (IvlAndCriterion&); }; class IvlBasicCriterion : public IvlBaseCriterion { protected: bool (*Check) (IvlEvent&); bool Test (IvlEvent& e); public: IvlBasicCriterion (); IvlBasicCriterion (bool (*c) (IvlEvent&)); ~IvlBasicCriterion (); inline void ChangeCriterion (bool (*c) (IvlEvent&)) {Check = c; } }; template class IvlCriterionOf : public IvlBaseCriterion { protected: T& Object; void (T::*Check) (IvlEvent&); public: IvlCriterionOf (T& o, void (T::*c) (IvlEvent&)) : IvlBaseCriterion (), Object (o), Check (c) {} ~IvlCriterionOf () {} bool Test (IvlEvent& ev) { return (Object.*Check) (ev); } }; #define SpecializedCriterion(R,S) \ \ class R : public IvlBaseCriterion { \ \ protected: \ \ S& Body; \ bool (S::*SpecializedCheck) (IvlEvent&); \ \ public: \ \ R (S& s, bool (S::*sc) (IvlEvent&)) : IvlBaseCriterion (), Body (s), SpecializedCheck (sc) {} \ ~R () {} \ \ bool Test (IvlEvent& e) { return (Body.*SpecializedCheck) (e); } \ \ }; #endif /* IvlCriterion_H_ */