/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1995 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Criteria. * * $Id$ * $CurLog$ * Removed pragma interfaces */ #ifndef DnnCriterion_H_ #define DnnCriterion_H_ #include "cplus_bugs.h" #include "ccu/bool.h" #include "ccu/List.h" class DnnEvent; class DnnBaseCriterion { friend class DnnAndCriterion; friend class DnnOrCriterion; protected: DnnBaseCriterion (); ~DnnBaseCriterion (); public: virtual bool Test (DnnEvent&) = 0; }; class DnnOrCriterion; class DnnAndCriterion : public DnnBaseCriterion { friend class DnnOrCriterion; protected: CcuListOf Conditions; bool Test (DnnEvent&); public: DnnAndCriterion (); ~DnnAndCriterion (); DnnAndCriterion& operator &= (DnnBaseCriterion&); DnnAndCriterion& operator &= (DnnOrCriterion&); DnnAndCriterion& operator &= (DnnAndCriterion&); }; class DnnOrCriterion : public DnnBaseCriterion { friend class DnnAndCriterion; protected: CcuListOf Alternatives; bool Test (DnnEvent&); public: DnnOrCriterion (); ~DnnOrCriterion (); DnnOrCriterion& operator |= (DnnBaseCriterion&); DnnOrCriterion& operator |= (DnnOrCriterion&); DnnOrCriterion& operator |= (DnnAndCriterion&); }; class DnnBasicCriterion : public DnnBaseCriterion { protected: bool (*Check) (DnnEvent&); bool Test (DnnEvent& e); public: DnnBasicCriterion (); DnnBasicCriterion (bool (*c) (DnnEvent&)); ~DnnBasicCriterion (); inline void ChangeCriterion (bool (*c) (DnnEvent&)) {Check = c; } }; template class DnnCriterionOf : public DnnBaseCriterion { protected: T& Object; void (T::*Check) (DnnEvent&); public: DnnCriterionOf (T& o, void (T::*c) (DnnEvent&)) : DnnBaseCriterion (), Object (o), Check (c) {} ~DnnCriterionOf () {} bool Test (DnnEvent& ev) { return (Object.*Check) (ev); } }; #define SpecializedCriterion(R,S) \ \ class R : public DnnBaseCriterion { \ \ protected: \ \ S& Body; \ bool (S::*SpecializedCheck) (DnnEvent&); \ \ public: \ \ R (S& s, bool (S::*sc) (DnnEvent&)) : DnnBaseCriterion (), Body (s), SpecializedCheck (sc) {} \ ~R () {} \ \ bool Test (DnnEvent& e) { return (Body.*SpecializedCheck) (e); } \ \ }; #endif /* DnnCriterion_H_ */