Warning, /include/opencascade/LibCtl_Library.gxx is written in an unsupported language. File is not indexed.
0001 // Copyright (c) 1998-1999 Matra Datavision
0002 // Copyright (c) 1999-2014 OPEN CASCADE SAS
0003 //
0004 // This file is part of Open CASCADE Technology software library.
0005 //
0006 // This library is free software; you can redistribute it and/or modify it under
0007 // the terms of the GNU Lesser General Public License version 2.1 as published
0008 // by the Free Software Foundation, with special exception defined in the file
0009 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0010 // distribution for complete text of the license and disclaimer of any warranty.
0011 //
0012 // Alternatively, this file may be used under the terms of Open CASCADE
0013 // commercial license or contractual agreement.
0014
0015 //#include <LibCtl_Library.ixx>
0016 #include <Standard_NoSuchObject.hxx>
0017
0018
0019 // Liste Globale des Modules, dans laquelle on va se servir
0020
0021 static Handle(LibCtl_GlobalNode) theglobal;
0022
0023 // Donnees pour optimisation (dernier Protocole demande)
0024
0025 static Handle(TheProtocol) theprotocol;
0026 static Handle(LibCtl_Node) thelast;
0027
0028
0029 // Alimentation de la liste globale
0030 // ATTENTION : SetGlobal fait de la substitution, c-a-d que c est le dernier
0031 // qui a raison pour un Protocol donne
0032 void LibCtl_Library::SetGlobal
0033 (const Handle(TheModule)& amodule, const Handle(TheProtocol)& aprotocol)
0034 {
0035 if (theglobal.IsNull()) theglobal = new LibCtl_GlobalNode;
0036 theglobal->Add(amodule,aprotocol);
0037 }
0038
0039 // Constructeur d apres Protocole
0040 LibCtl_Library::LibCtl_Library (const Handle(TheProtocol)& aprotocol)
0041 {
0042 Standard_Boolean last = Standard_False;
0043 if (aprotocol.IsNull()) return; // PAS de protocole = Lib VIDE
0044 if (!theprotocol.IsNull()) last =
0045 (theprotocol == aprotocol);
0046
0047 if (last) thelist = thelast;
0048 // Si Pas d optimisation disponible : construire la liste
0049 else {
0050 AddProtocol(aprotocol);
0051 // Ceci definit l optimisation (pour la fois suivante)
0052 thelast = thelist;
0053 theprotocol = aprotocol;
0054 }
0055 }
0056
0057 // Constructeur vide
0058 LibCtl_Library::LibCtl_Library () { }
0059
0060
0061 // Ajout d un Protocol : attention, desoptimise (sinon risque de confusion !)
0062 void LibCtl_Library::AddProtocol
0063 (const Handle(Standard_Transient)& aprotocol)
0064 {
0065 // DownCast car Protocol->Resources, meme redefini et utilise dans d autres
0066 // librairies, doit toujours renvoyer le type le plus haut
0067 Handle(TheProtocol) aproto = Handle(TheProtocol)::DownCast(aprotocol);
0068 if (aproto.IsNull()) return;
0069
0070 // D abord, ajouter celui-ci a la liste : chercher le Node
0071 Handle(LibCtl_GlobalNode) curr;
0072 for (curr = theglobal; !curr.IsNull(); ) { // curr->Next : plus loin
0073 const Handle(TheProtocol)& protocol = curr->Protocol();
0074 if (!protocol.IsNull()) {
0075 // Match Protocol ?
0076 if (protocol->DynamicType() == aprotocol->DynamicType()) {
0077 if (thelist.IsNull()) thelist = new LibCtl_Node;
0078 thelist->AddNode(curr);
0079 break; // UN SEUL MODULE PAR PROTOCOLE
0080 }
0081 }
0082 curr = curr->Next(); // cette formule est refusee dans "for"
0083 }
0084 // Ensuite, Traiter les ressources
0085 Standard_Integer nb = aproto->NbResources();
0086 for (Standard_Integer i = 1; i <= nb; i ++) {
0087 AddProtocol (aproto->Resource(i));
0088 }
0089 // Ne pas oublier de desoptimiser
0090 theprotocol.Nullify();
0091 thelast.Nullify();
0092 }
0093
0094 void LibCtl_Library::Clear ()
0095 { thelist = new LibCtl_Node; }
0096
0097 void LibCtl_Library::SetComplete ()
0098 {
0099 thelist = new LibCtl_Node;
0100 // On prend chacun des Protocoles de la Liste Globale et on l ajoute
0101 Handle(LibCtl_GlobalNode) curr;
0102 for (curr = theglobal; !curr.IsNull(); ) { // curr->Next : plus loin
0103 const Handle(TheProtocol)& protocol = curr->Protocol();
0104 // Comme on prend tout tout tout, on ne se preoccupe pas des Ressources !
0105 if (!protocol.IsNull()) thelist->AddNode(curr);
0106 curr = curr->Next(); // cette formule est refusee dans "for"
0107 }
0108 }
0109
0110
0111 // Selection : Tres fort, on retourne le Module correspondant a un Type
0112 // (ainsi que le CaseNumber retourne par le protocole correspondant)
0113
0114 Standard_Boolean LibCtl_Library::Select
0115 (const TheObject& obj,
0116 Handle(TheModule)& module, Standard_Integer& CN) const
0117 {
0118 module.Nullify(); CN = 0; // Reponse "pas trouve"
0119 if (thelist.IsNull()) return Standard_False;
0120 Handle(LibCtl_Node) curr = thelist;
0121 for (curr = thelist; !curr.IsNull(); ) { // curr->Next : plus loin
0122 const Handle(TheProtocol)& protocol = curr->Protocol();
0123 if (!protocol.IsNull()) {
0124 CN = protocol->CaseNumber(obj);
0125 if (CN > 0) {
0126 module = curr->Module();
0127 return Standard_True;
0128 }
0129 }
0130 curr = curr->Next(); // cette formule est refusee dans "for"
0131 }
0132 return Standard_False; // ici, pas trouce
0133 }
0134
0135
0136 // .... Iteration ....
0137
0138 void LibCtl_Library::Start ()
0139 { thecurr = thelist; }
0140
0141 Standard_Boolean LibCtl_Library::More () const
0142 { return (!thecurr.IsNull()); }
0143
0144 void LibCtl_Library::Next ()
0145 { if (!thecurr.IsNull()) thecurr = thecurr->Next(); }
0146
0147 const Handle(TheModule)& LibCtl_Library::Module () const
0148 {
0149 if (thecurr.IsNull()) throw Standard_NoSuchObject("Library from LibCtl");
0150 return thecurr->Module();
0151 }
0152
0153 const Handle(TheProtocol)& LibCtl_Library::Protocol () const
0154 {
0155 if (thecurr.IsNull()) throw Standard_NoSuchObject("Library from LibCtl");
0156 return thecurr->Protocol();
0157 }