Cette classe permet de spécifier un domaine de valeurs, c'est-à-dire de définir ce domaine sans en expliciter toutes les valeurs a priori. Cette classe fournit des services pour deux objectifs :
- donner un domaine de valeurs admissibles à un descripteur constant ou variable, protégeant l'utilisateur d'une affectation de valeur ne satisfaisant pas la sémantique du descripteur (voir les services IsInDomain et IsOutOfDomain des descripteurs),
- établir un ensemble d'entités répondant à un critère, dynamiquement en cours de simulation, c'est-à-dire sur la base des valeurs courantes des descripteurs. La présente classe est alors à exploiter conjointement avec la classe EntitySpec (voir page 'Spécifications d'ensembles d'entités'). La spécification de domaine de valeur doit alors inclure (dans les arguments du constructeur ou par le service SetDescId) le symbole d'une classe de descripteurs dont les entités visées sont dotées.
La spécification d'un domaine de valeur consiste en :
- un symbole de classe de descripteur, identifiant une classe de descripteurs (constants ou variables), caractérisée (implicitement ou explicitement) par un ensemble de valeurs possibles,
- un domaine de référence, qui sert à partager l'ensemble de valeurs possibles en deux sous-ensembles,
- un opérateur, parmi IN et NOT_IN, qui sert à décider lequel des deux sous-ensembles définit la spécification.
Cette classe n'est pas destinée à recevoir des instances directes, au contraire de ses sous-classes correspondant à chaque type de descripteur d'entités.
Pour les descripteurs à valeurs entières ou flottantes (simple ou double précision) le domaine de référence est un ensemble d'intervalles. Pour les descripteurs dont les valeurs sont des chaînes de caractères, le domaine de référence est une liste de chaînes de caractères. Pour les descripteurs dont les valeurs sont des pointeurs sur des entités, le domaine de référence est soit une liste de pointeurs sur des entités soit une liste de classe d'entités.
La méthode IsInDomain indique si la valeur courante d'un descripteur d'une instance de DescriptedEntity est ou non dans le domaine que cette spécification définit. Elle prend l'entité en argument. Cette méthode est invoquée par l'expansion d'une spécification d'ensemble d'entités, lorsque celle-ci est dotée de spécifications de domaines de valeurs (voir page 'Spécifications d'ensembles d'entités'). Par exemple, pour savoir si la valeur du descripteur à valeur entière et de symbole de classe MY_DESC est ou non comprise, pour l'entité pointée par pObj, entre 1 et 5, on peut écrire :
DescIntValueSpec pDVS = new DescIntValueSpec(MY_DESC, NOT_IN, 1, 5); pObj->SetValue(MY_DESC, 6); pDVS->IsInDomain(pObj); // renvoie vrai pObj->SetValue(MY_DESC, 3); pDVS->IsOutOfDomain(pObj); // renvoie vraiLa méthode GetValueInDomain renvoie une valeur tirée au hasard dans le domaine spécifié. Elle est exploitée par l'expansion d'une spécification d'ensemble d'entités lorsque celle-ci génère des instances désirées (mode INSTANTIATE) : les spécifications de domaines de valeurs permettent alors d'affecter les valeurs aux descripteurs des instances créées (voir aussi page 'Spécifications d'ensembles d'entités').
int lb = 1; int up = 5; DescIntValueSpec pDVS = new DescIntValueSpec(MY_DESC, IN, lb, ub); int N = pDVS->GetValueInDomain(); printf("\ntirage aléatoire dans le domaine [%d %d] : %d", lb, ub, N)>> tirage aléatoire dans le domaine [1 5] : 5