blob: 92dd48aee6d0dafc9e5651b36f8d91539f47db01 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/*
* 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 <DnnBaseCriterion> 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 <DnnBaseCriterion> 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 T> 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_ */
|