Program: bbtk
Module: $RCSfile: bbtkBlackBox.cxx,v $
Language: C++
- Date: $Date: 2008/11/13 10:37:27 $
- Version: $Revision: 1.27 $
+ Date: $Date: 2009/03/30 14:42:16 $
+ Version: $Revision: 1.41 $
=========================================================================*/
/* ---------------------------------------------------------------------
#include "bbtkPackage.h"
#include "bbtkMessageManager.h"
#include "bbtkFactory.h"
+#include "bbtkBlackBoxOutputConnector.h"
#include "bbtkConfigurationFile.h"
#include "bbtkWxBlackBox.h"
static std::set<BlackBox::WeakPointer> bbmgExecutionList;
//=========================================================================
+
BlackBox::Deleter::Deleter()
{
}
b->bbDelete();
- bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : releasing descriptor ["<<desc.lock()<<"]"<<std::endl);
+ bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : releasing descriptor"<<std::endl);
if (!desc.expired())
{
//=========================================================================
BlackBox::BlackBox(const std::string &name)
:
- bbmStatus(MODIFIED),
+ // bbmStatus(MODIFIED),
+ bbmExecuting(false),
bbmName(name),
bbmBoxProcessMode("Pipeline"),
bbmParent()
//=========================================================================
BlackBox::BlackBox(BlackBox& from, const std::string &name)
:
- bbmStatus(from.bbmStatus),
+ // bbmStatus(from.bbmStatus),
+ bbmExecuting(false),
bbmName(name),
bbmBoxProcessMode(from.bbmBoxProcessMode),
bbmParent()
//=========================================================================
- //=========================================================================
- /// Main processing method of the box.
- void BlackBox::bbExecute(bool force)
- {
- bbtkDebugMessageInc("process",2,
- "=> BlackBox::bbExecute() ["
- <<bbGetFullName()<<"]"<<std::endl);
-
-
- // If execution frozen : return
- if (bbGlobalGetFreezeExecution())
- {
- bbtkDebugMessage("process",2,
- " -> FreezeExecution global flag is 'true' : abort execution"<<std::endl);
- }
-
- BBTK_BUSY_CURSOR;
-
- // If force is true then update is triggered even if the box is UPTODATE
- if (force) bbSetModifiedStatus();
-
- // Calls the main recursive update method
- bbBackwardUpdate(Connection::Pointer());
-
- bbtkDebugMessageDec("process",2,
- "<= BlackBox::bbExecute() ["
- <<bbGetFullName()<<"]"<<std::endl);
- }
- //=========================================================================
//=========================================================================
std::string BlackBox::bbGetFullName() const
/// Copies the input / output values from another box
void BlackBox::bbCopyIOValues(BlackBox& from)
{
- bbtkDebugMessageInc("Kernel",9,
+ bbtkDebugMessageInc("Kernel",1,
"BlackBox::bbCopyIOValues("
<<from.bbGetFullName()<<") ["
<<bbGetFullName()<<"]"<<std::endl);
{
if (! i->second->GetCopyConstruct() ) continue;
std::string input = i->second->GetName();
+ bbtkDebugMessage("Kernel",2,"* Copying input "<<input<<std::endl);
this->bbSetInput(input, from.bbGetInput(input) );
}
// copies the output values
{
if (! o->second->GetCopyConstruct() ) continue;
std::string output = o->second->GetName();
+ bbtkDebugMessage("Kernel",2,"* Copying output "<<output<<std::endl);
this->bbSetOutput(output, from.bbGetOutput(output) );
}
bool BlackBox::bbCanReact() const
{
return ( bbGlobalGetSomeBoxExecuting()
-#ifdef _USE_WXWIDGETS_
+#ifdef USE_WXWIDGETS
|| Wx::IsSomeWindowAlive()
#endif
);
if ( (p == "2") ||
(p == "R") || (p == "r") ||
(p == "Reactive") || (p == "reactive") ) return Reactive;
+ /*
+ if ( (p == "3") ||
+ (p == "F") || (p == "f") ||
+ (p == "Flash") || (p == "flash") ) return Flash;
+ */
bbtkError(bbGetFullName()<<" : BoxProcessMode value '"<<p
<<"' unknown. Possible values : "
<<"'0'/'P'/'p'/'Pipeline'/'pipeline' | "
<<"'1'/'A'/'a'/'Always'/'always' | "
- <<"'2'/'R'/'r'/'Reactive'/'reactive'"<<std::endl);
+ <<"'2'/'R'/'r'/'Reactive'/'reactive'"
+ // <<"'3'/'F'/'f'/'Flash'/'flash'"
+ <<std::endl);
}
//=========================================================================
}
//=========================================================================
+
+
+
//=========================================================================
- /// Signals that the BlackBox has been modified
- void BlackBox::bbSetModifiedStatus(BlackBoxInputConnector* c)
+ void BlackBox::bbAddOutputObserver(const std::string& output,
+ OutputChangeCallbackType f)
{
- bbtkDebugMessage("modified",1,
- "==> BlackBox::bbSetModifiedStatus("<<c<<") ["
+ bbGetOutputConnector(output).AddChangeObserver(f);
+ }
+ //=========================================================================
+
+ //=========================================================================
+ void BlackBox::bbRemoveOutputObserver(const std::string& output_name,
+ OutputChangeCallbackType f)
+ {
+ bbtkError("BlackBox::RemoveChangeObserver NOT IMPLEMENTED");
+ }
+ //=========================================================================
+
+
+ /*
+ //=========================================================================
+ /// Sets the ChangeTime of input
+ void BlackBox::bbSetInputChangeTime(BlackBoxInputConnector* c,
+ const ChangeTime& t)
+ {
+ bbtkDebugMessage("change",1,
+ "==> BlackBox::bbSetInputChangeTime("<<c<<","<<t<<") ["
<<bbGetFullName()<<"]"<<std::endl);
- if ( (c==bbGetInputConnectorMap().find("WinHide")->second) )
- // && (bbCanReact()))
+ // If new time is greater than old one
+ if ( c->SetChangeTime(t) )
{
- bbtkDebugMessage("modified",2,
- "-> Hide triggered by WinHide input change"
- <<std::endl);
- this->bbHideWindow();
- this->bbSetStatus(MODIFIED);
- return;
+ bool was_up_to_date = bbIsUpToDate();
+ // If new time is greater than the old max time of inputs
+ if ( mMaxInputChangeTime.Set(t) )
+ {
+ // If the box turned out-of-date
+ if ( was_up_to_date && bbIsOutOfDate() )
+ {
+ //
+ if ( ( bbBoxProcessModeIsReactive() ||
+ (c==bbGetInputConnectorMap().find("BoxExecute")->second))
+ && (bbCanReact() ) )
+ {
+ bbtkDebugMessage("change",2,
+ "an input of "
+ <<bbGetFullName()
+ <<" changed and box is in Reactive mode or BoxExecute input changed : adding it to the global execution list"
+ <<std::endl);
+ bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
+ }
+ // Have to propagate the modification to aval boxes
+ OutputConnectorMapType::iterator i;
+ for (i = bbGetOutputConnectorMap().begin();
+ i != bbGetOutputConnectorMap().end();
+ ++i)
+ {
+ i->second->SetChangeTime(t);
+ }
+ // update the MinOutputChangeTime
+ mMinOutputChangeTime.Set(t);
+ }
+ }
}
- if ( (c==bbGetInputConnectorMap().find("WinClose")->second) )
- // && (bbCanReact()))
+ }
+ //=========================================================================
+
+ //=========================================================================
+ /// Sets the ChangeTime of output
+ void BlackBox::bbSetOutputChangeTime(BlackBoxOutputConnector* c,
+ const ChangeTime& t)
+ {
+ bbtkDebugMessage("change",1,
+ "==> BlackBox::bbSetOutputChangeTime("<<c<<","<<t<<") ["
+ <<bbGetFullName()<<"]"<<std::endl);
+
+ //ChangeTime old =
+ c->SetChangeTime(t);
+ // c->GetChangeTime() = t;
+ // bbUpdateMinOutputChangeTime(t);
+ // propagate
+
+ }
+ //=========================================================================
+ */
+
+ /*
+ //=========================================================================
+ void BlackBox::bbUpdateMaxInputChangeTime(const ChangeTime& t)
+ {
+
+
+ if ( t > mMaxInputChangeTime )
{
- bbtkDebugMessage("modified",2,
- "-> Close triggered by WinClose input change"
- <<std::endl);
- this->bbHideWindow();
- this->bbSetStatus(MODIFIED);
- return;
+ mMaxInputChangeTime = t;
+ if ( mMinOutputChangeTime > mMaxInputChangeTime )
+ {
+
+ }
}
- if ( ( bbBoxProcessModeIsReactive() ||
- (c==bbGetInputConnectorMap().find("BoxExecute")->second))
- && (bbCanReact() ) )
+ }
+ //=========================================================================
+
+ //=========================================================================
+ void bbUpdateMinOutputChangeTime(const ChangeTime& t)
+ {
+ ChangeTime old = mMinOutputChangeTime;
+ mMinOutputChangeTime = MAXLONG;
+ OutputConnectorMapType::iterator i;
+ for (i = bbGetOutputConnectorMap.begin();
+ i != bbGetOutputConnectorMap.end();
+ ++i)
{
- bbtkDebugMessage("modified",2,
- "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
- this->bbSetStatus(MODIFIED);
- bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
+ if (i->second->GetChangeTime() < mMinOutputChangeTime)
+ mMinOutputChangeTime = i->second->GetChangeTime();
}
- /*
- else if ( bbGetStatus() == MODIFIED ) //! this->bbIsUptodate())
- {
- bbtkDebugMessage("modified",2,"-> Already modified"<<std::endl);
- return;
- }
- */
- else
+ if ( mMinOutputChangeTime < old )
{
- bbtkDebugMessage("modified",2,"-> Status set to modified"<<std::endl);
- this->bbSetStatus(MODIFIED);
}
-
- this->bbSignalOutputModification(false);
+
+ }
+ //=========================================================================
+ */
- /*
- bbtkDebugMessageDec("process",5,
- "<= BlackBox::bbSetModifiedStatus("<<c<<") ["
+ //=========================================================================
+ /// Signals that the BlackBox has been modified through
+ /// the input connector c
+ /// and propagates it downward
+ /// ** NOT USER INTENDED **
+ void BlackBox::bbSetStatusAndPropagate(BlackBoxInputConnector* c,
+ IOStatus s)
+ {
+ bbtkDebugMessageInc("change",5,
+ "=> BlackBox::bbSetStatusAndPropagate(input,"
+ <<GetIOStatusString(s)<<") ["
<<bbGetFullName()<<"]"<<std::endl);
+
+ if (s==UPTODATE) bbtkError("bbSetStatusAndPropagate with status UPTODATE!");
+ c->SetStatus(s);
+
+ // Flash reaction
+ /*
+ if (bbGetBoxProcessModeValue() == Flash)
+ {
+ this->bbExecute();
+ }
*/
- }
+
+ OutputConnectorMapType::const_iterator o;
+ for ( o = bbGetOutputConnectorMap().begin();
+ o != bbGetOutputConnectorMap().end(); ++o )
+ {
+ if (o->second->GetStatus()==UPTODATE)
+ {
+ o->second->SetStatus(OUTOFDATE);
+ o->second->SignalChange(GetThisPointer<BlackBox>(),o->first);
+ }
+ }
+
+ if ( ( bbBoxProcessModeIsReactive() ||
+ (c==bbGetInputConnectorMap().find("BoxExecute")->second))
+ && (bbCanReact() ) )
+ {
+ bbtkDebugMessage("change",2,
+ "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
+ bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
+ }
+ bbtkDebugMessageInc("change",5,
+ "<= BlackBox::bbSetStatusAndPropagate(input) ["
+ <<bbGetFullName()<<"]"<<std::endl);
+ }
//=========================================================================
+
//=========================================================================
void BlackBox::bbSignalOutputModification(bool reaction)
{
- bbtkDebugMessageInc("process",5,
- "=> BlackBox::bbSignalOutputModification() ["
+ bbtkDebugMessageInc("change",5,
+ "=> BlackBox::bbSignalOutputModification("
+ <<reaction<<") ["
<<bbGetFullName()<<"]"<<std::endl);
- OutputConnectorMapType::iterator change = bbGetOutputConnectorMap().end();
OutputConnectorMapType::iterator i;
for ( i = bbGetOutputConnectorMap().begin();
- i != bbGetOutputConnectorMap().end(); ++i) {
- /* if ( i->first == "BoxChange" )
- {
- change = i;
- continue;
- }
- */
- i->second->SetModifiedStatus();
- }
- // if (change != bbGetOutputConnectorMap().end())
- // change->second->SetModifiedStatus();
+ i != bbGetOutputConnectorMap().end(); ++i)
+ {
+ // std::cout << "Stat = "
+ //<<GetIOStatusString(i->second->GetStatus())
+ // <<std::endl;
+ // LG : CANNOT SIGNAL ONLY WHEN UPTODATE
+ // See bbtkSampleOutputObserver
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
+ i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
+ // }
+ }
if (reaction) bbGlobalProcessExecutionList();
- bbtkDebugMessageDec("process",5,
+ bbtkDebugMessageDec("change",5,
"<= BlackBox::bbSignalOutputModification() ["
<<bbGetFullName()<<"]"<<std::endl);
//=========================================================================
//=========================================================================
void BlackBox::bbSignalOutputModification(const std::string& output,
- bool reaction)
+ bool reaction)
{
- bbtkDebugMessageInc("process",5,
+ bbtkDebugMessageInc("change",5,
"=> BlackBox::bbSignalOutputModification("
- <<output<<") ["
+ <<output<<","<<reaction<<") ["
<<bbGetFullName()<<"]"<<std::endl);
- OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(output);
+ OutputConnectorMapType::iterator i =
+ bbGetOutputConnectorMap().find(output);
+
+
if ( i == bbGetOutputConnectorMap().end() )
{
bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<output<<") : unknown output");
}
- i->second->SetModifiedStatus();
- // Has to notify the output "BoxChange" also
- if (output != "BoxChange")
- {
- i = bbGetOutputConnectorMap().find("BoxChange");
- if ( i != bbGetOutputConnectorMap().end() )
+
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
+ i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
+ // Has to notify the output "BoxChange" also
+ if (output != "BoxChange")
{
- i->second->SetModifiedStatus();
+ i = bbGetOutputConnectorMap().find("BoxChange");
+ if ( i != bbGetOutputConnectorMap().end() )
+ {
+ i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
+ }
}
- }
- if (reaction) bbGlobalProcessExecutionList();
-
- bbtkDebugMessageDec("process",5,
- "<= BlackBox::bbSignalOutputModification("
- <<output<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ if (reaction) bbGlobalProcessExecutionList();
+ // }
+ bbtkDebugMessageDec("change",5,
+ "<= BlackBox::bbSignalOutputModification("
+ <<output<<") ["
+ <<bbGetFullName()<<"]"<<std::endl);
+
}
//=========================================================================
//=========================================================================
void BlackBox::bbSignalOutputModification(const std::vector<std::string>& output,
bool reaction)
{
- bbtkDebugMessageInc("process",5,
+ bbtkDebugMessageInc("change",5,
"=> BlackBox::bbSignalOutputModification(vector of outputs) ["
<<bbGetFullName()<<"]"<<std::endl);
OutputConnectorMapType::iterator i;
std::vector<std::string>::const_iterator o;
+ bool changed = false;
for (o=output.begin();o!=output.end();++o)
{
// the output "BoxChange" must be signaled **AFTER** all others
{
bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<*o<<") : unknown output");
}
- i->second->SetModifiedStatus();
+
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
+ i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
+ changed = true;
+ // }
}
// Has to notify the output "BoxChange" also
i = bbGetOutputConnectorMap().find("BoxChange");
- if ( i != bbGetOutputConnectorMap().end() )
+ if ( changed && (i != bbGetOutputConnectorMap().end()))
{
- i->second->SetModifiedStatus();
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
+ i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
+ if (reaction) bbGlobalProcessExecutionList();
+ // }
}
- if (reaction) bbGlobalProcessExecutionList();
- bbtkDebugMessageDec("process",5,
- "<= BlackBox::bbSignalOutputModification(vector of outputs) ["
+ bbtkDebugMessageDec("change",5,
+ "<= BlackBox::bbSignalOutputModification(vector of outputs) ["
<<bbGetFullName()<<"]"<<std::endl);
}
//=========================================================================
+
+
+
+
+
+
+ //=========================================================================
+ /// Main processing method of the box.
+ void BlackBox::bbExecute(bool force)
+ {
+ bbtkDebugMessageInc("process",2,
+ "=> BlackBox::bbExecute("<<(int)force<<") ["
+ <<bbGetFullName()<<"]"<<std::endl);
+
+ // If already executing : return
+ /*
+ if (bbGetExecuting())
+ {
+ bbtkDebugMessage("process",2,
+ " -> already executing : abort"<<std::endl);
+ return;
+ }
+ */
+
+ // If execution frozen : return
+ if (bbGlobalGetFreezeExecution())
+ {
+ bbtkDebugMessage("process",2,
+ " -> FreezeExecution global flag is 'true' : abort execution"<<std::endl);
+ }
+
+ BBTK_BUSY_CURSOR;
+
+ // If force is true then update is triggered even if the box is UPTODATE
+ // if (force) bbSetModifiedStatus();
+
+ // Calls the main recursive execution method
+ bbRecursiveExecute(Connection::Pointer());
+
+ bbtkDebugMessageDec("process",2,
+ "<= BlackBox::bbExecute() ["
+ <<bbGetFullName()<<"]"<<std::endl);
+ }
+ //=========================================================================
+
+
+ //=========================================================================
+ /// Main recursive processing method of the box.
+ void BlackBox::bbRecursiveExecute( Connection::Pointer caller )
+ {
+ bbtkDebugMessageInc("process",3,
+ "=> BlackBox::bbRecursiveExecute("
+ <<(caller?caller->GetFullName():"0")<<") ["
+ <<bbGetFullName()<<"]"<<std::endl);
+
+ // If already executing : return
+ if (bbGetExecuting())
+ {
+ bbtkDebugMessage("process",3,
+ " -> already executing : abort"<<std::endl);
+ return;
+ }
+
+ bbSetExecuting(true);
+ bool wasExecuting = bbGlobalGetSomeBoxExecuting();
+ bbGlobalSetSomeBoxExecuting(true);
+
+ this->bbCreateWidget();
+
+ // Updates its inputs
+ IOStatus s = bbUpdateInputs();
+
+ if ( (s != UPTODATE) ||
+ bbBoxProcessModeIsAlways() )
+ {
+ // Displays the window (WxBlackbox)
+ // bbShowWindow(caller);
+
+ // Actual processing (virtual)
+ this->bbProcess();
+
+
+ // Update the I/O statuses
+ bbComputePostProcessStatus();
+ }
+ else
+ {
+ // Test output status...
+ OutputConnectorMapType::iterator o;
+ for ( o = bbGetOutputConnectorMap().begin();
+ o!= bbGetOutputConnectorMap().end(); ++o)
+ {
+ if (o->second->GetStatus() != UPTODATE)
+ {
+ bbtkWarning("BlackBox::bbRecursiveExecute ["
+ <<bbGetFullName()
+ <<"] : all inputs are Up-to-date but output '"
+ <<o->first<<"' is Out-of-date ???");
+ }
+ }
+
+ bbtkDebugMessage("process",3," -> Up-to-date : nothing to do"
+ <<std::endl);
+ }
+
+ this->bbShowWidget();
+
+
+ bbtkDebugMessage("process",3,
+ "<= BlackBox::bbRecursiveExecute() ["
+ <<bbGetFullName()<<"]"<<std::endl);
+
+ bbSetExecuting(false);
+ bbGlobalSetSomeBoxExecuting(wasExecuting);
+
+ return;
+
+ }
+ //=========================================================================
+
+
+
+
+
//=========================================================================
/// Updates the BlackBox inputs
- /// \returns UPTODATE if all inputs are in UPTODATE status after update
- /// else MODIFIED
- IOStatus BlackBox::bbUpdateInputs(bool excludeParent)
+ /// Calls RecursiveExecute on all BlackBoxInputConnector
+ /// \returns The maximum of final IOStatus after each input update
+ IOStatus BlackBox::bbUpdateInputs()
{
bbtkDebugMessageInc("process",4,
"=> BlackBox::bbUpdateInputs() ["
for ( i = bbGetInputConnectorMap().begin();
i!= bbGetInputConnectorMap().end(); ++i)
{
- if (excludeParent && (i->first=="WinParent")) continue;
- if (i->first=="WinHide") continue;
+ // if (i->first=="WinHide") continue;
// If input type is Void : no recurse
//if ( bbGetDescriptor()->GetInputDescriptor(i->first)->GetTypeInfo()
// == typeid(Void) )
// continue;
-
- IOStatus t = i->second->BackwardUpdate();
- if (t==MODIFIED) s = MODIFIED;
+ bbtkDebugMessageDec("change",2,
+ bbGetName()<<"."<<i->first
+ <<" ["<<i->second<<"] "
+ <<" status before update = '"
+ <<GetIOStatusString(i->second->GetStatus())
+ <<"'"<<std::endl);
+ i->second->RecursiveExecute();
+ IOStatus t = i->second->GetStatus();
+ if (t > s) s = t;
+ bbtkDebugMessageDec("change",2,
+ bbGetName()<<"."<<i->first
+ <<" ["<<i->second<<"] "
+ <<" status before process = '"
+ <<GetIOStatusString(i->second->GetStatus())
+ <<"'"<<std::endl);
}
- bbtkDebugMessageDec("process",4,
+ bbtkDebugMessageDec("process",4,
"<= BlackBox::bbUpdateInputs() ["
<<bbGetFullName()<<"]"
<<std::endl);
-
-
+
+
return s;
}
//=========================================================================
-
+ //==================================================================
+ /// Computes the final IOStatus of inputs and outputs after processing
+ void BlackBox::bbComputePostProcessStatus()
+ {
+ bbtkDebugMessageInc("process",4,
+ "=> BlackBox::bbComputePostProcessStatus() ["
+ <<bbGetFullName()<<"]"
+ <<std::endl);
+
+ IOStatus new_output_status = UPTODATE;
+ if (bbBoxProcessModeIsAlways()) new_output_status = OUTOFDATE;
+
+ // Update the input statuses
+ InputConnectorMapType::iterator i;
+ for ( i = bbGetInputConnectorMap().begin();
+ i!= bbGetInputConnectorMap().end(); ++i)
+ {
+ IOStatus t = i->second->GetStatus();
+ if (t == OUTOFDATE) new_output_status = OUTOFDATE;
+ // A previously MODIFIED status turns to UPTODATE
+ if (t==MODIFIED) i->second->SetStatus(UPTODATE);
+ bbtkDebugMessage("change",2,
+ bbGetName()<<"."<<i->first<<" : "
+ << GetIOStatusString(t) << " -> "
+ << GetIOStatusString(i->second->GetStatus())
+ << std::endl);
+ }
+ bbtkDebugMessage("change",2,
+ bbGetName()<<" new output status : "
+ << GetIOStatusString(new_output_status)
+ <<std::endl);
+ // Update the output statuses
+ OutputConnectorMapType::iterator o;
+ for ( o = bbGetOutputConnectorMap().begin();
+ o!= bbGetOutputConnectorMap().end(); ++o)
+ {
+ o->second->SetStatus(new_output_status);
+ }
+
+ bbtkDebugMessageInc("process",4,
+ "<= BlackBox::bbComputePostProcessStatus() ["
+ <<bbGetFullName()<<"]"
+ <<std::endl);
+
+ }
+ //==================================================================
+
//=========================================================================
/// Connects the input <name> to the connection c
void BlackBox::bbConnectInput( const std::string& name, Connection* c)
bbtkError("no input called '"<<name<<"'");
}
i->second->SetConnection(c);
+ // The input *MUST* be set OUTOFDATE to update its input on next execution
+ bbSetStatusAndPropagate(i->second,OUTOFDATE);
bbtkDebugMessage("connection",2,
"<== BlackBox::bbConnectInput(\""
<<name<<"\","<<c->GetFullName()<<") ["
<<bbGetFullName()<<"]"
<<std::endl);
- // bbSetModifiedStatus();
}
//=========================================================================
std::string ss("<");
std::string::size_type pos = 0;
pos = s.find(ss,0);
- char* cr = "[";
+ std::string cr("[");
while ( pos != std::string::npos )
{
// std::cout << "*** find one "<<std::endl;
- s.replace(pos,1,cr,1);
+ s.replace(pos,1,cr.c_str(),1);
pos = s.find(ss, pos);
}
ss = ">";
while ( pos != std::string::npos )
{
// std::cout << "*** find one "<<std::endl;
- s.replace(pos,1,cr,1);
+ s.replace(pos,1,cr.c_str(),1);
pos = s.find(ss, pos);
}
ss = ",";
while ( pos != std::string::npos )
{
// std::cout << "*** find one "<<std::endl;
- s.replace(pos,1,cr,1);
+ s.replace(pos,1,cr.c_str(),1);
pos = s.find(ss, pos);
} // std::cout << "AFTER=["<<s<<"]"<<std::endl;
}
{
bbtkMessage("Help",1,"Black Box <::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
}
+ /*
+ if (bbIsUpToDate())
+ {
+ bbtkMessage("Help",1,"Up-to-date ["<<mMaxInputChangeTime<<","
+ <<mMinOutputChangeTime<<"]"<<std::endl);
+ }
+ else
+ {
+ bbtkMessage("Help",1,"Out-of-date ["<<mMaxInputChangeTime<<","
+ <<mMinOutputChangeTime<<"]"<<std::endl);
+ }
+ */
// bbtkMessage("Help",1," "<<GetDescription()<<std::endl);
// bbtkMessage("Help",1," By : "<<GetAuthor()<<std::endl);
std::vector<std::string> iname;
std::vector<std::string> ivalue;
std::vector<std::string> iconn;
+ std::vector<std::string> istatus;
InputConnectorMapType::iterator i;
unsigned int namelmax = 0;
s += con->GetOriginalBlackBoxFromOutput();
} // if con
iconn.push_back(s);
+ istatus.push_back(GetIOStatusString(i->second->GetStatus()));
}
OutputConnectorMapType::iterator o;
std::vector<std::string> oname;
std::vector<std::string> ovalue;
std::vector<std::vector<std::string> > oconn;
+ std::vector<std::string> ostatus;
for ( o = mOutputConnectorMap.begin(); o != mOutputConnectorMap.end(); ++o )
{
oname.push_back(o->first);
ss.push_back(s);
} // if con
oconn.push_back(ss);
+ ostatus.push_back(GetIOStatusString(o->second->GetStatus()));
}
if (iname.size())
else
bbtkMessage("Help",1," * No inputs"<<std::endl);
- std::vector<std::string>::iterator i1,i2,i3;
- for (i1=iname.begin(),i2=ivalue.begin(),i3=iconn.begin();
- i1!=iname.end(),i2!=ivalue.end(),i3!=iconn.end();
- ++i1,++i2,++i3)
+ std::vector<std::string>::iterator i1,i2,i3,i4;
+ for (i1=iname.begin(),i2=ivalue.begin(),i3=iconn.begin(),i4=istatus.begin();
+ i1!=iname.end(),i2!=ivalue.end(),i3!=iconn.end(),i4!=istatus.end();
+ ++i1,++i2,++i3,++i4)
{
std::string name(*i1);
name += "'";
value += "'";
value.append(1+valuelmax-value.size(),' ');
if (i3->size())
- bbtkMessage("Help",1," '"<<name<<" = '"<<value<<" <-- '"<<*i3<<"'"<<std::endl);
+ bbtkMessage("Help",1," '"<<name<<" = '"<<value<<" <-- '"
+ <<*i3<<"'");
else
- bbtkMessage("Help",1," '"<<name<<" = '"<<value<<std::endl);
+ bbtkMessage("Help",1," '"<<name<<" = '"<<value);
+ bbtkMessage("Help",1," ["<<*i4<<"]"<<std::endl);
}
if (oname.size())
else
bbtkMessage("Help",1," * No outputs"<<std::endl);
- std::vector<std::vector<std::string> >::iterator i4;
+ std::vector<std::vector<std::string> >::iterator i5;
- for (i1=oname.begin(),i2=ovalue.begin(),i4=oconn.begin();
- i1!=oname.end(),i2!=ovalue.end(),i4!=oconn.end();
- ++i1,++i2,++i4)
+ for (i1=oname.begin(),i2=ovalue.begin(),i5=oconn.begin(),i4=ostatus.begin();
+ i1!=oname.end(),i2!=ovalue.end(),i5!=oconn.end(),i4!=ostatus.end();
+ ++i1,++i2,++i4,++i5)
{
std::string name(*i1);
name += "'";
std::string value(*i2);
value += "'";
value.append(1+valuelmax-value.size(),' ');
- if (!(*i4).size())
- bbtkMessage("Help",1," '"<<name<<" = '"<<value<<std::endl);
+ if (!(*i5).size())
+ bbtkMessage("Help",1," '"<<name<<" = '"<<value);
else
{
std::string pref = " '"+name+" = '"+value;
- for (i3=i4->begin();i3!=i4->end();++i3)
+ for (i3=i5->begin();i3!=i5->end();++i3)
{
- bbtkMessage("Help",1,pref<<" --> '"<<*i3<<"'"<<std::endl);
+ bbtkMessage("Help",1,pref<<" --> '"<<*i3<<"'");
pref.replace(0,pref.size(),pref.size(),' ');
}
}
+ bbtkMessage("Help",1," ["<<*i4<<"]"<<std::endl);
}
}