-/*=========================================================================
+/*=========================================================================
Program: bbtk
Module: $RCSfile: bbtkBlackBox.h,v $
Language: C++
- Date: $Date: 2009/06/08 14:50:02 $
- Version: $Revision: 1.27 $
+ Date: $Date: 2009/06/11 09:51:42 $
+ Version: $Revision: 1.28 $
=========================================================================*/
/* ---------------------------------------------------------------------
* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
*
-* 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
+* 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.
+* 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.
-* ------------------------------------------------------------------------ */
+* ------------------------------------------------------------------------ */
/**
- * \file
- * \brief Class bbtk::BlackBox : abstract black-box interface.
+ * \file
+ * \brief Class bbtk::BlackBox : abstract black-box interface.
*/
/**
* \class bbtk::BlackBox
- * \brief Abstract black-box interface
+ * \brief Abstract black-box interface
*/
-
+
#ifndef __bbtkBlackBox_h__
#define __bbtkBlackBox_h__
namespace bbtk
{
-
+
struct Void { Void(int = 0) {} };
-
+
class Factory;
class Connection;
class BlackBoxOutputConnector;
-
+
class BBTK_EXPORT BlackBox : public Object
BBTK_ABSTRACT_OBJECT_INTERFACE(BlackBox);
- public:
+ public:
//==================================================================
// Types
typedef boost::signal<void (bbtk::BlackBox::Pointer,
const std::string&,
IOStatus)> OutputChangeSignalType;
- typedef OutputChangeSignalType::slot_function_type
+ typedef OutputChangeSignalType::slot_function_type
OutputChangeCallbackType;
-
+
/// The type of map of output connector pointers
- typedef std::map<std::string, BlackBoxOutputConnector*>
+ typedef std::map<std::string, BlackBoxOutputConnector*>
OutputConnectorMapType;
/// The type of map of input connector pointers
- typedef std::map<std::string, BlackBoxInputConnector*>
+ typedef std::map<std::string, BlackBoxInputConnector*>
InputConnectorMapType;
//==================================================================
virtual void bbExecute(bool force = false);
//@}
//==================================================================
-
-
-
+
+
+
//==================================================================
/// Returns a pointer on a clone of the box with name <name>
virtual BlackBox::Pointer bbClone(const std::string& name) = 0;
//==================================================================
-
+
//==================================================================
/// @name General accessors
virtual BlackBoxDescriptor::Pointer bbGetDescriptor() const = 0;
/// Returns the Name of the Type of the BlackBox
- const std::string& bbGetTypeName() const
+ const std::string& bbGetTypeName() const
{ return bbGetDescriptor()->GetTypeName(); }
-
-
+
+
/// Returns the name of the BlackBox (instance)
const std::string& bbGetName() const { return bbmName; }
/// Returns the name with the name of the parent prepended if any
virtual std::string bbGetNameWithParent() const;
-
+
/// Returns the parent of the BlackBox, i.e the BlackBox that contains it (0 if none)
BlackBox::Pointer bbGetParent() const { return bbmParent.lock(); }
-
+
//@}
//==================================================================
-
+
//==================================================================
/// @name Inputs/Outputs related methods
/// Gets the input type of a given label
virtual TypeInfo bbGetInputType( const std::string &label ) const;
/// Gets the status of the input called <name>
- IOStatus bbGetInputStatus( const std::string &name ) const
+ IOStatus bbGetInputStatus( const std::string &name ) const
{ return mInputConnectorMap.find(name)->second->GetStatus(); }
/// Gets the data of the input called <name>
virtual Data bbGetInput( const std::string &name ) = 0;
/// Gets the data of the input called <name> as a string using an Adaptor if possible (else returns empty string)
- std::string bbGetInputAsString( const std::string &input);
+ std::string bbGetInputAsString( const std::string &input);
+
-
/// Sets the data of the input called <name>.
/// If update_time is false then does not update ChangeTime of input
virtual void bbSetInput( const std::string &name, Data data,
bool update_time = true ) = 0;
/// [SYSTEM]: Sets the data of the input called <name> which **MUST* be a pointer
- virtual void bbBruteForceSetInputPointer( const std::string &name,
- void* data,
+ virtual void bbBruteForceSetInputPointer( const std::string &name,
+ void* data,
bool update_time = true) =0;
-
-
+
+
/// Returns true iff the BlackBox has an output of name label
virtual bool bbHasOutput(const std::string& label) const;
/// Gets the output type of a given label
virtual Data bbGetOutput( const std::string &name ) = 0;
/// Gets the data of the output called <name> as a string using an Adaptor if possible (else returns empty string)
std::string bbGetOutputAsString( const std::string &output ); //,Factory *factory);
-
+
/// Sets the data of the output called <name>
virtual void bbSetOutput( const std::string &name, Data data) = 0;
/// Returns the input connectors map
- InputConnectorMapType& bbGetInputConnectorMap()
+ InputConnectorMapType& bbGetInputConnectorMap()
{ return mInputConnectorMap; }
/// Returns the input connectors map (const)
- const InputConnectorMapType& bbGetInputConnectorMap() const
- { return mInputConnectorMap; }
+ const InputConnectorMapType& bbGetInputConnectorMap() const
+ { return mInputConnectorMap; }
/// Returns the input connector
- BlackBoxInputConnector& bbGetInputConnector(const std::string& n)
+ BlackBoxInputConnector& bbGetInputConnector(const std::string& n)
{ return *(mInputConnectorMap.find(n)->second); }
/// Returns the input connector (const)
const BlackBoxInputConnector& bbGetInputConnector(const std::string& n) const
/// Returns the output connectors map
- OutputConnectorMapType& bbGetOutputConnectorMap()
+ OutputConnectorMapType& bbGetOutputConnectorMap()
{ return mOutputConnectorMap; }
/// Returns the output connectors map (const)
- const OutputConnectorMapType& bbGetOutputConnectorMap() const
- { return mOutputConnectorMap; }
+ const OutputConnectorMapType& bbGetOutputConnectorMap() const
+ { return mOutputConnectorMap; }
/// Returns the output connector
- BlackBoxOutputConnector& bbGetOutputConnector(const std::string& n)
+ BlackBoxOutputConnector& bbGetOutputConnector(const std::string& n)
{ return *(mOutputConnectorMap.find(n)->second); }
/// Returns the output connector (const)
- const BlackBoxOutputConnector& bbGetOutputConnector(const std::string& n) const
+ const BlackBoxOutputConnector& bbGetOutputConnector(const std::string& n) const
{ return *(mOutputConnectorMap.find(n)->second); }
//@}
//==================================================================
- /// Prints the Help on the BlackBox type
+ /// Prints the Help on the BlackBox type
virtual void bbGetHelp(bool full=true) const;
//==================================================================
/// @name Output signals / observers related methods
- /// Methods related to signals emitted by outputs and the
+ /// Methods related to signals emitted by outputs and the
//@{
//==================================================================
- /// Adds the function f to the list of functions to call when
+ /// Adds the function f to the list of functions to call when
/// the output changes.
/// f is of type ChangeCallbackType which is basically:
- /// void (*ChangeCallbackType)(bbtk::BlackBox::Pointer,
+ /// void (*ChangeCallbackType)(bbtk::BlackBox::Pointer,
/// const std::string&,
/// bbtk::IOStatus)
- /// To pass a member function 'f' of an instance 'c' of a class 'C'
+ /// To pass a member function 'f' of an instance 'c' of a class 'C'
/// as callback you have to 'bind' it, i.e. call:
/// bbAddOutputObserver ( "Out", boost::bind( &C::f , c, _1, _2, _3 ) );
- /// The convenience macro BBTK_BIND_OUTPUT_OBSERVER ( c, C::f ) does it for you
- void bbAddOutputObserver(const std::string& output_name,
- OutputChangeCallbackType f);
+ /// The convenience macro BBTK_BIND_OUTPUT_OBSERVER ( c, C::f ) does it for you
+ void bbAddOutputObserver(const std::string& output_name,
+ OutputChangeCallbackType f);
- /// Removes the function f from the list of functions to call when
+ /// Removes the function f from the list of functions to call when
/// the output changes (TO WRITE)
- void bbRemoveOutputObserver(const std::string& output_name,
- OutputChangeCallbackType f);
+ void bbRemoveOutputObserver(const std::string& output_name,
+ OutputChangeCallbackType f);
//==================================================================
-
+
//==================================================================
- /// Signals that the BlackBox outputs have been modified
+ /// Signals that the BlackBox outputs have been modified
/// (without marking the box as MODIFIED because its output state is ok : don't care if you understand : use it !).
- /// This method should be used by widgets in response
+ /// This method should be used by widgets in response
/// to user interaction when **ALL** outputs have been modified
/// (after the outputs has been updated !).
/// DO NOT PASS reaction = false OR WILL NOT WORK PROPERLY
/// ** USER INTENDED **
virtual void bbSignalOutputModification(bool reaction = true);
- /// Signals that the BlackBox output "output_name" has been modified
- /// (without marking the box as MODIFIED because its output state is ok : don't care if you understand : use it !).
- /// This method should be used by widgets in response to user interaction
+ /// Signals that the BlackBox output "output_name" has been modified
+ /// (without marking the box as MODIFIED because its output state is ok : don't care if you understand : use it !).
+ /// This method should be used by widgets in response to user interaction
/// only when **ONE** output has been modified
/// (after the output has been updated !)
/// DO NOT PASS reaction = false OR WILL NOT WORK PROPERLY
/// ** USER INTENDED **
virtual void bbSignalOutputModification( const std::string& output_name,
bool reaction = true);
- /// Signals that the BlackBox vector of outputs "output_name"
+ /// Signals that the BlackBox vector of outputs "output_name"
/// have been modified.
- /// Should be used when more than ONE output is modified but not ALL
+ /// Should be used when more than ONE output is modified but not ALL
/// (optimization issue).
- /// (without marking the box as MODIFIED because its output state is ok).
- /// This method should be used by widgets in response to user interaction
+ /// (without marking the box as MODIFIED because its output state is ok).
+ /// This method should be used by widgets in response to user interaction
/// When more than one output has been changed but not all
/// (after the outputs have been updated of course!)
/// DO NOT PASS reaction = false OR WILL NOT WORK PROPERLY
/// ** USER INTENDED **
- virtual void bbSignalOutputModification( const std::vector<std::string>&
+ virtual void bbSignalOutputModification( const std::vector<std::string>&
output_name,
bool reaction = true);
//==================================================================
/// Returns the value of the output 'BoxChange'
Void bbGetOutputBoxChange() { return Void(); }
- /// Sets the value of the output 'BoxChange'
- void bbSetOutputBoxChange(Void = 0) { }
+ /// Sets the value of the output 'BoxChange'
+ void bbSetOutputBoxChange(Void = 0) { }
//@}
- //==================================================================
+ //==================================================================
+
-
- virtual void bbPrintHelp(BlackBox::Pointer parentblackbox,
+ virtual void bbPrintHelp(BlackBox::Pointer parentblackbox,
int detail, int level
);
/// Does nothing here : overloaded in ComplexBlackBox
- void bbInsertHTMLGraph( std::ofstream& s,
- int detail,
+ void bbInsertHTMLGraph( std::ofstream& s,
+ int detail,
int level,
bool instanceOrtype,
const std::string& output_dir,
- bool relative_link )
+ bool relative_link )
{}
-
+
//==================================================================
/// @name Window related methods
- //@{
+ //@{
virtual void bbSetShown(bool) {}
virtual bool bbIsShown() { return false; }
//@}
//==================================================================
+ //JCP changed to public 09-06-09
+ //==================================================================
+ /// @name Manage the execution
+ //@{
+ static bool bbGlobalGetSomeBoxExecuting();
+ static void bbGlobalSetSomeBoxExecuting(bool b);
+
+ static void bbGlobalSetFreezeExecution(bool b);
+ static bool bbGlobalGetFreezeExecution();
+
+ static void bbGlobalAddToExecutionList( BlackBox::Pointer b );
+ static void bbGlobalProcessExecutionList();
+
+ //@}
+ //JCP 09-06-09
+
protected:
//==================================================================
/// @name User redefinable methods
- /// Virtual methods which can be redefined by inherited classes
+ /// Virtual methods which can be redefined by inherited classes
//@{
//==================================================================
- /// User can redefine this method to set
+ /// User can redefine this method to set
/// the default values of the box inputs and outputs
/// (it is called in the box constructor)
virtual void bbUserSetDefaultValues() {}
- /// User can redefine this method to initialize what must be
+ /// User can redefine this method to initialize what must be
/// initialized for the box to work, for example allocate dynamic data.
/// It is called once and only once before any call to bbUserCreateWidget
/// or bbUserProcess.
- /// What has been allocated here must be desalocated in
+ /// What has been allocated here must be desalocated in
/// bbFinalizeProcessing
virtual void bbUserInitializeProcessing() {}
/// User must redefine this method to uninitialize what has been
/// initialized in bbUserInitializeProcessing,
/// typically desallocate memory that has been allocated dynamically.
- /// It is called in the box destructor if and only if (iff)
+ /// It is called in the box destructor if and only if (iff)
/// bbUserInitializeProcessing has been called previously.
virtual void bbUserFinalizeProcessing() {}
///
- //==================================================================
+ //==================================================================
- /// Write Graphviz-dot description in file.
- /// Here dumps a single box description (i/o) but overloaded
- /// in ComplexBlackBox to dump the internal pipeline representation
+ /// Write Graphviz-dot description in file.
+ /// Here dumps a single box description (i/o) but overloaded
+ /// in ComplexBlackBox to dump the internal pipeline representation
/// recursing into internal boxes descriptions if level>0.
/// detail = 1 : draw inputs and outputs (do not draw otherwise)
- /// instanceOrtype = true : draw inputs and outputs VALUES
+ /// instanceOrtype = true : draw inputs and outputs VALUES
/// (uses bbGetInputAsString / bbGetOutputAsString which use adaptors)
/// If relative_link is true then creates relative hrefs
virtual void bbWriteDotFileBlackBox(FILE *ff,
- BlackBox::Pointer parentblackbox,
- int detail, int level,
+ BlackBox::Pointer parentblackbox,
+ int detail, int level,
bool instanceOrtype,
bool relative_link );
/// Auxiliary method for bbWriteDotFileBlackBox
virtual void bbWriteDotInputOutputName(FILE *ff,
- bool inputoutput,
+ bool inputoutput,
int detail, int level);
-
-
-
- virtual BlackBox::Pointer bbFindBlackBox(const std::string &blackboxname)
+
+
+
+ virtual BlackBox::Pointer bbFindBlackBox(const std::string &blackboxname)
{ return BlackBox::Pointer();}
virtual void Check(bool recursive = true);
-
+
//==================================================================
- // PROTECTED PART : ACCESSIBLE TO THE BlackBox DEVELOPER
+ // PROTECTED PART : ACCESSIBLE TO THE BlackBox DEVELOPER
// (IN INHERITED CLASSES)
/// Constructor that take the BlackBox's name
BlackBox(const std::string &name);
- /// Constructor from an existing box (copy) with a new name
+ /// Constructor from an existing box (copy) with a new name
BlackBox(BlackBox& from, const std::string &name);
//==================================================================
/// @name Pipeline processing methods
/// Methods which participate to pipeline processing.
//@{
- //==================================================================
+ //==================================================================
/// Recursive execution method
- ///
+ ///
/// \param caller : The connection which invoked the method; null if called by bbExecute
virtual void bbRecursiveExecute(Connection::Pointer caller);
//==================================================================
-
+
//==================================================================
/// Updates the BlackBox inputs
/// Calls RecursiveExecute on all BlackBoxInputConnector
IOStatus bbUpdateInputs();
//==================================================================
-
+
//==================================================================
/// Actual CreateWindow method (vitual)
- /// Overloaded in AtomicBlacBox and descendants
+ /// Overloaded in AtomicBlacBox and descendants
virtual void bbCreateWindow()
{
// bbtkError("BlackBox::bbCreateWidget called : how can this happen ?");
}
//==================================================================
-
+
//==================================================================
/// Actual ShowWindow method (vitual)
- /// Overloaded in AtomicBlacBox and descendants
+ /// Overloaded in AtomicBlacBox and descendants
virtual void bbShowWindow()
{
// bbtkError("BlackBox::bbShowWidget called : how can this happen ?");
}
//==================================================================
-
-
+
+
//==================================================================
/// Actual processing method (vitual)
- /// Overloaded in AtomicBlacBox and descendants
- virtual void bbProcess()
+ /// Overloaded in AtomicBlacBox and descendants
+ virtual void bbProcess()
{
bbtkError("BlackBox::bbProcess called : how can this happen ?");
-// this->bbUserProcess();
+// this->bbUserProcess();
}
//==================================================================
//==================================================================
- /// Signals that the input whose connector is c has changed
+ /// Signals that the input whose connector is c has changed
/// and propagates the info downward
/// ** NOT USER INTENDED **
virtual void bbSetStatusAndPropagate(BlackBoxInputConnector* c,
IOStatus s);
//==================================================================
-
+
//==================================================================
/// Copies the values of the inputs/output from the BlackBox from
virtual void bbCopyIOValues(BlackBox& from);
//==================================================================
-
- //==================================================================
- /// Initializes processing IF NEEDED.
- /// Calls bbRecursiveInitializeProcessing if the box is in
+
+ //==================================================================
+ /// Initializes processing IF NEEDED.
+ /// Calls bbRecursiveInitializeProcessing if the box is in
/// "uninitialized" state and put it in "initialized" state.
/// On construction, boxes are "uninitialized".
/// See also bbFinalizeProcessing
void bbInitializeProcessing();
/// Finalizes processing IF NEEDED.
- /// Calls bbRecursiveFinalizeProcessing if the box is in
+ /// Calls bbRecursiveFinalizeProcessing if the box is in
/// "initialized" state and put it in "uninitialized" state.
/// On construction, boxes are "uninitialized".
/// See also bbInitializeProcessing
void bbFinalizeProcessing();
- /// Abstract prototype of the method which
+ /// Abstract prototype of the method which
/// Recursively calls itself for the parent black box and then
- /// calls bbUserInitializeProcessing for its own class.
+ /// calls bbUserInitializeProcessing for its own class.
/// It is redefined in each black box descendant.
/// Allows to call bbUserInitializeProcessing for all inherited classes
/// (like a constructor does)
virtual void bbRecursiveInitializeProcessing() {}
- /// Abstract prototype of the method which
- /// calls bbUserFinalizeProcessing for its own class and then
+ /// Abstract prototype of the method which
+ /// calls bbUserFinalizeProcessing for its own class and then
/// recursively calls itself for the parent black box.
/// It is redefined in each black box descendant.
/// Allows to call bbUserFinalizeProcessing for all inherited classes
-
private:
//==================================================================
friend class Connection;
/// Sets the parent of the BlackBox
void bbSetParent(BlackBox::Pointer p) { bbmParent = p; }
-
+
//==================================================================
/// @name Input/output connection/disconnection
/// INTERNAL METHODS used by a Connection to connect/disconnect
//@{
/// Connects the input <name> to the connection c
- virtual void bbConnectInput( const std::string& name,
+ virtual void bbConnectInput( const std::string& name,
Connection* c);
/// Connects the output <name> to the connection c
- virtual void bbConnectOutput( const std::string& name,
+ virtual void bbConnectOutput( const std::string& name,
Connection* c);
/// Disconnects the input <name> from the connection c
- virtual void bbDisconnectInput( const std::string& name,
+ virtual void bbDisconnectInput( const std::string& name,
Connection* c);
/// Disconnects the output <name> from the connection c
- virtual void bbDisconnectOutput( const std::string& name,
+ virtual void bbDisconnectOutput( const std::string& name,
Connection* c);
//@}
//==================================================================
/// Returns true if the box can "react",
- /// which means execute in response to an input change
+ /// which means execute in response to an input change
virtual bool bbCanReact() const;
- //==================================================================
- /// @name Manage the execution
- //@{
- static bool bbGlobalGetSomeBoxExecuting();
- static void bbGlobalSetSomeBoxExecuting(bool b);
- static void bbGlobalSetFreezeExecution(bool b);
- static bool bbGlobalGetFreezeExecution();
- static void bbGlobalAddToExecutionList( BlackBox::Pointer b );
- static void bbGlobalProcessExecutionList();
-
- //@}
-
/// Returns true iff the box is executing
bool bbGetExecuting() const { return bbmExecuting; }
/// Sets the bbmExecuting bool returned by bbGetExecuting
- protected:
+ protected:
//==================================================================
protected:
//==================================================================
- /// Black box objects have a special deleter
- /// which must take care of releasing the descriptor
- /// **AFTER** the box is deleted
+ /// Black box objects have a special deleter
+ /// which must take care of releasing the descriptor
+ /// **AFTER** the box is deleted
/// (Releasing it in the destructor may cause dl close and crash)
- /// Black box deleter
+ /// Black box deleter
/// 1) Calls the user overloadable bbDelete method
/// 2) Releases the box descriptor
struct BBTK_EXPORT Deleter : public Object::Deleter
- {
- Deleter();
+ {
+ Deleter();
int Delete(Object* p);
};
//==================================================================
//==================================================================
private:
//==================================================================
-
+
//==================================================================
// ATTRIBUTES
/// Is the box initialized ?
/// The name of the package to which it belongs
std::string bbmPackageName;
/// The box processing mode
- /// 0 : "Pipeline" mode
- /// 1 : "Always" mode
- /// 2 : "Reactive" mode
+ /// 0 : "Pipeline" mode
+ /// 1 : "Always" mode
+ /// 2 : "Reactive" mode
std::string bbmBoxProcessMode;
/// The parent of the black box in the ComplexBlackBox hierarchy
BlackBox::WeakPointer bbmParent;
//==================================================================
// ATTRIBUTES
/// Map that contains the output connectors of the black box
- OutputConnectorMapType mOutputConnectorMap;
+ OutputConnectorMapType mOutputConnectorMap;
/// Map that contains the input connectors of the black box
InputConnectorMapType mInputConnectorMap;
//==================================================================
-
+
}
// namespace bbtk
#endif