Méthodes prédéfinies de démons

De manière générale, le corps d'une de ces méthodes spécifie la réaction ... :

On suit ci-dessous l'exemple de l'affectation d'une valeur entière. C'est l'utilisateur qui code ce corps et qui l'affecte à la méthode (ici avec AssignWhenSetIntMethod), de la manière suivante :

IntDescValueMonitor* SizeMonitor;

int Size_whenSet(MonitorMethod* pM) {
  Descriptor* pVD = pM->GetDescriptorArgValue(MONITOREDDESCRIPTOR_ARGUMENT);
  //int oldValue = pM->GetIntArgValue(CURRENTINTVALUE_ARGUMENT);
  int candidateValue = pM->GetIntArgValue(CANDIDATEINTVALUE_ARGUMENT);
  ... // la réaction
  return candidateValue;
}
void App_DefineMonitors() {
  SizeMonitor = new IntDescValueMonitor("sizeMonitor");
  SizeMonitor->AssignWhenSetIntMethod(Size_whenSet);
  ...
};

Par contre, l'utilisateur n'invoque pas lui-même le corps de ce type de méthode. C'est le moteur qui le fait, lorsqu'il reçoit une instruction dans la liste du haut de la page, et si un démon est prévu pour cet événement. On indique cepandant ici la manière dont le moteur réalise cet appel (en connaissance que le constructeur WhenSetInt() affecte le symbole de classe WHEN_SET_INT et le nom de classe "whenSetInt") :

void  IntVariableDescriptor::SetValue(int value) {
  ...
  IntDescValueMonitor* pDVM = ...;// accès à une donnée membre privée du descripteuur
  Method* pM = pDVM->GetMethod(WHEN_SET_INT);
  pM->SetArgValue(MONITOREDDESCRIPTOR_ARGUMENT, this);
  pM->SetArgValue(CURRENTINTVALUE_ARGUMENT, mValue);  // mValue est une donnée membre privée
  pM->SetArgValue(CANDIDATEINTVALUE_ARGUMENT, value);
  mValue = ((IntMonitorMethod*)pM)->Body((MonitorMethod*)pM);
  ...
}

Methodes de démons sur la valeur des descripteurs

Sur ce modèle, les autres méthodes prédéfinies des démons sur la valeur d'un descripteur (DescValueMonitor) sont les suivantes, avec leurs arguments spécifiques. Il y a en effet un argument commun à toutes : l'argument MonitoredDescriptorArgument de symbole MONITOREDDESCRIPTOR_ARGUMENT et de nom "monitoredDescriptorArgument", dont l'usage est montré dans le code ci-dessus. Sa valeur est le descripteur sur lequel le démon surveille un événement (affectation/accès).

L'argument de symbole CURRENT[...]VALUE_ARGUMENT a toujours pour valeur (affectée par le moteur de simulation) la valeur du descripteur juste avant la tentative d'affectation d'une nouvelle valeur, ou juste avant l'accès à la valeur.
L'argument de symbole CANDIDATE[...]VALUE_ARGUMENT a toujours pour valeur (affectée par le moteur de simulation) la nouvelle valeur qu'on tente d'affecter au descripteur.
L'argument de symbole CURRENTENTITYTABVALUE_ARGUMENT a pour valeur le tableau d'entités juste avant la tentative d'ajout ou de retrait d'un élément.
L'argument de symbole CANDIDATEENTITYVALUE_ARGUMENT, pour la méthode WhenAddEntity (resp. WhenRemoveEntity) a pour valeur l'entités qu'on tente d'ajouter (resp. de retirer).
L'argument de symbole CURRENTDESCVALUESPECTABVALUE_ARGUMENT a pour valeur le tableau de spécifications de domaine de valeurs juste avant la tentative d'ajout ou de retrait d'un élément.
L'argument de symbole CANDIDATEDESCVALUESPECVALUE_ARGUMENT, pour la méthode WhenAddDescValueSpec (resp. WhenRemoveDescValueSpec) a pour valeur la spécification de domaine de valeurs qu'on tente d'ajouter (resp. de retirer).

classe du démon classe de la méthode type retourné par le corps symbole de classe des arguments du corps
IntDescValueMonitor WhenSetInt int CURRENTINTVALUE_ARGUMENT
CANDIDATEINTVALUE_ARGUMENT
FloatDescValueMonitor WhenSetFloat float CURRENTFLOATVALUE_ARGUMENT
CANDIDATEFLOATVALUE_ARGUMENT
DoubleDescValueMonitor WhenSetDouble double CURRENTDOUBLEVALUE_ARGUMENT
CANDIDATEDOUBLEVALUE_ARGUMENT
StringDescValueMonitor WhenSetString char* CURRENTSTRINGVALUE_ARGUMENT
CANDIDATESTRINGVALUE_ARGUMENT
EntityDescValueMonitor WhenSetEntity BasicEntity* CURRENTENTITYVALUE_ARGUMENT
CANDIDATEENTITYVALUE_ARGUMENT
EntityTabDescValueMonitor WhenSetEntityTab pEntityTab* CURRENTENTITYTABVALUE_ARGUMENT
CANDIDATEENTITYTABVALUE_ARGUMENT
EntityTabDescValueMonitor WhenAddEntity BasicEntity* CURRENTENTITYTABVALUE_ARGUMENT
CANDIDATEENTITYVALUE_ARGUMENT
EntityTabDescValueMonitor WhenRemoveEntity BasicEntity* CURRENTENTITYTABVALUE_ARGUMENT
CANDIDATEENTITYVALUE_ARGUMENT
DescValueSpeTabDescValueMonitor WhenAddDescValueSpec DescValueSpec* CURRENTDESCVALUESPECTABVALUE_ARGUMENT
CANDIDATEDESCVALUESPECVALUE_ARGUMENT
DescValueSpeTabDescValueMonitor WhenRemoveDescValueSpec DescValueSpec* CURRENTDESCVALUESPECTABVALUE_ARGUMENT
CANDIDATEDESCVALUESPECTABVALUE_ARGUMENT
IntDescValueMonitor WhenGetInt int CURRENTINTVALUE_ARGUMENT
FloatDescValueMonitor WhenGetFloat float CURRENTFLOATVALUE_ARGUMENT
DoubleDescValueMonitor WhenGetDouble double CURRENTDOUBLEVALUE_ARGUMENT
StringDescValueMonitor WhenGetString char* CURRENTSTRINGVALUE_ARGUMENT
EntityDescValueMonitor WhenGetEntity BasicEntity* CURRENTENTITYVALUE_ARGUMENT
EntityTabDescValueMonitor WhenGetEntityTab pEntityTab* CURRENTENTITYTABVALUE_ARGUMENT
DescValueSpeTabDescValueMonitor WhenGetDescValueSpecTab pDescValueSpecTab* CURRENTDESCVALUESPECTABVALUE_ARGUMENT

Methodes de démons sur la structure des entités

Les méthodes prédéfinies des démons sur la structure d'une entité (StructureMonitor) sont les suivantes. Les deux méthodes ont deux arguments :
- l'argument CurrentEntityContainerArgument de symbole CURRENTENTITYCONTAINER_ARGUMENT et de nom "currentEntityContainerArgument". Sa valeur est l'entité de laquelle un tente d'ajouter ou d'enlever un élément.
- l'argument CandidateEntityElementArgument de symbole CANDIDATEENTITYELEMENT_ARGUMENT et de nom "candidateEntityElementArgument". Sa valeur est l'élément qu'on tente d'ajouter ou d'enlever de l'entité.

classe du démon classe de la méthode type retourné par le corps symbole de classe des arguments du corps
StructureMonitor WhenAddElement BasicEntity*
StructureMonitor WhenRemoveElement BasicEntity*


This page was generated with the help of DOC++.