X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkBlackBox.h;h=04843d24cb5224655b7a433c0cdb9363228f9e3d;hb=4ad5b5ee44357ad873bc8c43230defb6d0a79879;hp=f160dd574031f98133aa0cca4b583028f0b02b2b;hpb=c2a4b1893412e50a3d9abff221938a2d16c4a7cb;p=bbtk.git diff --git a/kernel/src/bbtkBlackBox.h b/kernel/src/bbtkBlackBox.h index f160dd5..04843d2 100644 --- a/kernel/src/bbtkBlackBox.h +++ b/kernel/src/bbtkBlackBox.h @@ -3,8 +3,8 @@ Program: bbtk Module: $RCSfile: bbtkBlackBox.h,v $ Language: C++ - Date: $Date: 2008/04/09 11:16:57 $ - Version: $Revision: 1.5 $ + Date: $Date: 2008/04/18 12:59:15 $ + Version: $Revision: 1.6 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See doc/license.txt or @@ -32,7 +32,6 @@ #include "bbtkSystem.h" #include "bbtkBlackBoxDescriptor.h" -//#include "bbtkConnection.h" #include "bbtkBlackBoxInputConnector.h" #include "bbtkBlackBoxOutputConnector.h" #include @@ -45,17 +44,14 @@ namespace bbtk class Factory; - 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 OutputConnectorMapType; @@ -64,14 +60,13 @@ namespace bbtk 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 - 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 + /// UNUSED FOR THE MOMENT virtual void bbUserDelete(); /// Returns the Name of the Type of the BlackBox @@ -86,12 +81,12 @@ namespace bbtk 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. @@ -152,14 +147,17 @@ bool reaction = true); virtual void bbSetOutput( const std::string &name, Data data) = 0; /// Connects the input to the connection c - virtual void bbConnectInput( const std::string& name, Connection* c); + virtual void bbConnectInput( const std::string& name, + Connection::Pointer c); /// Connects the output to the connection c - virtual void bbConnectOutput( const std::string& name, Connection* c); - + virtual void bbConnectOutput( const std::string& name, + Connection::Pointer c); /// Disconnects the input from the connection c - virtual void bbDisconnectInput( const std::string& name, Connection* c); + virtual void bbDisconnectInput( const std::string& name, + Connection::Pointer c); /// Disconnects the output from the connection c - virtual void bbDisconnectOutput( const std::string& name, Connection* c); + virtual void bbDisconnectOutput( const std::string& name, + Connection::Pointer c); /// Returns the input connectors map InputConnectorMapType& bbGetInputConnectorMap() @@ -232,7 +230,7 @@ bool reaction = true); /// (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 ); @@ -242,13 +240,14 @@ bool reaction = true); 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); @@ -260,8 +259,6 @@ bool reaction = true); 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(); //================================================================== @@ -295,7 +292,7 @@ bool reaction = true); /// - calls bbUpdateChildren /// - calls bbShowWidget which shows the widget associated to the box (if any) public: - virtual IOStatus bbBackwardUpdate(Connection* caller) = 0; + virtual IOStatus bbBackwardUpdate(Connection::Pointer caller) = 0; //================================================================== //================================================================== @@ -309,7 +306,7 @@ bool reaction = true); /// - 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: //================================================================== @@ -322,7 +319,7 @@ bool reaction = true); //================================================================== /// 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 ) { } //================================================================== //================================================================== @@ -333,7 +330,7 @@ bool reaction = true); /// 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() {} //================================================================== @@ -352,7 +349,7 @@ bool reaction = true); virtual bool bbCanReact() const; - static void bbGlobalAddToExecutionList( BlackBox* b ); + static void bbGlobalAddToExecutionList( BlackBox::Pointer b ); static void bbGlobalProcessExecutionList(); //================================================================== @@ -369,14 +366,31 @@ bool reaction = true); 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 Deleter : public Object::Deleter + { + Deleter(); + void Delete(Object* p); + }; + + template + static boost::shared_ptr 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 @@ -390,7 +404,7 @@ bool reaction = true); std::string bbmBoxProcessMode; /// The parent of the black box in the ComplexBlackBox hierarchy - BlackBox::Pointer bbmParent; + BlackBox::WeakPointer bbmParent; //================================================================== //==================================================================