De manière générale, le corps d'une de ces méthodes spécifie la réaction ... :
- à l'affectation d'une valeur à un descripteur variable
- à l'accès à une valeur d'un descripteur variable
- à l'ajout ou au retrait d'un élément d'une entité
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*