Integration of OCCT 6.5.0 from SVN
[occt.git] / src / Interface / Interface_Recognizer.gxx
1 //#include <Interface_Recognizer.ixx>
2 #include <Standard_NoSuchObject.hxx>
3
4 //  ATTENTION : TransRecognizer a exactement le meme code ...
5 //  Mais produit un Transient au lieu d un Persistent
6
7   // Principe : a un objet de depart (cle), un Recognizer tente d'associer un
8   // resultat. La classe Recognizer offre le mecanisme general gerant cela
9   // Chaque classe particuliere (une fois definie l'instanciation) doit fournir
10   // une methode specifique Eval, qui opere la correspondance
11   // Eval considere l'objet par tous moyens appropries, et en cas de succes,
12   // appelle  SetOK(result) puis sort (return)
13   // en cas d'echec, suite au retour d'Eval, Recognizer sait que SetOK n'a pas
14   // ete appele
15
16     Interface_Recognizer::Interface_Recognizer ()
17       {  hasnext = Standard_False;  }
18   //thekey.Nullify();  inutile, fait par le constructeur ...
19
20     Standard_Boolean Interface_Recognizer::Evaluate
21   (const TheKey& akey, Handle(TheResul)& res)
22 {
23   theres.Nullify();
24   Eval(akey);
25   if (!theres.IsNull()) {
26     res = theres;
27     return Standard_True;
28   }
29   else if (hasnext) return thenext->Evaluate(akey,res);
30   return Standard_False;
31 }
32
33     Handle(TheResul) Interface_Recognizer::Result () const
34 {
35   if (!theres.IsNull()) return theres;
36   if (hasnext) return thenext->Result();
37   Standard_NoSuchObject::Raise ("Recognizer evaluation has failed");
38   return theres;  // pour calmer le compilateur
39 }
40
41     void Interface_Recognizer::Add (const Handle(Interface_Recognizer)& reco)
42       {  thenext = reco;  hasnext = Standard_True;  }
43
44     void Interface_Recognizer::SetOK (const Handle(TheResul)& aresult)
45       {  theres = aresult;  }
46
47     void Interface_Recognizer::SetKO ()
48       {  theres.Nullify();  }