X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkConnection.cxx;h=bc6b3b1c001561de5335fb3311f7d027118dea5f;hb=8822f9075c66dcf742b9edae47271bb46af6a9b7;hp=9c8487ace1fe496f21762f539e1f6bd1bc5fc93b;hpb=d7a6d341e2d11c175351212f0bf4812784dc57e5;p=bbtk.git diff --git a/kernel/src/bbtkConnection.cxx b/kernel/src/bbtkConnection.cxx index 9c8487a..bc6b3b1 100644 --- a/kernel/src/bbtkConnection.cxx +++ b/kernel/src/bbtkConnection.cxx @@ -1,20 +1,33 @@ -/*========================================================================= - +/*========================================================================= Program: bbtk Module: $RCSfile: bbtkConnection.cxx,v $ Language: C++ - Date: $Date: 2008/04/22 06:59:31 $ - Version: $Revision: 1.8 $ - - Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de - l'Image). All rights reserved. See doc/license.txt or - http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - + Date: $Date: 2008/12/11 09:50:35 $ + Version: $Revision: 1.19 $ =========================================================================*/ + +/* --------------------------------------------------------------------- + +* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale) +* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux +* +* This software is governed by the CeCILL-B license under French law and +* abiding by the rules of distribution of free software. You can use, +* modify and/ or redistribute the software under the terms of the CeCILL-B +* license as circulated by CEA, CNRS and INRIA at the following URL +* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +* or in the file LICENSE.txt. +* +* As a counterpart to the access to the source code and rights to copy, +* modify and redistribute granted by the license, users are provided only +* with a limited warranty and the software's author, the holder of the +* economic rights, and the successive licensors have only limited +* liability. +* +* The fact that you are presently reading this means that you have had +* knowledge of the CeCILL-B license and that you accept its terms. +* ------------------------------------------------------------------------ */ + /** *\file *\brief Class bbtk::Connection @@ -24,9 +37,17 @@ #include "bbtkFactory.h" #include "bbtkBlackBox.h" #include "bbtkMessageManager.h" +#include "bbtkBlackBoxOutputConnector.h" namespace bbtk { + const std::string IOSTATUS_STRING[3] = + {"Up-to-date","Modified","Out-of-date"}; + + const std::string& GetIOStatusString(IOStatus s) + { return IOSTATUS_STRING[s]; } + + //================================================================== Connection::Pointer Connection::New(BlackBox::Pointer from, const std::string& output, BlackBox::Pointer to, @@ -45,6 +66,7 @@ namespace bbtk <bbConnectOutput(output,p); - to->bbConnectInput(input,p); + //Pointer p = MakePointer(this,true); + from->bbConnectOutput(output,this); + to->bbConnectInput(input,this); + + from->bbGetOutputConnector(output).AddChangeObserver(boost::bind(&bbtk::Connection::OnOutputChange,this, _1, _2, _3)); bbtkDebugMessage("connection",1,"<== Connection::Connection(\"" @@ -159,6 +183,124 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, } //================================================================== + //================================================================== + Connection::Pointer Connection::New(BlackBox::Pointer from, + const std::string& output, + BlackBox::Pointer to, + const std::string& input ) + { + bbtkDebugMessage("object",1,"##> Connection::Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""< Connection::Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""< Connection::Connection(\"" + <bbGetFullName()<<"\",\""<bbGetFullName()<<"\",\""<bbHasOutput(output) ) + { + bbtkError("The box \""<bbGetTypeName()<< + "\" has no output \""<bbHasInput(input) ) + { + bbtkError("The box \""<bbGetTypeName()<< + "\" has no input \""<bbGetInputConnectorMap().find(input)->second->IsConnected()) + { + bbtkError("The input \""<bbGetName() + <<"\" is already connected"); + } + + // std::string t1 ( from->bbGetOutputType(output).name() ); + // std::string t2 ( to->bbGetInputType(input).name() ); + // if //( t1 != t2 ) + if ( from->bbGetOutputType(output) != + to->bbGetInputType(input) ) + { + if ( from->bbGetOutputType(output) == typeid(Data) ) + { + bbtkWarning("Connection '" + <bbGetName()<<"."<() + <<"> : type compatibility with '" + <bbGetName()<<"."<bbGetInputType(input) == typeid(Data) ) + { + bbtkDebugMessage("Kernel",8," -> '"<()<<" : can receive any data" + <bbConnectOutput(output,this); + to->bbConnectInput(input,this); + + from->bbGetOutputConnector(output).AddChangeObserver(boost::bind(&bbtk::Connection::OnOutputChange,this, _1, _2, _3)); + + bbtkDebugMessage("connection",1,"<== Connection::Connection(\"" + <bbGetFullName()<<"\",\""<bbGetFullName()<<"\",\""< Connection::Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbDisconnectOutput(mOutput, - GetThisPointer()); + mFrom->bbDisconnectOutput(mOutput,this); + // GetThisPointer()); + mFrom.reset(); } else { @@ -181,15 +322,14 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, } if (mTo!=0) { - mTo->bbDisconnectInput(mInput, - GetThisPointer()); + mTo->bbDisconnectInput(mInput,this);// GetThisPointer()); + mTo.reset(); } else { bbtkInternalError("Connection::~Connection() : invalid final box pointer"); } - mFrom.reset(); - mTo.reset(); + bbtkDebugMessage("object",2, "<== Connection::~Connection() [" @@ -198,51 +338,48 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, //================================================================== //================================================================== - /// Backward Update - IOStatus Connection::BackwardUpdate() + /// Recursive execution + void Connection::RecursiveExecute() { - bbtkDebugMessageInc("Process",2, - "Connection::BackwardUpdate() [" - < Connection::RecursiveExecute() [" + <bbBackwardUpdate(GetThisPointer()); + mFrom->bbRecursiveExecute(GetThisPointer()); TransferData(); - if (mAdaptor && (s==MODIFIED)) mAdaptor->bbSetModifiedStatus(); - - bbtkDebugDecTab("Process",2); - - return s; + // Transfer status + IOStatus s = MODIFIED; + if ( mFrom->bbGetOutputConnector(mOutput).GetStatus() == OUTOFDATE) + { + s = OUTOFDATE; + } + mTo->bbGetInputConnector(mInput).SetStatus(s); + + bbtkDebugMessage("process",4, + " --> '"<bbGetName()<<"."<bbGetInputConnector(mInput)<<"] " + <<"' new status '" + <bbForwardUpdate(this); - bbtkDebugDecTab("Process",2); - } - //================================================================== - */ //================================================================== /// Transfers the data from the source output to the target input /// doing necessary conversions (adaptation or pointer cast) void Connection::TransferData() { - bbtkDebugMessageInc("Process",3, + bbtkDebugMessageInc("data",3, "Connection::TransferData() [" <() <<" which contains a <" <bbGetOutput(mOutput).type()) <<">"<bbGetInputType(mInput)) <<">"<bbGetOutput(mOutput) .contains( mTo->bbGetInputType(mInput) ) ) { - bbtkDebugMessage("Data",3, + bbtkDebugMessage("data",3, " -> Equal types : transfer ok"<bbSetInput( mInput, mFrom->bbGetOutput(mOutput), @@ -299,7 +433,7 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, } if (adaptor) { - bbtkDebugMessage("Data",3," -> Adaptor found : using it" + bbtkDebugMessage("data",3," -> Adaptor found : using it" <bbSetInput("In",mFrom->bbGetOutput(mOutput),false); adaptor->bbExecute(); @@ -313,7 +447,7 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, (mTo->bbGetDescriptor()->GetInputDescriptor(mInput) ->IsPointerType()) ) { - bbtkDebugMessage("Data",3, + bbtkDebugMessage("data",3, " -> No adaptor found but source and target types are both pointers : trying up or down cast"<bbSetInput(mInput, mFrom->bbGetOutput(mOutput),false); } - bbtkDebugDecTab("Process",3); } //================================================================== - + //================================================================== - /// Modified - void Connection::SetModifiedStatus() + /// From.Output change propagation + void Connection::OnOutputChange(bbtk::BlackBox::Pointer, const std::string&, + IOStatus status) { - bbtkDebugMessageInc("Process",5, - "Connection::SetModifiedStatus() [" - <bbSetModifiedStatus(); + bbtkDebugMessage("change",2, + "==> Connection::OnOutputChange(" + <bbGetInputConnectorMap().find("In")->second; + mAdaptor->bbSetStatusAndPropagate(ac,status); + } - mTo->bbSetModifiedStatus( mTo->bbGetInputConnectorMap().find(mInput)->second ); + mTo->bbSetStatusAndPropagate( mTo->bbGetInputConnectorMap().find(mInput)->second, status); - bbtkDebugDecTab("Process",5); + } //================================================================== @@ -393,15 +531,15 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, //================================================================== void Connection::Check() const { - bbtkMessage("Debug",1,"** Checking Connection "<<(void*)this<<" ["<bbGetFullName()<bbGetFullName()<bbHasOutput(mOutput)) { bbtkError("** Checking Connection "<<(void*)this @@ -409,7 +547,7 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, << mFrom->bbGetFullName()<<" does not have output '" <bbGetOutputConnectorMap().find(mOutput); if (i== mFrom->bbGetOutputConnectorMap().end()) @@ -419,21 +557,22 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, <bbGetFullName()<<" output '" <::const_iterator j; + std::vector< Connection* >::const_iterator j; + /* for (j = i->second->GetConnectionVector().begin(); j != i->second->GetConnectionVector().end(); ++j) { - if ((*j).lock()==GetThisPointer()) break; + if ((*j)==this) break; } - /* + */ j = find(i->second->GetConnectionVector().begin(), i->second->GetConnectionVector().end(), - GetThisPointer()); - */ + this); + if (j==i->second->GetConnectionVector().end()) { bbtkError("** Checking Connection "<<(void*)this @@ -444,23 +583,23 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, <<" does not point to this connection"); } - bbtkMessage("Debug",2," - From : This connection is in OutputConnector connection vector"<bbGetName()<bbGetName()<bbGetDescriptor() << std::endl; // std::cout << mTo->bbGetDescriptor()->GetTypeName() << std::endl; // mTo->bbGetFullName(); - bbtkMessage("Debug",2," - To : "<bbGetFullName()<bbGetFullName()<bbHasInput(mInput)) { bbtkError("** Checking Connection "<<(void*)this @@ -468,7 +607,7 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, <bbGetFullName()<<" does not have input '" <bbGetInputConnectorMap().find(mInput); if (i== mTo->bbGetInputConnectorMap().end()) @@ -478,7 +617,7 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, <bbGetFullName()<<" input '" <second->GetConnection()==0) @@ -491,8 +630,8 @@ Connection::Connection(BlackBox::Pointer from, const std::string& output, <<" does not point to this connection"); } - bbtkMessage("Debug",2," - To : This connection is in InputConnector connection vector"<