La classe de base, mère des démons pour tous les types de descripteursAffectation des fonctions déclenchées automatiquement
Il s'agit des fonctions écrites par l'utilisateur, et installées comme corps de méthodes prédéfinies des démons (instance de MonitorMethod), méthodes connue pour être déclenchée lors d'un événement particulier.
Ces fonctions sont installées par des messages tels que AssignWhenSetIntMethod : la fonction passée en argument devient celle qui sera exécutée lors de l'affectation d'une valeur entière au descripteur.
CurrentLevelMonitor->AssignWhenGetFloatMethod(CurrentLevel_whenGet);Ces fonctions "utilisateur", ont toutes comme seul argument un pointeur sur la méthode dont elles deviennent corps.
float CurrentLevel_whenGet(MonitorMethod* pM) { ... }Les méthodes en question (ici pM) ont, par prédéfinition dans DIESE, plusieurs arguments, mais pas toujours les mêmes :
- Toutes les méthodes ont un agument de type VariableDescriptor*, celui de symbole de classe MONITOREDDESCRIPTOR_ARGUMENT). DIESE passe comme valeur de cet argument le descripteur auquel est attaché le démon.
- Les méthodes dont le corps est déclenché lors d'une modification de valeur par SetValue, ont un autre argument (celui de symbole de classe CURRENT..VALUE_ARGUMENT) qui sera lié, lors de l'appel, à la valeur courante du descripteur (celle avant la modification), et encore un autre (celui de symbole de classe CANDIDATE..VALUE_ARGUMENT) qui sera lié à la valeur transmise en argument de la méthode de modification (SetValue). La valeur renvoyée par la fonction sera affectée au descripteur. Elle peut être différente de la valeur candidate.
- Les méthodes dont le corps est déclenché lors d'un ajout de valeur par AddValue ou un retrait de valeur par RemoveValue ont un argument de symbole de classe CURRENT..VALUE_ARGUMENT qui sera lié au tableau d'entité qui est la valeur du descripteur, alors que l'argument de symbole de classe CANDIDATE..VALUE_ARGUMENT sera lié à l'entité qu'on tente d'ajouter ou de retirer. La valeur renvoyée par la fonction sera effectivement ajoutée à ou retirée de la valeur du descripteur. Elle peut être différente de la valeur candidate.
- Les méthodes dont le corps est déclenché lors de l'accès à une valeur, ont un argument (celui de symbole de classe CURRENT..VALUE_ARGUMENT) qui sera lié, lors de l'appel, à la valeur courante du descripteur (celle au moment de l'accès par GetIntValue, GetFloatValue, GetDoubleValue, GetEntityValue, GetEntityTabValue, GetStringValue). La valeur renvoyée par la fonction ne sera pas affectée au descripteur. Une méthode d'affectation doit être explicitement invoquée si on veut la réaliser.
Désaffectation des fonctions déclenchées automatiquement
Les méthodes telles que UnassignWhenSetIntMethod défont la liaison entre une fonction écrite par l'utilisateur et une méthode prédéfinie du démon. La fonction jusqu'à présent liée à la modification d'une valeur entière (par un SetValue) ne sera plus exécutée lors des modifications ultérieures. La fonction elle-même n'est pas détruite, c'est-à-dire qu'elle pourra être à nouveau liée (par un AssignWhenSetIntMethod).