summaryrefslogtreecommitdiff
path: root/dnn/Reaction.cc
blob: 845d689e03f3a255ac70e043760dca3f9fc48409 (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
 *	DNN - Data News Network
 *
 *	by Stephane Chatty
 *
 *	Copyright 1993-1994
 *	Centre d'Etudes de la Navigation Aerienne (CENA)
 *
 *	Reactions.
 *
 *	$Id$
 *	$CurLog$
 */

#include "Reaction.h"
#include "Trigger.h"

/*?class DnnBaseReaction
The class \typ{DnnBaseReaction} is the base class for event handling.
A reaction implements a behaviour (through the virtual function \fun{Manage}),
and can be associated to one or more triggers, generally located in a sensor.
?*/

/*?
Create a reaction.
?*/
DnnBaseReaction :: DnnBaseReaction ()
: Triggers (),
  Grabbed ()
{
}

/*?nodoc?*/
DnnBaseReaction :: ~DnnBaseReaction ()
{
	CcuListIterOf <DnnTrigger> ti = Grabbed;
	while (++ti)
		(*ti)->Release (*this);

	ti = Triggers;
	while (++ti)
		(*ti)->Unsubscribe (*this);
}

/*?nextdoc?*/
void
DnnBaseReaction :: SubscribeTo (DnnTrigger& t)
{
	Triggers.Append (&t);
	t.Subscribe (*this);
}

/*?
Tell that a reaction should (resp. should no more) be activated when the trigger \var{t}
causes the emission of an event.
?*/
void
DnnBaseReaction :: UnsubscribeTo (DnnTrigger& t)
{
	Triggers.Remove (&t);
	t.Unsubscribe (*this);
}

/*?nextdoc?*/
void
DnnBaseReaction :: Grab (DnnTrigger& t)
{
	Grabbed.Append (&t);
	t.Grab (*this);
}

/*?
Tell that a reaction should (resp. should no more) be the only one
activated when the trigger \var{t} causes the emission of an event.
?*/
void
DnnBaseReaction :: Release (DnnTrigger& t)
{
	Grabbed.Remove (&t);
	t.Release (*this);
}

/*?
This virtual function is called when an event is emitted because of a trigger to which
this reaction was attached. It should be redefined in derived classes to implement
behaviours.
?*/
void
DnnBaseReaction :: Manage (DnnEvent&)
{
}

/*?class DnnReaction
The class \typ{DnnReaction} is a ready-to-use derived class of \typ{DnnBaseReaction}.
In this class, the function \fun{Manage} is redefined to call a function passed when creating
the reaction.
?*/

/*?
Build a reaction that will call \var{f} to handle events.
\fun{f} has to take a \typ{DnnEvent\&} parameter and return \typ{void}.
?*/
DnnReaction :: DnnReaction (DnnHandlingFunction f)
: DnnBaseReaction (),
  Handler (f)
{
}

/*?nodoc?*/
DnnReaction :: ~DnnReaction ()
{
}

/*?nodoc?*/
void
DnnReaction :: Manage (DnnEvent& ev)
{
	(*Handler) (ev);
}