Program: bbtk
Module: $RCSfile: bbtkComplexBlackBox.cxx,v $
Language: C++
-Date: $Date: 2008/02/06 10:53:02 $
-Version: $Revision: 1.3 $
+Date: $Date: 2008/04/18 12:59:15 $
+Version: $Revision: 1.10 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
namespace bbtk
{
+ //==========================================================================
+ /// Creates a new complex black box
+ ComplexBlackBox::Pointer ComplexBlackBox::New(const std::string& name,
+ ComplexBlackBoxDescriptor::Pointer desc)
+ {
+ bbtkDebugMessage("object",1,"##> ComplexBlackBox::New('"<<name<<"','"<<
+ desc->GetTypeName()<<"')" <<bbtkendl);
+ ComplexBlackBox::Pointer p =
+ MakeBlackBoxPointer(new ComplexBlackBox(name,desc));
+ bbtkDebugMessage("object",2,"<## ComplexBlackBox::New('"<<name<<"','"<<
+ desc->GetTypeName()<<"')" <<bbtkendl);
+ return p;
+ }
+ //==========================================================================
//=======================================================================
/// Usefull constructor
ComplexBlackBox::ComplexBlackBox(const std::string &name,
- ComplexBlackBoxDescriptor* desc)
- : BlackBox(name),
- mDescriptor(desc)
+ ComplexBlackBoxDescriptor::Pointer desc)
+ :
+ BlackBox(name),
+ mLockedDescriptor(desc),
+ mDescriptor(desc)
{
- bbtkDebugMessageInc("Kernel",9,
- "ComplexBlackBox::ComplexBlackBox(\""
- <<name<<"\")"<<std::endl);
+ bbtkDebugMessage("object",3,
+ "##> ComplexBlackBox::ComplexBlackBox(\""
+ <<name<<"\")"<<std::endl);
bbAllocateConnectors();
- bbtkDebugDecTab("Kernel",9);
+ bbtkDebugMessage("object",3,
+ "<## ComplexBlackBox::ComplexBlackBox(\""
+ <<name<<"\")"<<std::endl);
}
//=======================================================================
ComplexBlackBox::ComplexBlackBox(ComplexBlackBox& from,
const std::string &name)
: BlackBox(from,name),
+ // The locked descriptor is copied from the unlocked one
+ // to make the box a non-prototype !!
+ mLockedDescriptor(from.mDescriptor),
mDescriptor(from.mDescriptor),
mExecutionList(from.mExecutionList)
{
- bbtkDebugMessageInc("Kernel",9,
- "ComplexBlackBox::ComplexBlackBox(\""
+ bbtkDebugMessage("object",3,
+ "##> ComplexBlackBox::ComplexBlackBox(\""
<<from.bbGetName()<<"\",\""
<<name<<"\")"<<std::endl);
-
- bbtkDebugMessageInc("Kernel",9,"* Cloning Black Boxes"<<std::endl);
+ bbtkDebugMessage("object",4," * Cloning Black Boxes"<<std::endl);
BlackBoxMapType::const_iterator i;
for ( i = from.mBlackBoxMap.begin(); i != from.mBlackBoxMap.end(); ++i )
{
- bbtkDebugMessageInc("Kernel",9,"* Cloning \""<<i->first<<"\""<<std::endl);
- BlackBox* B = i->second->bbClone(i->second->bbGetName());
+ bbtkDebugMessageInc("object",5," * Cloning \""<<i->first<<"\""<<std::endl);
+ BlackBox::Pointer B = i->second->bbClone(i->second->bbGetName());
bbUnsafeAddBlackBox(B);
- bbtkDebugDecTab("Kernel",9);
}
- bbtkDebugDecTab("Kernel",9);
- bbtkDebugMessageInc("Kernel",9,"* Cloning Connections"<<std::endl);
+ bbtkDebugMessage("object",4," * Cloning Connections"<<std::endl);
ConnectionListType::const_iterator j;
for ( j = from.mConnectionList.begin(); j != from.mConnectionList.end(); ++j )
{
- bbtkDebugMessageInc("Kernel",9,"* Cloning \""<<
- (*j)->GetFullName()<<"\""<<std::endl);
+ bbtkDebugMessage("object",5," * Cloning \""<<
+ (*j)->GetFullName()<<"\""<<std::endl);
+
+ BlackBox::Pointer bbfrom = bbGetBlackBox( (*j)->GetOriginalBlackBoxFrom()->bbGetName() );
+ BlackBox::Pointer bbto = bbGetBlackBox( (*j)->GetOriginalBlackBoxTo()->bbGetName() );
- BlackBox* bbfrom = bbGetBlackBox( (*j)->GetBlackBoxFrom()->bbGetName() );
- BlackBox* bbto = bbGetBlackBox( (*j)->GetBlackBoxTo()->bbGetName() );
- Connection* c = /*mDescriptor->GetFactory()->Create*/
+ Connection::Pointer c = mDescriptor.lock()->GetFactory()->
NewConnection( bbfrom,
- (*j)->GetBlackBoxFromOutput(),
+ (*j)->GetOriginalBlackBoxFromOutput(),
bbto,
- (*j)->GetBlackBoxToInput() );
+ (*j)->GetOriginalBlackBoxToInput() );
+ //c->Check();
bbAddConnection(c);
- bbtkDebugDecTab("Kernel",9);
}
- bbtkDebugDecTab("Kernel",9);
bbAllocateConnectors();
- bbtkDebugDecTab("Kernel",9);
+ bbtkDebugMessage("object",3,
+ "<## ComplexBlackBox::ComplexBlackBox(\""
+ <<from.bbGetName()<<"\",\""
+ <<name<<"\")"<<std::endl);
}
//=======================================================================
/// Destructor
ComplexBlackBox::~ComplexBlackBox()
{
- bbtkDebugMessageInc("Kernel",9,
- "ComplexBlackBox::~ComplexBlackBox() ["
- <<bbGetFullName()<<"]"<<std::endl);
-
- bbtkDebugMessageInc("Kernel",9,"* Delete Connections"<<std::endl);
- ConnectionListType::iterator j;
- for ( j = mConnectionList.begin(); j != mConnectionList.end(); ++j )
- {
- bbtkDebugMessageInc("Kernel",9,"* Delete \""<<
- (*j)->GetFullName()<<"\""<<std::endl);
- delete *j;
- bbtkDebugDecTab("Kernel",9);
- }
- bbtkDebugDecTab("Kernel",9);
-
-
- bbtkDebugMessageInc("Kernel",9,"* Delete Black Boxes"<<std::endl);
- BlackBoxMapType::iterator i;
- for ( i = mBlackBoxMap.begin(); i != mBlackBoxMap.end(); ++i )
+ bbtkDebugMessage("object",3,
+ "==> ComplexBlackBox::~ComplexBlackBox() ["
+ <<bbGetName()<<"]"<<std::endl);
+
+ bbtkDebugMessage("object",4,
+ " -> Releasing connections"<<std::endl);
+ mConnectionList.clear();
+ bbtkDebugMessage("object",4,
+ " -> Releasing boxes"<<std::endl);
+ mBlackBoxMap.clear();
+
+ /*
+ // Clear();
+ this->bbDesallocateConnectors();
+ if (mLockedDescriptor)
{
- bbtkDebugMessageInc("Kernel",9,"* Delete \""<<i->first<<"\""<<std::endl);
- i->second->bbDelete();
- bbtkDebugDecTab("Kernel",9);
+ bbtkMessage("object",3," --> Releasing descriptor"<<std::endl);
+ mLockedDescriptor.reset();
+ if (!mDescriptor.expired()) BlackBoxDescriptor::Release(mDescriptor);
}
- bbtkDebugDecTab("Kernel",9);
- // bbtkDebugMessage("Kernel",9,"EO ComplexBlackBox::~ComplexBlackBox ["
- // <<bbGetFullName()<<"]"<<std::endl);
-
-
- this->bbDesallocateConnectors();
- bbtkDebugDecTab("Kernel",9);
+ */
+ bbtkDebugMessage("object",3,
+ "<== ComplexBlackBox::~ComplexBlackBox() ["
+ <<bbGetName()<<"]"<<std::endl);
}
//=======================================================================
+
//=========================================================================
/// Allocates the i/o connectors of the black box
"ComplexBlackBox::bbAllocateConnectors() ["
<<bbGetFullName()<<"]"
<<std::endl);
-
+ /*
// Input connectors
const BlackBoxDescriptor::InputDescriptorMapType& imap
= bbGetDescriptor()->GetInputDescriptorMap();
bbGetOutputConnectorMap()[o->second->GetName()] = c;
//new BlackBoxOutputConnector();
}
+
+*/
+
bbtkDebugDecTab("Kernel",8);
}
//=========================================================================
// but by the internal boxes. Hence **DO NOT** desallocate !
// just clear the maps to avoid that
// BlackBox::bbDesallocateConnectors delete the connectors
- bbGetInputConnectorMap().clear();
+
+ /*
+ bbGetInputConnectorMap().clear();
bbGetOutputConnectorMap().clear();
-
+ */
bbtkDebugDecTab("Kernel",8);
}
//=========================================================================
//=======================================================================
- BlackBox* ComplexBlackBox::bbClone(const std::string& name)
+ BlackBox::Pointer ComplexBlackBox::bbClone(const std::string& name)
{
bbtkDebugMessageInc("Kernel",9,
"ComplexBlackBox::bbClone(\""<<name<<"\") ["
<<bbGetFullName()<<"]"<<std::endl);
ComplexBlackBox* CBB = new ComplexBlackBox(*this,name);
-
- bbtkDebugDecTab("Kernel",9);
-
- return CBB;
+ return MakeBlackBoxPointer(CBB);
}
//=======================================================================
"ComplexBlackBox::bbExecute() ["
<<bbGetFullName()<<"]"<<std::endl);
- wx::BeginBusyCursor();
+
+ Wx::BeginBusyCursor();
if (mExecutionList.size() != 0)
{
}
else
{
- std::map<std::string, BlackBox*>::iterator i;
+ std::map<std::string, BlackBox::Pointer>::iterator i;
for (i=mBlackBoxMap.begin(); i!=mBlackBoxMap.end(); ++i)
{
i->second->bbExecute(force);
}
}
- wx::EndBusyCursor();
+ Wx::EndBusyCursor();
+
bbtkDebugDecTab("Process",1);
}
//==================================================================
//==================================================================
- IOStatus ComplexBlackBox::bbBackwardUpdate(Connection* caller)
+ IOStatus ComplexBlackBox::bbBackwardUpdate(Connection::Pointer caller)
{
bbtkDebugMessageInc("Process",1,
- "ComplexBlackBox::bbBackwardUpdate("<<caller->GetFullName()<<") ["
+ "ComplexBlackBox::bbBackwardUpdate("
+ <<(caller?caller->GetFullName():"0")<<") ["
<<bbGetFullName()<<"]"<<std::endl);
+ bbtkInternalError("ComplexBlackBox::bbBackwardUpdate should never be called !");
+ /*
+ if (caller==0)
+ {
+ bbtkInternalError("ComplexBlackBox::bbBackwardUpdate called with caller=0");
+ }
+
+ if (bbGetExecuting())
+ {
+ bbtkWarning(bbGetFullName()<<" : Cyclic execution stopped");
+ return UPTODATE;
+ }
+ bbSetExecuting(true);
IOStatus s = UPTODATE;
const BlackBoxDescriptor::OutputDescriptorMapType& omap
BlackBox* b = bbUnsafeGetBlackBox ( d->GetTarget() );
// Calls BackwardUpdate on it
bbtkDebugMessageInc("Process",2,"Internal box connected to output : "<<d->GetTarget()<<std::endl);
+ // Because internal box can also be a complex box we have to
+ // temporarily change the connection BlackBoxFromOutput to the
+ // mapped one
+
+ // std::string oldout = caller->GetBlackBoxFromOutput();
+ // std::cout << "oldout = "<<oldout<<std::endl;
+ // std::cout << "tmpout = "<<d->GetOutput()<<std::endl;
+ // caller->SetBlackBoxFromOutput(d->GetOutput());
+ //
+ //Connection newcaller(*caller);
+ //newcaller.SetBlackBoxFromOutput(d->GetOutput());
+ //IOStatus s1 = b->bbBackwardUpdate(&newcaller);
IOStatus s1 = b->bbBackwardUpdate(caller);
+ //newcaller.Clear();
+ // restore old output
+ // caller->SetBlackBoxFromOutput(oldout);
+
// ??? STATUS OF CBBs ???
// ??? Here it is only the final status of the boxes connected to the output
if (s1==MODIFIED) s=MODIFIED;
bbtkError("Connection '"<<caller->GetFullName()<<"' does not point to a valid output of the complex box !");
}
bbtkDebugDecTab("Process",1);
- return s;
- }
- //==================================================================
-
- /*
- //==================================================================
- void ComplexBlackBox::bbForwardUpdate(Connection* caller)
- {
- bbtkDebugMessageInc("Process",1,
- "ComplexBlackBox::bbForwardUpdate("<<caller->GetFullName()<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
- const BlackBoxDescriptor::InputDescriptorMapType& imap
- = bbGetDescriptor()->GetInputDescriptorMap();
- BlackBoxDescriptor::InputDescriptorMapType::const_iterator i
- = imap.find(caller->GetBlackBoxToInput());
- if (i!=imap.end())
- {
- // Cast the BBOutputDescriptor into a ComplexBBOutputDescriptor
- ComplexBlackBoxInputDescriptor* d =
- (ComplexBlackBoxInputDescriptor*)i->second;
- // Get the internal box
- BlackBox* b = bbUnsafeGetBlackBox ( d->GetTarget() );
- // Calls ForwardUpdate on it
- bbtkDebugMessage("Process",2,"-> Internal box connected to input : "<<d->GetTarget()<<std::endl);
- b->bbForwardUpdate(caller);
- }
- else
- {
- bbtkError("Connection '"<<caller->GetFullName()<<"' does not point to a valid input of the complex box !");
- }
- bbtkDebugDecTab("Process",1);
+ bbSetExecuting(false);
+
+ return s;
+ */
+ return UPTODATE;
}
//==================================================================
- */
//==================================================================
}
//==================================================================
+ //=========================================================================
+ /// Connects the input <name> to the connection c
+ void ComplexBlackBox::bbConnectInput( const std::string& name, Connection::Pointer c)
+ {
+ bbtkDebugMessageInc("Kernel",7,
+ "ComplexBlackBox::bbConnectInput(\""
+ <<name<<"\","<<c<<") ["
+ <<bbGetFullName()<<"]"
+ <<std::endl);
+
+ ComplexBlackBoxInputDescriptor* d = (ComplexBlackBoxInputDescriptor*)
+ bbGetDescriptor()->GetInputDescriptor(name);
+
+ BlackBox::Pointer t = bbGetBlackBox(d->GetTarget());
+ c->SetBlackBoxTo(t);
+ c->SetBlackBoxToInput(d->GetInput());
+ t->bbConnectInput(d->GetInput(),c);
+
+ bbtkMessage("Debug",1,"ComplexBlackBox["<<bbGetFullName()<<"]::bbConnectInput : "
+ <<c->GetFullName()<<std::endl);
+
+ bbtkDebugDecTab("Kernel",7);
+ }
+ //=========================================================================
+
+
+ //=========================================================================
+ /// Connects the output <name> to the connection c
+ void ComplexBlackBox::bbConnectOutput( const std::string& name, Connection::Pointer c)
+ {
+ bbtkDebugMessageInc("Kernel",7,
+ "ComplexBlackBox::bbConnectOutput(\""
+ <<name<<"\","<<c<<") ["
+ <<bbGetFullName()<<"]"<<std::endl);
+
+ ComplexBlackBoxOutputDescriptor* d = (ComplexBlackBoxOutputDescriptor*)
+ bbGetDescriptor()->GetOutputDescriptor(name);
+
+ BlackBox::Pointer t = bbGetBlackBox(d->GetTarget());
+
+ c->SetBlackBoxFrom(t);
+ c->SetBlackBoxFromOutput(d->GetOutput());
+ t->bbConnectOutput(d->GetOutput(),c);
+
+ bbtkMessage("Debug",5,"ComplexBlackBox["<<bbGetFullName()<<"]::bbConnectOutput : "
+ <<c->GetFullName()<<std::endl);
+
+ bbtkDebugDecTab("Kernel",7);
+ }
+ //=========================================================================
+
+
//==================================================================
/// Adds the black box to the complex box
- void ComplexBlackBox::bbAddBlackBox( BlackBox* b)
+ void ComplexBlackBox::bbAddBlackBox( BlackBox::Pointer b)
{
bbtkDebugMessageInc("Kernel",7,
"ComplexBlackBox::AddBlackBox(\""<<b->bbGetName()
bbtkError("a black box called \""<<b->bbGetName()
<<"\" already exists");
}
- b->bbSetParent(this);
+ b->bbSetParent(GetThisPointer<ComplexBlackBox>());
mBlackBoxMap[b->bbGetName()] = b;
bbtkDebugDecTab("Kernel",7);
//==================================================================
/// Adds the black box to the complex box (unsafe)
- void ComplexBlackBox::bbUnsafeAddBlackBox( BlackBox* b)
+ void ComplexBlackBox::bbUnsafeAddBlackBox( BlackBox::Pointer b)
{
bbtkDebugMessageInc("Kernel",7,
"ComplexBlackBox::UnsafeAddBlackBox(\""<<b->bbGetName()
<<"\") ["
<<bbGetFullName()<<"]"<<std::endl);
- b->bbSetParent(this);
+ b->bbSetParent(GetThisPointer<ComplexBlackBox>());
mBlackBoxMap[b->bbGetName()] = b;
bbtkDebugDecTab("Kernel",7);
//==================================================================
/// Removes the black box from the complex box
- void ComplexBlackBox::bbRemoveBlackBox( const std::string& name )
+ void ComplexBlackBox::bbRemoveBlackBox( const std::string& name,
+ bool remove_connections )
{
bbtkDebugMessageInc("Kernel",7,
"ComplexBlackBox::RemoveBlackBox(\""<<name<<"\") ["
<<bbGetFullName()<<"]"<<std::endl);
- bbtkError("ComplexBlackBox::RemoveBlackBox not implemented");
+ BlackBoxMapType::iterator i = mBlackBoxMap.find(name);
+ if ( i == mBlackBoxMap.end() )
+ {
+ bbtkError("the black box \""<<name<<"\" does not exist");
+ }
+ BlackBox::WeakPointer p = i->second;
+
+ if (remove_connections)
+ {
+ ConnectionListType::const_iterator j;
+ for ( j = mConnectionList.begin();
+ j != mConnectionList.end(); ++j )
+ {
+ //(*j)->Check();
+ }
+ }
+ if (p.use_count()!=1)
+ {
+ bbtkError("the black box \""<<name<<"\" is still connected");
+ }
+
+ mBlackBoxMap.erase(i);
+
+
+ // Unload orphan dl packages
+ Package::UnLoadReleasedDynamicallyLoadedPackages();
bbtkDebugDecTab("Kernel",7);
}
//==================================================================
/// Adds the connection to the complex box
- void ComplexBlackBox::bbAddConnection( Connection* c)
+ void ComplexBlackBox::bbAddConnection( Connection::Pointer c)
{
bbtkDebugMessageInc("Kernel",7,
"ComplexBlackBox::AddConnection(\""<<"..."<<"\") ["
//==================================================================
/// Returns the black box with name <name>
- BlackBox* ComplexBlackBox::bbGetBlackBox( const std::string& name )
+ BlackBox::Pointer ComplexBlackBox::bbGetBlackBox( const std::string& name )
{
bbtkDebugMessageInc("Kernel",9,
"ComplexBlackBox::GetBlackBox(\""<<name<<"\") ["
//==================================================================
/// Returns the black box with name <name> : does not throw an exception
/// if it does not exist but return a null pointer
- BlackBox* ComplexBlackBox::bbUnsafeGetBlackBox( const std::string& name )
+ BlackBox::Pointer ComplexBlackBox::bbUnsafeGetBlackBox( const std::string& name )
{
bbtkDebugMessageInc("Kernel",9,
"ComplexBlackBox::UnsafeGetBlackBox(\""<<name<<"\") ["
if ( i == mBlackBoxMap.end() )
{
bbtkDebugDecTab("Kernel",9);
- return 0;
+ return BlackBox::Pointer();
}
bbtkDebugDecTab("Kernel",9);
//=========================================================================
- BlackBox *ComplexBlackBox::bbFindBlackBox(const std::string &blackboxname)
+ BlackBox::Pointer ComplexBlackBox::bbFindBlackBox(const std::string &blackboxname)
{
- BlackBox *blackbox=NULL;
+ BlackBox::Pointer blackbox;
std::string subname="";
std::string restname="";
std::string delimiters(">");
}
BlackBoxMapType::iterator i = mBlackBoxMap.find(subname);
- if ( i == mBlackBoxMap.end() )
- {
- blackbox = NULL;
- }
- else
+ if ( i != mBlackBoxMap.end() )
{
blackbox = i->second;
if (restname!="")
fprintf(ff,"rankdir=LR%s\n",";");
fprintf(ff,"node [shape=record]%s\n",";");
- this->bbWriteDotFileBlackBox(ff,this,detail,level,
+ this->bbWriteDotFileBlackBox(ff,
+ GetThisPointer<ComplexBlackBox>(),
+ detail,level,
instanceOrtype,
relative_link );
//=========================================================================
/// Write Graphviz-dot description in file
void ComplexBlackBox::bbWriteDotFileBlackBox(FILE *ff,
- BlackBox *parentblackbox,
+ BlackBox::Pointer parentblackbox,
int detail, int level,
bool instanceOrtype,
bool relative_link )
{
std::string tmp1;
std::string valueStr("");
- Package *package = this->bbGetDescriptor()->GetPackage();
+ Package::Pointer package = this->bbGetDescriptor()->GetPackage();
if (package!=NULL)
{
}
std::string boxname="["+bbGetTypeName()+"]";
- if (this!=parentblackbox)
+ if (GetThisPointer<ComplexBlackBox>()!=parentblackbox)
{
if (detail==0)
{
{
if (level>-1)
{
- j->second->bbWriteDotFileBlackBox(ff,parentblackbox,detail,
+ j->second->bbWriteDotFileBlackBox(ff,
+ parentblackbox,
+ detail,
level-1,
instanceOrtype,
relative_link);
fprintf(ff,":%s",cbbid->GetName().c_str() );
}
fprintf(ff,"->" );
- BlackBox *bb = bbGetBlackBox( cbbid->GetTarget() );
+ BlackBox::Pointer bb = bbGetBlackBox( cbbid->GetTarget() );
bb->bbWriteDotInputOutputName(ff,true,detail,level);
if (detail==1)
{
{
ComplexBlackBoxOutputDescriptor *cbbod = (ComplexBlackBoxOutputDescriptor*)yy->second;
fprintf(ff," ");
- BlackBox *bb = bbGetBlackBox( cbbod->GetTarget() );
+ BlackBox::Pointer bb = bbGetBlackBox( cbbod->GetTarget() );
bb->bbWriteDotInputOutputName(ff,false,detail,level);
if (detail==1)
{
// Relation from the out side of this ComplexBlackBox with its Inputs
- if (this!=parentblackbox) {
+ if (GetThisPointer<ComplexBlackBox>()!=parentblackbox) {
for ( ii = bbGetInputConnectorMap().begin();
ii != bbGetInputConnectorMap().end(); ++ii )
{
if (ii->second)
{
- Connection* con = ii->second->GetConnection();
+ Connection::Pointer con = ii->second->GetConnection();
if (con!=NULL){
- BlackBox *a=con->GetBlackBoxFrom();
- BlackBox *b=con->GetBlackBoxTo();
+ BlackBox::Pointer a=con->GetBlackBoxFrom();
+ BlackBox::Pointer b=con->GetBlackBoxTo();
fprintf(ff," ");
a->bbWriteDotInputOutputName(ff,false,detail,level);
if (detail==1)
} // if second
} // for
} // if parentblackbox
-
}
//=========================================================================
+
- /*
+ /*
+
//=======================================================================
/// Generates the list of the packages of which its depends
/// (cause an internal box belongs to it)
}
//=======================================================================
*/
+
+ //=======================================================================
+ void ComplexBlackBox::Check(bool recursive)
+ {
+ bbtkMessage("Debug",1,"**** Checking Complex Black Box "<<(void*)this
+ <<" ["<<bbGetFullName()<<"]"<<std::endl);
+
+ BlackBoxMapType::const_iterator i;
+ for ( i = mBlackBoxMap.begin(); i != mBlackBoxMap.end(); ++i )
+ {
+ i->second->Check(recursive);
+ }
+ ConnectionListType::const_iterator j;
+ for ( j = mConnectionList.begin();
+ j != mConnectionList.end(); ++j )
+ {
+ //(*j)->Check();
+ }
+ bbtkMessage("Debug",1,"**** Checking Complex Black Box "<<(void*)this
+ <<" ["<<bbGetFullName()<<"] ... OK"<<std::endl);
+
+ }
+ //=======================================================================
+
+ //=========================================================================
+ /// Returns the name with the name of the parent prepended if any
+ std::string ComplexBlackBox::bbGetNameWithParent() const
+ {
+ if (!IsAPrototype()) return BlackBox::bbGetNameWithParent();
+ if (bbGetDescriptor())
+ {
+ return bbGetDescriptor()->GetFullTypeName() + ":" + bbGetName();
+ }
+ else
+ {
+ return std::string(":") + bbGetName();
+ }
+ }
+ //=========================================================================
+
+ //==========================================================================
+ std::string ComplexBlackBox::GetObjectName() const
+ {
+ return std::string("ComplexBlackBox '")+bbGetNameWithParent()
+ +std::string("'");
+ }
+ //==========================================================================
+
+ //==========================================================================
+ std::string ComplexBlackBox::GetObjectInfo() const
+ {
+ std::stringstream i;
+ i << " - "<<mBlackBoxMap.size() << " boxes / "
+ <<mConnectionList.size() << " connections" << std::endl;
+ return i.str();
+ }
+ //==========================================================================
+
+ //==========================================================================
+ size_t ComplexBlackBox::GetObjectSize() const
+ {
+ size_t s = Superclass::GetObjectSize();
+ s += ComplexBlackBox::GetObjectInternalSize();
+ return s;
+ }
+ //==========================================================================
+ //==========================================================================
+ size_t ComplexBlackBox::GetObjectInternalSize() const
+ {
+ size_t s = sizeof(ComplexBlackBox);
+ return s;
+ }
+ //==========================================================================
+ //==========================================================================
+ size_t ComplexBlackBox::GetObjectRecursiveSize() const
+ {
+ size_t s = Superclass::GetObjectRecursiveSize();
+ s += ComplexBlackBox::GetObjectInternalSize();
+ BlackBoxMapType::const_iterator i;
+ for ( i = mBlackBoxMap.begin(); i != mBlackBoxMap.end(); ++i )
+ {
+ s += i->second->GetObjectRecursiveSize();
+ }
+ ConnectionListType::const_iterator j;
+ for ( j = mConnectionList.begin();
+ j != mConnectionList.end(); ++j )
+ {
+ s += (*j)->GetObjectRecursiveSize();
+ }
+ return s;
+ }
+ //==========================================================================
+
}