+/*
+ # ---------------------------------------------------------------------
+ #
+ # 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
#include "bbtkComplexBlackBoxDescriptor.h"
//#include "bbtkComplexBlackBoxInputDescriptor.h"
//#include "bbtkComplexBlackBoxOutputDescriptor.h"
+#include "creaSystem.h"
#include <list>
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);
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();
/// 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 );
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();
// 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;