]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkBlackBox.cxx
=== MAJOR RELEASE ====
[bbtk.git] / kernel / src / bbtkBlackBox.cxx
index 9a62efb37ca3b78c4c57837b31098169cc361366..58ae9594c317d3447ce6112633eeb90dbdec934b 100644 (file)
@@ -3,8 +3,8 @@
 Program:   bbtk
 Module:    $RCSfile: bbtkBlackBox.cxx,v $
 Language:  C++
-Date:      $Date: 2008/04/09 11:16:57 $
-Version:   $Revision: 1.9 $
+Date:      $Date: 2008/04/18 12:59:15 $
+Version:   $Revision: 1.10 $
                                                                                 
 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
 l'Image). All rights reserved. See doc/license.txt or
@@ -36,21 +36,69 @@ PURPOSE.  See the above copyright notices for more information.
 namespace bbtk
 {
 
-//EED
+
   static bool bbmgSomeBoxExecuting = false;
   static bool bbmgFreezeExecution = false;
-  static std::set<BlackBox*> bbmgExecutionList;
+  static std::set<BlackBox::Pointer> bbmgExecutionList;
 
+  //=========================================================================
+  BlackBox::Deleter::Deleter()
+  {
+  }
+  //=========================================================================
+  
+  //=========================================================================
+  void BlackBox::Deleter::Delete(Object* p)
+  {
+    BlackBox* b = dynamic_cast<BlackBox*>(p);
+    if (!b)
+      {
+       bbtkInternalError("BlackBox::Deleter::Delete("<<p->GetObjectName()
+                         <<"["<<p<<"]) : "
+                         <<"dynamic cast to BlackBox* failed !");
+      }
+    std::string name = p->GetObjectName();//b->bbGetNameWithParent();
+    bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\")"<<std::endl);
+
+
+    BlackBoxDescriptor::WeakPointer desc = b->bbGetDescriptor();
+    bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : deleting black box"<<std::endl);
+    
+    b->bbDelete();
+    
+    bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : releasing descriptor ["<<desc.lock()<<"]"<<std::endl);
+    
+    if (!desc.expired()) 
+      {
+       Package::WeakPointer pack = desc.lock()->GetPackage();
+       if (!pack.expired()) 
+         {
+           Package::ReleaseBlackBoxDescriptor(pack,desc);
+         }
+       else 
+         {
+           bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : descriptor package expired (was not held by a package and the box was the last instance)"<<std::endl);
+         }
+      }
+    else
+      {
+       bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : descriptor expired : nothing to do (was not held by a package or the box is a complex black box prototype)"<<std::endl);
+      }
+    bbtkDebugMessage("object",2,"<## BlackBox::Deleter(\""<<name<<"\")"<<std::endl);
+  }
+  //=========================================================================
 
   //=========================================================================
   BlackBox::BlackBox(const std::string &name) 
     : bbmName(name), 
       bbmStatus(MODIFIED), 
       bbmBoxProcessMode("Pipeline"),
-      bbmParent(NULL),
+      bbmParent(),
       bbmExecuting(false)
   {
-    bbtkDebugMessage("Kernel",7,"BlackBox::BlackBox(\""
+    bbtkDebugMessage("object",4,"==> BlackBox::BlackBox(\""
+                    <<name<<"\")"<<std::endl);
+    bbtkDebugMessage("object",4,"<== BlackBox::BlackBox(\""
                     <<name<<"\")"<<std::endl);
   }
   //=========================================================================
@@ -61,10 +109,13 @@ namespace bbtk
     : bbmName(name), 
       bbmStatus(from.bbmStatus), 
       bbmBoxProcessMode(from.bbmBoxProcessMode),
-      bbmParent(NULL),
+      bbmParent(),
       bbmExecuting(false)
   {
-    bbtkDebugMessage("Kernel",7,"BlackBox::BlackBox("
+    bbtkDebugMessage("object",4,"==> BlackBox::BlackBox("
+                    <<from.bbGetFullName()<<",\""
+                    <<name<<"\")"<<std::endl);
+    bbtkDebugMessage("object",4,"<== BlackBox::BlackBox("
                     <<from.bbGetFullName()<<",\""
                     <<name<<"\")"<<std::endl);
   }
@@ -74,22 +125,11 @@ namespace bbtk
   //=========================================================================
   BlackBox::~BlackBox()
   {
-    //    std::cout << "EED BlackBox::~BlackBox 01 [" << bbGetName()<<"]\n";
-    bbtkDebugMessageInc("Kernel",7,"BlackBox::~BlackBox()"<<std::endl);
+    bbtkDebugMessage("object",4,"==> BlackBox::~BlackBox() ["<<bbmName
+                    <<"]"<<std::endl);
     this->bbDesallocateConnectors();
-    //printf("EED BlackBox::~BlackBox 02 \n");
-    bbtkDebugDecTab("Kernel",7);
-  }
-  //=========================================================================
-
-  //=========================================================================
-  /// Destruction method of a black box
-  void BlackBox::bbDelete()
-  {
-    bbtkDebugMessage("Kernel",1,"BlackBox::bbDelete() ["
-                    <<bbGetFullName()<<"]"<<std::endl);    
-    bbGetDescriptor()->UnReference();
-    this->bbUserDelete();
+    bbtkDebugMessage("object",4,"<== BlackBox::~BlackBox() ["<<bbmName
+                    <<"]"<<std::endl);
   }
   //=========================================================================
 
@@ -115,7 +155,7 @@ namespace bbtk
     if (force) bbSetModifiedStatus();
 
     // Calls the main recursive update method 
-    bbBackwardUpdate(0);
+    bbBackwardUpdate(Connection::Pointer());
 
     Wx::EndBusyCursor();
 
@@ -128,7 +168,7 @@ namespace bbtk
   //=========================================================================
   std::string BlackBox::bbGetFullName() const
   { 
-    return bbGetNameWithParent()+"<"+this->bbGetDescriptor()->GetTypeName()+">";
+    return this->bbGetNameWithParent()+"<"+this->bbGetDescriptor()->GetTypeName()+">";
   }
   //=========================================================================
      
@@ -138,9 +178,9 @@ namespace bbtk
   /// Returns the name with the name of the parent prepended if any
   std::string BlackBox::bbGetNameWithParent() const
   {
-    if (bbmParent) 
+    if (bbmParent.lock()
       {
-       return bbmParent->bbGetNameWithParent() + ":" + bbmName;
+       return bbmParent.lock()->bbGetNameWithParent() + ":" + bbmName;
       }
     else 
       {
@@ -230,7 +270,7 @@ namespace bbtk
       {                                                                        
        bbtkDebugMessage("Kernel",8,"* Allocate \""<<i->first<<"\""<<std::endl);
        bbGetInputConnectorMap()[i->second->GetName()] 
-         = new BlackBoxInputConnector(this);
+         = new BlackBoxInputConnector(GetThisPointer<BlackBox>());
       }                                                                        
     const BlackBoxDescriptor::OutputDescriptorMapType& omap 
       = bbGetDescriptor()->GetOutputDescriptorMap();                  
@@ -399,7 +439,7 @@ namespace bbtk
        bbtkDebugMessage("Process",9,
                         "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
        this->bbSetStatus(MODIFIED); 
-        bbGlobalAddToExecutionList( this );
+        bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
       }
     else if ( bbGetStatus() == MODIFIED ) //! this->bbIsUptodate()) 
       { 
@@ -562,7 +602,7 @@ namespace bbtk
  
   //=========================================================================
   /// Connects the input <name> to the connection c
-  void BlackBox::bbConnectInput( const std::string& name, Connection* c)
+  void BlackBox::bbConnectInput( const std::string& name, Connection::Pointer c)
   {
     bbtkDebugMessageInc("Kernel",7,
                        "BlackBox::bbConnectInput(\""<<name<<"\","<<c<<") ["
@@ -584,7 +624,7 @@ namespace bbtk
 
   //=========================================================================  
   /// Connects the output <name> to the connection c
-  void BlackBox::bbConnectOutput( const std::string& name, Connection* c)
+  void BlackBox::bbConnectOutput( const std::string& name, Connection::Pointer c)
   {
     bbtkDebugMessageInc("Kernel",7,
                        "BlackBox::bbConnectOutput(\""<<name<<"\","<<c<<") ["
@@ -604,8 +644,9 @@ namespace bbtk
 
   //=========================================================================
   /// Disconnects the input <name> from the connection c
-  void BlackBox::bbDisconnectInput( const std::string& name, Connection* c)
+  void BlackBox::bbDisconnectInput( const std::string& name, Connection::Pointer c)
   {
+    if (!c) return;
     bbtkDebugMessageInc("Kernel",7,
                        "BlackBox::bbDisconnectInput(\""<<name
                        <<"\","<<c<<") ["
@@ -626,8 +667,9 @@ namespace bbtk
 
   //=========================================================================
   /// Disconnects the output <name> from the connection c
-  void BlackBox::bbDisconnectOutput( const std::string& name, Connection* c)
+  void BlackBox::bbDisconnectOutput( const std::string& name, Connection::Pointer c)
   {
+    if (!c) return;
     bbtkDebugMessageInc("Kernel",7,
                        "BlackBox::bbDisconnectOutput(\""<<name
                        <<"\","<<c<<") ["
@@ -663,11 +705,11 @@ namespace bbtk
     if (bbGetOutputType(output).name() != typeid(std::string).name() ) 
       {
        // Look for factory 
-       Package* p = bbGetDescriptor()->GetPackage();
+       Package::Pointer p = bbGetDescriptor()->GetPackage();
        if ((p != 0) && ( ! p->GetFactorySet().empty() ) )
          {
-           Factory* f = *p->GetFactorySet().begin();
-           BlackBox* a = 0;
+           Factory::Pointer f = p->GetFactorySet().begin()->lock();
+           BlackBox::Pointer a;
            try
              {
                a = f->NewAdaptor(  
@@ -677,7 +719,7 @@ namespace bbtk
              } catch (bbtk::Exception e) 
              {
              }
-           if (a!=NULL){
+           if (a){
              //                        bbUpdate();
              a->bbSetInput("In",bbGetOutput(output));
              a->bbExecute();
@@ -708,11 +750,11 @@ namespace bbtk
     if (bbGetInputType(input) != typeid(std::string)) 
       {
        // Look for factory 
-       Package* p = bbGetDescriptor()->GetPackage();
+       Package::Pointer p = bbGetDescriptor()->GetPackage();
        if ((p != 0) && ( ! p->GetFactorySet().empty() ) )
          {
-           Factory* f = *p->GetFactorySet().begin();
-           BlackBox* a = 0;
+           Factory::Pointer f = p->GetFactorySet().begin()->lock();
+           BlackBox::Pointer a;
            try
              {
                a = f->NewAdaptor(  
@@ -722,7 +764,7 @@ namespace bbtk
              }catch (bbtk::Exception e) 
              {
              }
-           if (a!=NULL)
+           if (a)
              {
                //                      bbUpdate();
                a->bbSetInput("In",bbGetInput(input));
@@ -788,7 +830,7 @@ namespace bbtk
   //=========================================================================
   /// Write Graphviz-dot description in file
   void BlackBox::bbWriteDotFileBlackBox(FILE *ff,
-                                       BlackBox *parentblackbox, 
+                                       BlackBox::Pointer parentblackbox, 
                                        int detail, int level,
                                        bool instanceOrtype,
                                        bool relative_link )
@@ -871,15 +913,15 @@ namespace bbtk
     //    std::cout  << labelStr << std::endl;
 
     // Relation Input
-    if (this!=parentblackbox){
+    if (GetThisPointer<BlackBox>()!=parentblackbox){
       for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i ) 
        {
          if (i->second)
            {
-             Connection* con = i->second->GetConnection();
+             Connection::Pointer con = i->second->GetConnection();
              if (con!=NULL){
-               BlackBox *a=con->GetBlackBoxFrom();
-               BlackBox *b=con->GetBlackBoxTo();
+               BlackBox::Pointer a=con->GetBlackBoxFrom();
+               BlackBox::Pointer b=con->GetBlackBoxTo();
                fprintf(ff,"  ");
                a->bbWriteDotInputOutputName(ff,false,detail,level);
                if (detail==1)
@@ -904,7 +946,7 @@ namespace bbtk
 
 
   //=========================================================================
-  void BlackBox::bbShowRelations(BlackBox *parentblackbox, 
+  void BlackBox::bbShowRelations(BlackBox::Pointer parentblackbox, 
                                 int detail, int level
                                 /*,Factory *factory*/ )
   {
@@ -937,7 +979,7 @@ namespace bbtk
        ivalue.push_back(bbGetInputAsString(i->first));
        if (ivalue.back().size()>valuelmax) valuelmax = ivalue.back().size();
        std::string s("");
-       Connection* con = i->second->GetConnection();
+       Connection::Pointer con = i->second->GetConnection();
        if (con!=0){
          s = con->GetBlackBoxFrom()->bbGetName();
          s += ".";
@@ -956,14 +998,15 @@ namespace bbtk
        ovalue.push_back(bbGetOutputAsString(o->first));
        if (ovalue.back().size()>valuelmax) valuelmax = ovalue.back().size();
        std::vector<std::string> ss;
-       const std::vector<Connection*>& con = o->second->GetConnectionVector();
-       std::vector<Connection*>::const_iterator c;
+       const std::vector<Connection::WeakPointer>& con 
+         = o->second->GetConnectionVector();
+       std::vector<Connection::WeakPointer>::const_iterator c;
        for (c=con.begin();c!=con.end();++c) 
          {
            std::string s;
-           s = (*c)->GetBlackBoxTo()->bbGetName();
+           s = (*c).lock()->GetBlackBoxTo()->bbGetName();
            s += ".";
-           s += (*c)->GetBlackBoxToInput();
+           s += (*c).lock()->GetBlackBoxToInput();
            ss.push_back(s);
        }  // if con
        oconn.push_back(ss);
@@ -1032,7 +1075,7 @@ namespace bbtk
                         "=> BlackBox::bbGlobalProcessExecutionList()"
                         <<std::endl);     
      
-     std::set<BlackBox*>::iterator i;
+     std::set<BlackBox::Pointer>::iterator i;
      for (i=bbmgExecutionList.begin();
          i!=bbmgExecutionList.end();
          ++i)
@@ -1071,7 +1114,7 @@ namespace bbtk
                return bbmgFreezeExecution; 
        }
 
-    void BlackBox::bbGlobalAddToExecutionList( BlackBox* b )
+  void BlackBox::bbGlobalAddToExecutionList( BlackBox::Pointer b )
        {  
                bbmgExecutionList.insert(b); 
        } 
@@ -1094,6 +1137,8 @@ namespace bbtk
   }
   //=========================================================================
 
+
+
 }  // EO namespace bbtk
 
 // EOF