| 150 | = B) Dictionnaire de BDD = |
| 151 | |
| 152 | Comme il a été montré en cours, une expression booléenne sous la forme canonique de |
| 153 | Shannon est associée à un et un seul ROBDD. Celui-çi étant entièrement caractérisé par son |
| 154 | triplet {{{(_index,_high,_low)}}}. Lorsque la méthode {{{Bdd::create()}}} est appelée il |
| 155 | faut qu'elle puisse déterminer rapidement si un ROBDD existe ou non. |
| 156 | |
| 157 | Le conteneur approprié pour ce type d'opération est la {{{stl::map<>}}}. La {{{map<>}}} |
| 158 | associe une valeur (le pointeur sur le ROBDD) à une clé (le triplet). Elle à les |
| 159 | propriétés suivantes: |
| 160 | |
| 161 | * Une clé d'une valeur donnée sera présente en un unique exemplaire dans la {{{map<>}}}, |
| 162 | et sera associée à une unique valeur. |
| 163 | |
| 164 | * On peut retrouver très efficacement une valeur en fonction d'une clé. |
| 165 | |
| 166 | * N'importe quel objet (classe) peut servir de clé ''sous réserve'' de disposer d'une |
| 167 | fonction d'ordre. C'est à dire de disposer d'une surcharge de l'operateur |
| 168 | ''strictement inférieur''. |
| 169 | |
| 170 | La définition de la classe {{{Bdd}}} comporte donc une classe imbriquée {{{Key}}} |
| 171 | représentant le triplet et proposant une fonction d'ordre. La relation d'ordre sera |
| 172 | simplement l'ordre lexicographique du triplet. Soit: |
| 173 | |
| 174 | {{{ |
| 175 | if ( lhs->_index != rhs->_index ) return lhs->_index < rhs->_index; |
| 176 | |
| 177 | if ( lhs->_high->getIndex() != rhs->_high->getIndex() ) |
| 178 | return lhs->_high->getIndex() < rhs->_high->getIndex(); |
| 179 | |
| 180 | return lhs->_low->getIndex() < rhs->_low->getIndex(); |
| 181 | }}} |
| 182 | |
| 183 | |
| 184 | |