X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=kernel%2Fsrc%2FbbtkBlackBox.h;h=b70ab75f747a07ad0171f1c07025ebaa9ace7853;hb=13aaa782a7f5942f5072728201750c06afbdfb2d;hp=17ed4c199ab11ff1b33b0c9fdd9ee8b2d7475fa1;hpb=6575a389b71b1b85c79e4444885becb76ecf16e4;p=bbtk.git diff --git a/kernel/src/bbtkBlackBox.h b/kernel/src/bbtkBlackBox.h index 17ed4c1..b70ab75 100644 --- a/kernel/src/bbtkBlackBox.h +++ b/kernel/src/bbtkBlackBox.h @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkBlackBox.h,v $ Language: C++ - Date: $Date: 2008/10/17 08:18:12 $ - Version: $Revision: 1.13 $ + Date: $Date: 2008/12/08 12:53:47 $ + Version: $Revision: 1.17 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -46,9 +46,13 @@ #include "bbtkSystem.h" #include "bbtkBlackBoxDescriptor.h" #include "bbtkBlackBoxInputConnector.h" -#include "bbtkBlackBoxOutputConnector.h" +//#include "bbtkBlackBoxOutputConnector.h" #include +// Signal/slot mechanism for output change events +#include +#include + namespace bbtk { @@ -57,6 +61,7 @@ namespace bbtk class Factory; class Connection; + class BlackBoxOutputConnector; class BBTK_EXPORT BlackBox : public Object { @@ -65,6 +70,12 @@ namespace bbtk //================================================================== // INTERFACE //================================================================== + typedef boost::signals::trackable OutputChangeObserverType; + typedef boost::signal OutputChangeSignalType; + typedef OutputChangeSignalType::slot_function_type + OutputChangeCallbackType; /// The type of map of output connector pointers typedef std::map @@ -103,33 +114,59 @@ namespace bbtk /// Main processing method of the box. virtual void bbExecute(bool force = false); - /// Signals that the BlackBox has been modified through the input connector c - /// and propagates it downward - virtual void bbSetModifiedStatus(BlackBoxInputConnector* c = 0); + + /// The type of callback function when an output changes + // typedef BlackBoxOutputConnector::ChangeCallbackType OutputChangeCallbackType; + + /// 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)(BlackBoxOutputConnector*) + /// To pass a member function 'f' of an instance 'c' of a class 'C' + /// as callback you have to 'bind' it, i.e. call: + /// AddChangeObserver ( "Out", boost::bind( &C::f , c, _1 ) ); + void AddChangeObserver(const std::string& output_name, + OutputChangeCallbackType f); + + /// Removes the function f from the list of functions to call when + /// the output changes (TO WRITE) + void RemoveChangeObserver(const std::string& output_name, + OutputChangeCallbackType f); + + /// Signals that the BlackBox outputs have been modified - /// without marking the box as MODIFIED because its output state is ok. + /// (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 when **ALL** outputs have been modified - /// (after the outputs has been updated !) + /// (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" have been modified - /// without marking the box as MODIFIED because its output state is ok. + /// 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" - /// have been modified - /// without marking the box as MODIFIED because its output state is ok. + bool reaction = true); + /// 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 + /// (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 /// When more than one output has been changed but not all /// (after the outputs have been updated of course!) - virtual void bbSignalOutputModification( const std::vector& output_name, -bool reaction = true); + /// DO NOT PASS reaction = false OR WILL NOT WORK PROPERLY + /// ** USER INTENDED ** + virtual void bbSignalOutputModification( const std::vector& + output_name, + bool reaction = true); /// Gets the status of the box - virtual const IOStatus& bbGetStatus() const { return bbmStatus; } + // virtual const IOStatus& bbGetStatus() const { return bbmStatus; } /// Returns true iff the BlackBox has an input of name label @@ -148,12 +185,12 @@ bool reaction = true); virtual Data bbGetOutput( const std::string &name ) = 0; /// Sets the data of the input called . - /// If setModified is false then does not call bbSetModifiedStatus() + /// If update_time is false then does not update ChangeTime of input virtual void bbSetInput( const std::string &name, Data data, - bool setModified = true ) = 0; + bool update_time = true ) = 0; virtual void bbBruteForceSetInputPointer( const std::string &name, void* data, - bool setModified = true) =0; + bool update_time = true) =0; /// Sets the data of the output called virtual void bbSetOutput( const std::string &name, Data data) = 0; @@ -170,13 +207,38 @@ bool reaction = true); /// Returns the output connectors map (const) const OutputConnectorMapType& bbGetOutputConnectorMap() const { return mOutputConnectorMap; } + + /// Returns the input connector + BlackBoxInputConnector& bbGetInputConnector(const std::string& n) + { return *(mInputConnectorMap.find(n)->second); } + /// Returns the output connector + BlackBoxOutputConnector& bbGetOutputConnector(const std::string& n) + { return *(mOutputConnectorMap.find(n)->second); } + /// Returns the input connector (const) + const BlackBoxInputConnector& bbGetInputConnector(const std::string& n) const + { return *(mInputConnectorMap.find(n)->second); } + /// Returns the output connector (const) + const BlackBoxOutputConnector& bbGetOutputConnector(const std::string& n) const + { return *(mOutputConnectorMap.find(n)->second); } + + /// Prints the Help on the BlackBox type virtual void bbGetHelp(bool full=true) const; - //================================================================== + // Returns true iff the box is up-to-date + // (ChangeTime of inputs are all lower strictly to ChangeTime of outputs - + // i.e. max(inputs)<=min(outputs) ) + // bool bbIsUpToDate() { return mMaxInputChangeTime < mMinOutputChangeTime; } + // Returns true iff the box is out-of-date + // (At least one ChangeTime of an input is greater than one ChangeTime + // of an output - i.e. max(inputs)>min(outputs)) + // == !IsUpToDate() + // bool bbIsOutOfDate() { return mMaxInputChangeTime >= mMinOutputChangeTime; } + + //================================================================== // Common inputs / outputs to all boxes /// Returns the value of the input "BoxProcessMode" std::string bbGetInputBoxProcessMode() { return bbmBoxProcessMode; } @@ -204,7 +266,7 @@ bool reaction = true); /// Returns the value of the output "Change" Void bbGetOutputBoxChange() { return Void(); } /// Sets the value of the output "Change" : signal a modification - void bbSetOutputBoxChange(Void = 0) { bbSetModifiedStatus(); } + void bbSetOutputBoxChange(Void = 0) { } //bbSetModifiedStatus(); } //================================================================== @@ -253,7 +315,6 @@ bool reaction = true); virtual void bbUserOnShow() { } void bbUserOnShowWidget(std::string nameInput); - protected: //================================================================== // PROTECTED PART : ACCESSIBLE TO THE BlackBox DEVELOPER @@ -266,11 +327,20 @@ bool reaction = true); //================================================================== - /// Sets the status of the box - void bbSetStatus( IOStatus t) { bbmStatus = t; } + /// 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); + /// Signals that the output whose connector is c has changed + /// and propagates the info downward + /// ** NOT USER INTENDED ** + virtual void bbSetStatusAndPropagate(BlackBoxOutputConnector* c, + IOStatus s); //================================================================== private: + //================================================================== friend class Connection; friend class ComplexBlackBox; @@ -291,61 +361,39 @@ bool reaction = true); virtual void bbDisconnectOutput( const std::string& name, Connection* c); - - + //================================================================== + protected: /// @name Pipeline processing methods - /// Methods which participate to (forward or backward) pipeline processing. - /// Some are pure virtual and prepare particular update mechanism which are implemented by descendents (e.g. ForwardUpdate and UpdateChildren are made for WxContainerBlackBox particular update mechanism which must recurse a piece of the pipeline top-down). + /// Methods which participate to pipeline processing. + /// Some are pure virtual and prepare particular update mechanism which are implemented by descendents /// The main method is bbBackwardUpdate which is called by bbExecute and implemented in UserBlackBox and ComplexBlackBox. /// //@{ + //================================================================== /// Recursive pipeline processing in backward direction - /// (recursion is in backward direction however execution always goes forward). - /// Pure virtual; defined in UserBlackBox and ComplexBlackBox + /// (recursion is in backward direction however execution always + /// goes forward). + /// Pure virtual; defined in AtomicBlackBox and ComplexBlackBox /// - /// \returns The final status of the box (UPTODATE or MODIFIED) /// \param caller : The connection which invoked the method; null if called by bbExecute - /// - /// First checks that re-processing is needed (either Status==MODIFIED or InputProcessMode==Always) - /// then : - /// - updates its inputs by calling bbUpdateInputs (which recursively calls bbBackwardUpdate on upstream boxes) - /// - calls bbCreateWidget - /// - 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) - protected: - virtual IOStatus bbBackwardUpdate(Connection::Pointer caller) = 0; - //================================================================== - - //================================================================== - /// Recursive pipeline processing in forward direction along "Child"-"Parent" connections - /// Pure virtual; defined in UserBlackBox and ComplexBlackBox - /// - /// \param caller : The connection which invoked the method - /// - /// First checks that re-processing is needed (either Status==MODIFIED or InputProcessMode==Always) - /// then : - /// - 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::Pointer caller) = 0; + virtual void bbBackwardUpdate(Connection::Pointer caller) = 0; //================================================================== - protected: + //================================================================== - /// Updates the BlackBox inputs and returns the final status of the inputs - /// (==UPTODATE iff all inputs are UPTODATE) - // If excludeParent == true then excludes the upstream box connected to input 'Parent' from recursive update - IOStatus bbUpdateInputs(bool excludeParent=false); + /// Updates the BlackBox inputs + /// Calls BackwardUpdate on all BlackBoxInputConnector + /// \returns The maximum of final IOStatus after each input update + IOStatus bbUpdateInputs(); //================================================================== //================================================================== - /// Updates the pipeline in upstream-downstream direction along the "Child"-"Parent" connections only. - /// Does nothing here. Overloaded in WxContainerBlackbox - //virtual void bbUpdateChildren( Connection::Pointer caller ) { } + /// Computes the final IOStatus of inputs and outputs after processing + void bbComputePostProcessStatus(); //================================================================== + //================================================================== /// Specific methods for window creation during pipeline execution /// Creates the window associated to the box (called after bbUpdateInputs) @@ -373,9 +421,14 @@ bool reaction = true); /// which means execute in response to an input change virtual bool bbCanReact() const; + /// Returns true iff the box is executing + bool bbGetExecuting() const { return bbmExecuting; } + protected: static void bbGlobalAddToExecutionList( BlackBox::Pointer b ); static void bbGlobalProcessExecutionList(); + /// Sets the bbmExecuting bool returned by bbGetExecuting + void bbSetExecuting(bool b) { bbmExecuting = b; } //================================================================== protected: @@ -388,6 +441,7 @@ bool reaction = true); virtual void bbCopyIOValues(BlackBox& from); //================================================================== + //================================================================== // Black box objects have a special deleter // which must take care of releasing the descriptor // **AFTER** the box is deleted @@ -400,31 +454,40 @@ bool reaction = true); 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 + // ATTRIBUTES /// The status of the box - IOStatus bbmStatus; + // IOStatus bbmStatus; + /// Is the box executing ? + bool bbmExecuting; /// The name of the black-box std::string bbmName; /// The name of the package to which it belongs std::string bbmPackageName; - - /// 0 : "Pipeline" mode : bbBackwardUpdate() only calls Process if Status == MODIFIED (normal pipeline processing) - /// 1 : "Always" mode : bbUpdate() always calls Process - /// 2 : "Reactive" mode : bbSetModifiedStatus() calls bbUpdate() + /// The box processing 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; //================================================================== @@ -438,6 +501,31 @@ bool reaction = true); InputConnectorMapType mInputConnectorMap; //================================================================== + /// The maximum ChangeTime of the inputs + // ChangeTime mMaxInputChangeTime; + /// The minimum ChangeTime of the outputs + // ChangeTime mMinOutputChangeTime; + + + protected: + //========================================================================= + /// Sets the ChangeTime of input + /* + void bbSetInputChangeTime(BlackBoxInputConnector* c, + const ChangeTime& t); + /// Sets the ChangeTime of output + void bbSetOutputChangeTime(BlackBoxOutputConnector* c, + const ChangeTime& t); + */ + // void bbUpdateMaxInputChangeTime(const ChangeTime& t); + // void bbUpdateMinOutputChangeTime(const ChangeTime& t); + + /// Set the change time of the input + // void bbSetInputChangeTime(const std::string& n, ChangeTime); + /// Set the change time of the output + // void bbSetOutputChangeTime(const std::string& n, ChangeTime); + + }; // Class BlackBox