/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S M A T H E M A T I Q U E S D E G E S T I O N D E S A P P L Y s : */
/* */
/* */
/* Definition : */
/* */
/* Dans ce fichier, se trouvent les */
/* fonctions de base utilisees par */
/* la gestion des applys. Pour des */
/* raisons liees a la generation des */
/* fichiers "$EXT", ces definitions */
/* doivent etre seules dans ce fichier. */
/* */
/* */
/* Author of '$ximd/operator.2$DEF' : */
/* */
/* Jean-Francois Colonna (LACTAMME, 19890000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N E T G E S T I O N D E S A P P L Y S : */
/* */
/* */
/* Definition : */
/* */
/* De facon a pouvoir appliquer optionnellement */
/* des fonctions de transformation a des valeurs */
/* quelconques, la notion d'"apply" est creee. */
/* Elle n'utilise pas de 'Struc' car en effet, */
/* leurs initialisations est delicate ; on */
/* utilise donc quelque chose qui est formellement */
/* identique : le pseudo-operateur "`" de concatenation */
/* du pre-processeur. */
/* */
/* */
/* Utilisation : */
/* */
/* DEFINITION_D_UN_APPLY(nom_de_l_apply,type_des_fonctions,fonction_neutre); */
/* AUTORISATION_D_UN_APPLY(nom_de_l_apply,fonction_a_appliquer); */
/* INHIBITION_D_UN_APPLY(nom_de_l_apply,fonction_neutre); */
/* APPLY(nom_de_l_apply,valeur) */
/* */
/* */
/* Important : */
/* */
/* On utilise "=define" et non pas "#define" pour */
/* faciliter le travail de la generation des fichiers */
/* du type '$EXT'. */
/* */
/* */
/* Tres important : */
/* */
/* A compter du 20101222210836 le nom des fonctions */
/* qui peuvent etre pointees par le pointeur 'afPOINTEUR_1(...)' */
/* defini dans 'DEFINITION_D_UN_APPLY(...)' doivent necessairement */
/* debuter par "fAPPLY_____" a cause de la contrainte expliquee */
/* dans 'v $xcg/LArgTypFo$vv$Z 20101222210652'... */
/* */
/*************************************************************************************************************************************/
=define DEFINITION_D_UN_APPLY(nom_de_l_apply,type_des_fonctions,fonction_neutre) \
DEFV(Common,DEFV(Logical,INIT(etat_de_l_apply____`nom_de_l_apply,INVALIDE))); \
/* Indicateur precisant si l'on doit appliquer ('VALIDE') la fonction ou pas ('INVALIDE'). */ \
DEFV(Common,DEFV(type_des_fonctions,INIT(afPOINTEUR_1p(fonction_de_l_apply____`nom_de_l_apply) \
,aFONCTION(fAPPLY`___`fonction_neutre`___`nom_de_l_apply) \
) \
) \
)
/* Ce pointeur 'fonction_de_l_apply' contient en permanence l'adresse d'une fonction a */
/* appliquer a une valeur, lorsque l'indicateur 'etat_de_l_apply' le permet... On fera */
/* attention a l'absence de ";" a la fin de la directive precedente. Enfin, on utilise */
/* "=define" et non pas "#define" afin que lors de la generation des fichiers '$EXT' */
/* il n'y ait pas elimination des lignes du type "#if" par 'cpp$X'... */
=define AUTORISATION_D_UN_APPLY(nom_de_l_apply,fonction_a_appliquer) \
Bblock \
EGAL(etat_de_l_apply____`nom_de_l_apply,VALIDE); \
EGAL(fonction_de_l_apply____`nom_de_l_apply,aFONCTION(fAPPLY`___`fonction_a_appliquer`___`nom_de_l_apply)); \
/* On autorise et met en place la fonction a appliquer... */ \
Eblock
=define INHIBITION_D_UN_APPLY(nom_de_l_apply,fonction_neutre) \
Bblock \
EGAL(fonction_de_l_apply____`nom_de_l_apply,aFONCTION(fAPPLY`___`fonction_neutre`___`nom_de_l_apply)); \
EGAL(etat_de_l_apply____`nom_de_l_apply,INVALIDE); \
/* On inhibe la fonction a appliquer en mettant (par hygiene) une fonction "neutre"... */ \
Eblock
=define APPLY_ACTIF(nom_de_l_apply) \
EST_VALIDE(etat_de_l_apply____`nom_de_l_apply)
/* Afin de tester si un 'APPLY' est actif ou pas... */
=define APPLY(nom_de_l_apply,valeur) \
COND(APPLY_ACTIF(nom_de_l_apply) \
,fPOINTEUR(fonction_de_l_apply____`nom_de_l_apply)(valeur) \
,valeur \
)
/* Application, si cela est valide, de la fonction 'fonction' a la valeur 'valeur'. */