Program: bbtk
Module: $RCSfile: bbtkBlackBox.h,v $
Language: C++
- Date: $Date: 2008/04/09 11:16:57 $
- Version: $Revision: 1.5 $
+ Date: $Date: 2008/06/19 09:46:41 $
+ Version: $Revision: 1.11 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See doc/license.txt or
#include "bbtkSystem.h"
#include "bbtkBlackBoxDescriptor.h"
-//#include "bbtkConnection.h"
#include "bbtkBlackBoxInputConnector.h"
#include "bbtkBlackBoxOutputConnector.h"
#include <set>
struct Void { Void(int = 0) {} };
class Factory;
+ class Connection;
- class BBTK_EXPORT BlackBox
+ class BBTK_EXPORT BlackBox : public Object
{
-
-
+ BBTK_ABSTRACT_OBJECT_INTERFACE(BlackBox);
public:
//==================================================================
// INTERFACE
//==================================================================
- /// The type of pointer on a BlackBox
- typedef BlackBox* Pointer;
-
+
/// The type of map of output connector pointers
typedef std::map<std::string, BlackBoxOutputConnector*>
OutputConnectorMapType;
InputConnectorMapType;
/// Returns the pointer on the descriptor of the box
- virtual BlackBoxDescriptor* bbGetDescriptor() const = 0;
+ virtual BlackBoxDescriptor::Pointer bbGetDescriptor() const = 0;
/// Returns a pointer on a clone of the box with name <name>
- virtual BlackBox* bbClone(const std::string& name) = 0;
+ virtual BlackBox::Pointer bbClone(const std::string& name) = 0;
- /// Destruction method of a black box
- virtual void bbDelete();
/// User overloadable destruction method of a black box
virtual void bbUserDelete();
virtual std::string bbGetFullName() const;
/// Returns the name with the name of the parent prepended if any
- std::string bbGetNameWithParent() const;
+ virtual std::string bbGetNameWithParent() const;
- /// Sets the parent of the BlackBox
- void bbSetParent(BlackBox::Pointer p) { bbmParent = p; }
/// Returns the parent of the BlackBox, i.e the BlackBox that contains it (0 if none)
- BlackBox::Pointer bbGetParent() const { return bbmParent; }
+ BlackBox::Pointer bbGetParent() const { return bbmParent.lock(); }
/// Main processing method of the box.
/// Sets the data of the output called <name>
virtual void bbSetOutput( const std::string &name, Data data) = 0;
- /// 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);
-
- /// Disconnects the input <name> from the connection c
- virtual void bbDisconnectInput( const std::string& name, Connection* c);
- /// Disconnects the output <name> from the connection c
- virtual void bbDisconnectOutput( const std::string& name, Connection* c);
/// Returns the input connectors map
InputConnectorMapType& bbGetInputConnectorMap()
/// (uses bbGetInputAsString / bbGetOutputAsString which use adaptors)
/// If relative_link is true then creates relative hrefs
virtual void bbWriteDotFileBlackBox(FILE *ff,
- BlackBox *parentblackbox,
+ BlackBox::Pointer parentblackbox,
int detail, int level,
bool instanceOrtype,
bool relative_link );
int detail, int level);
- virtual void bbShowRelations(BlackBox *parentblackbox,
+ virtual void bbShowRelations(BlackBox::Pointer parentblackbox,
int detail, int level
);
std::string bbGetOutputAsString( const std::string &output ); //,Factory *factory);
std::string bbGetInputAsString( const std::string &input); //,Factory *factory);
- virtual BlackBox *bbFindBlackBox(const std::string &blackboxname) { return NULL;}
+ virtual BlackBox::Pointer bbFindBlackBox(const std::string &blackboxname)
+ { return BlackBox::Pointer();}
virtual void Check(bool recursive = true);
+ virtual void bbUserOnShow() { }
+ void bbUserOnShowWidget(std::string nameInput);
+
+
protected:
//==================================================================
// PROTECTED PART : ACCESSIBLE TO THE BlackBox DEVELOPER
BlackBox(const std::string &name);
/// Constructor from an existing box (copy) with a new name
BlackBox(BlackBox& from, const std::string &name);
- /// Destructor
- virtual ~BlackBox();
//==================================================================
void bbSetStatus( IOStatus t) { bbmStatus = t; }
//==================================================================
+ private:
+ friend class Connection;
+ friend class ComplexBlackBox;
+
+ /// Sets the parent of the BlackBox
+ void bbSetParent(BlackBox::Pointer p) { bbmParent = p; }
+
+
+ /// 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);
+ /// Disconnects the input <name> from the connection c
+ virtual void bbDisconnectInput( const std::string& name,
+ Connection* c);
+ /// Disconnects the output <name> from the connection c
+ virtual void bbDisconnectOutput( const std::string& name,
+ Connection* c);
+
/// @name Pipeline processing methods
/// - calls bbProcess which is the user callback which does the actual processing
/// - calls bbUpdateChildren
/// - calls bbShowWidget which shows the widget associated to the box (if any)
- public:
- virtual IOStatus bbBackwardUpdate(Connection* caller) = 0;
+ protected:
+ virtual IOStatus bbBackwardUpdate(Connection::Pointer caller) = 0;
//==================================================================
//==================================================================
/// - calls bbCreateWidget
/// - calls bbProcess which is the user callback which does the actual processing
/// - calls bbUpdateChildren which recursively calls bbForwardUpdate on connections attached the "Child" output
- // virtual void bbForwardUpdate(Connection* caller) = 0;
+ // virtual void bbForwardUpdate(Connection::Pointer caller) = 0;
//==================================================================
protected:
//==================================================================
//==================================================================
/// Updates the pipeline in upstream-downstream direction along the "Child"-"Parent" connections only.
/// Does nothing here. Overloaded in WxContainerBlackbox
- //virtual void bbUpdateChildren( Connection* caller ) { }
+ //virtual void bbUpdateChildren( Connection::Pointer caller ) { }
//==================================================================
//==================================================================
/// Shows the window associated to the box
/// (called after bbProcess during bbExecute)
/// Does nothing here but overloaded in WxBlackBox and WxContainerBlackBox
- virtual void bbShowWindow(Connection* caller) { }
-
+ virtual void bbShowWindow(Connection::Pointer caller) { }
+
virtual void bbHideWindow() {}
+ virtual void bbCloseWindow() { }
//==================================================================
//@}
/// which means execute in response to an input change
virtual bool bbCanReact() const;
-
- static void bbGlobalAddToExecutionList( BlackBox* b );
+ protected:
+ static void bbGlobalAddToExecutionList( BlackBox::Pointer b );
static void bbGlobalProcessExecutionList();
//==================================================================
virtual void bbCopyIOValues(BlackBox& from);
//==================================================================
- bool bbGetExecuting() const { return bbmExecuting; }
- void bbSetExecuting(bool b) { bbmExecuting = b; }
-
+ // 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
+ /// 1) Calls the user overloadable bbDelete method
+ /// 2) Releases the box descriptor
+ struct BBTK_EXPORT Deleter : public Object::Deleter
+ {
+ Deleter();
+ void Delete(Object* p);
+ };
+
+ template <class U>
+ static boost::shared_ptr<U> MakeBlackBoxPointer(U* s, bool lock = false)
+ {
+ return MakePointer(s,BlackBox::Deleter(),lock);
+ }
+
+ virtual void bbDelete() { delete this; }
private:
//==================================================================
// PRIVATE PART
- /// Default constructor is private : derived classes must use the constructor with the BlackBox's name
- BlackBox() {}
- BlackBox(const BlackBox&) {}
/// The status of the box
IOStatus bbmStatus;
/// The name of the black-box
std::string bbmBoxProcessMode;
/// The parent of the black box in the ComplexBlackBox hierarchy
- BlackBox::Pointer bbmParent;
+ BlackBox::WeakPointer bbmParent;
//==================================================================
- //==================================================================
- // Am I executing (to test pipeline cycles) ?
- bool bbmExecuting;
- //==================================================================
//==================================================================
// ATTRIBUTES