]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkComplexBlackBox.h
Feature #1774
[bbtk.git] / kernel / src / bbtkComplexBlackBox.h
index ae8a82af7c09dd4fdc3c4fb5e07c4ef234fa39c8..dff11f666ec7aadfa0bc5a75e4e2312ab736f70c 100644 (file)
@@ -1,21 +1,41 @@
+/*
+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ #                        pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ #  This software is governed by the CeCILL-B license under French law and
+ #  abiding by the rules of distribution of free software. You can  use,
+ #  modify and/ or redistribute the software under the terms of the CeCILL-B
+ #  license as circulated by CEA, CNRS and INRIA at the following URL
+ #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ #  or in the file LICENSE.txt.
+ #
+ #  As a counterpart to the access to the source code and  rights to copy,
+ #  modify and redistribute granted by the license, users are provided only
+ #  with a limited warranty  and the software's author,  the holder of the
+ #  economic rights,  and the successive licensors  have only  limited
+ #  liability.
+ #
+ #  The fact that you are presently reading this means that you have had
+ #  knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
+
+
 /*=========================================================================
-                                                                                
   Program:   bbtk
   Module:    $RCSfile: bbtkComplexBlackBox.h,v $
   Language:  C++
-  Date:      $Date: 2008/01/22 15:02:00 $
-  Version:   $Revision: 1.1 $
-                                                                                
-  Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
-  l'Image). All rights reserved. See Doc/License.txt or
-  http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
-                                                                                
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notices for more information.
-                                                                                
+  Date:      $Date: 2012/11/16 08:49:01 $
+  Version:   $Revision: 1.9 $
 =========================================================================*/
 
+                                                                   
+
+
 
 /**
  *  \file 
@@ -34,6 +54,7 @@
 #include "bbtkComplexBlackBoxDescriptor.h"
 //#include "bbtkComplexBlackBoxInputDescriptor.h"
 //#include "bbtkComplexBlackBoxOutputDescriptor.h"
+#include "creaSystem.h"
 #include <list>
 
 namespace bbtk
@@ -44,14 +65,27 @@ namespace bbtk
   //==================================================================
   class BBTK_EXPORT ComplexBlackBox : public bbtk::BlackBox
   {
+    BBTK_OBJECT_INTERFACE(ComplexBlackBox);
     friend class ComplexBlackBoxDescriptor;
+    typedef BlackBox Superclass;
   public: 
     //==================================================================
     // PUBLIC PART : ACCESSIBLE TO THE END-USER
     /// Returns the pointer on the box' descriptor
-    BlackBoxDescriptor* bbGetDescriptor() const { return mDescriptor; }
+    BlackBoxDescriptor::Pointer bbGetDescriptor() const { return mDescriptor.lock(); }
+    /// Returns a pointer on a new instance with name <name>
+    //BlackBox* bbNew(const std::string& name);
     /// Returns a pointer on a clone of the box with name <name>
-    BlackBox* bbClone(const std::string& name);
+    BlackBox::Pointer bbClone(const std::string& name);
+
+    /// Clear
+    void Clear();
+    /// Set as prototype
+    void SetAsPrototype() { mLockedDescriptor.reset(); }
+    /// Returns true if it is a prototype 
+    bool IsAPrototype() const { return (!mLockedDescriptor); }
+
+    std::string bbGetNameWithParent() const;
 
     void bbExecute(bool force = false);
   
@@ -64,14 +98,17 @@ namespace bbtk
                                      void* data, 
                                      bool setModified = true);
 
-    ~ComplexBlackBox();
+     /// Connects the input <name> to the connection c
+    virtual void bbConnectInput( const std::string& name, Connection* c);
+    /// Connects the output <name> to the connection c
+    virtual void bbConnectOutput( const std::string& name, Connection* c);
 
-    BlackBox* bbGetBlackBox( const std::string& name );
+    BlackBox::Pointer bbGetBlackBox( const std::string& name );
 
-    const std::map<std::string, BlackBox*>& bbGetBlackBoxMap() 
-    { 
-      return mBlackBoxMap;
-    }
+    /// The type of map of black boxes
+    typedef std::map<std::string, BlackBox::Pointer> BlackBoxMapType;
+
+    const BlackBoxMapType& bbGetBlackBoxMap() { return mBlackBoxMap; }
 
     void bbPrintBlackBoxes();
 
@@ -93,7 +130,7 @@ namespace bbtk
     /// Generates own description and recursively calls itself 
     /// on internal boxes with level-1 
     virtual void bbWriteDotFileBlackBox(FILE *ff,
-                                       BlackBox *parentblackbox, 
+                                       BlackBox::Pointer parentblackbox, 
                                        int detail, int level,
                                        bool instanceOrtype,
                                        bool relative_link );
@@ -102,37 +139,41 @@ namespace bbtk
                                           bool inputoutput, 
                                           int detail, int level);
     
-    virtual BlackBox *bbFindBlackBox(const std::string &blackboxname);
+    virtual BlackBox::Pointer bbFindBlackBox(const std::string &blackboxname);
     
 
+    void Check(bool recursive=true);
+
+       
 
   protected:
     //==================================================================
     // PROTECTED PART : ACCESSIBLE TO ComplexBlackBoxDescriptor
+    static ComplexBlackBox::Pointer 
+    New(const std::string &name,
+       ComplexBlackBoxDescriptor::Pointer desc);
+                                
+  private:                      
     ///  Constructor that takes the ComplexBlackBox name
-    ComplexBlackBox(const std::string &name, ComplexBlackBoxDescriptor* desc);
+    ComplexBlackBox(const std::string &name,
+                   ComplexBlackBoxDescriptor::Pointer desc);
     /// Constructor from an existing box (copy) with a new name 
     ComplexBlackBox(ComplexBlackBox& from, const std::string &name);
-
     
-  public:
-    IOStatus bbBackwardUpdate(Connection* caller);
-    //  void bbForwardUpdate(Connection* caller);
-    void bbSetModifiedStatus(BlackBoxInputConnector* c);
-
   protected:
   
 
 
-    void bbAddBlackBox( BlackBox* );
+    void bbAddBlackBox( BlackBox::Pointer );
     void bbAddToExecutionList( const std::string& name );
-    void bbUnsafeAddBlackBox( BlackBox* );
-    void bbRemoveBlackBox( const std::string& name );
-    void bbAddConnection( Connection* );
+    void bbUnsafeAddBlackBox( BlackBox::Pointer );
+    void bbRemoveBlackBox( const std::string& name, 
+                          bool remove_connections = true);
+    void bbAddConnection( Connection::Pointer );
     
     //    void RemoveConnection( );
 
-    BlackBox* bbUnsafeGetBlackBox( const std::string& name );
+    BlackBox::Pointer bbUnsafeGetBlackBox( const std::string& name );
 
     /// 
     void bbAllocateConnectors();
@@ -143,19 +184,22 @@ namespace bbtk
     // PRIVATE PART : MEMBERS AND USEFULL INTERNAL METHODS
 
     /// Default constructor : derived classes must use the constructor with the ComplexBlackBox's name
-    ComplexBlackBox() : BlackBox("") {}
+    //ComplexBlackBox() : BlackBox("") {}
     
+    // true if the box is a prototype of a ComplexBlackBoxDescriptor
+    //    bool mIsAPrototype;
+
+    /// The descriptor pointer : is 0 if the box is a prototype 
+    ComplexBlackBoxDescriptor::Pointer mLockedDescriptor;
     /// The descriptor pointer
-    ComplexBlackBoxDescriptor* mDescriptor;
+    ComplexBlackBoxDescriptor::WeakPointer mDescriptor;
     
-    /// The type of map of black boxes
-    typedef std::map<std::string, BlackBox*> BlackBoxMapType;
     /// The map of black boxes
     BlackBoxMapType mBlackBoxMap;
     
     
     /// The type of list of connections
-    typedef std::list<Connection*> ConnectionListType;
+    typedef std::list<Connection::Pointer> ConnectionListType;
     /// The list of connections
     ConnectionListType mConnectionList;