X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkConnection.cxx;h=e6ee23851e7288d08e4cfc37a460528bb797867d;hb=de86b2c1152e6932fd8d846702aa5a72b81ded5c;hp=29bab6cc40a63308c6c3fca425e676403cd1ce3a;hpb=c2a4b1893412e50a3d9abff221938a2d16c4a7cb;p=bbtk.git diff --git a/kernel/src/bbtkConnection.cxx b/kernel/src/bbtkConnection.cxx index 29bab6c..e6ee238 100644 --- a/kernel/src/bbtkConnection.cxx +++ b/kernel/src/bbtkConnection.cxx @@ -1,20 +1,40 @@ +/* + # --------------------------------------------------------------------- + # + # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image + # pour la SantÈ) + # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton + # Previous Authors : Laurent Guigues, Jean-Pierre Roux + # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil + # + # 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. + # ------------------------------------------------------------------------ */ + + /*========================================================================= - Program: bbtk Module: $RCSfile: bbtkConnection.cxx,v $ Language: C++ - Date: $Date: 2008/04/09 11:16:57 $ - 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 - 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: 2012/11/16 08:49:01 $ + Version: $Revision: 1.22 $ =========================================================================*/ + + + /** *\file *\brief Class bbtk::Connection @@ -24,30 +44,63 @@ #include "bbtkFactory.h" #include "bbtkBlackBox.h" #include "bbtkMessageManager.h" +#include "bbtkBlackBoxOutputConnector.h" + +#define bbtkCMessage(key,level,mess) \ + bbtkMessage(key,level,"["< Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""< Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""< Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbHasOutput(output) ) @@ -75,9 +128,7 @@ namespace bbtk { if ( from->bbGetOutputType(output) == typeid(Data) ) { - bbtkWarning("Connection '" - <bbGetName()<<"."<bbGetName()<<"."<() <<"> : type compatibility with '" @@ -88,7 +139,7 @@ namespace bbtk } else if ( to->bbGetInputType(input) == typeid(Data) ) { - bbtkDebugMessage("Kernel",8," -> '"< '"<()<<" : can receive any data" <bbGetName() + "." + output + "-" + to->bbGetName() + "." + input; - mAdaptor = mFactory->NewAdaptor(from->bbGetOutputType(output), - to->bbGetInputType(input), - name); + mAdaptor = mFactory.lock() + ->NewAdaptor(from->bbGetOutputType(output), + to->bbGetInputType(input), + name); if (!mAdaptor) { bbtkError("did not find any <" @@ -113,87 +165,245 @@ namespace bbtk } } - // + + mFrom = from; + mOriginalFrom = from; + mTo = to; + mOriginalTo = to; + mInput = mOriginalInput = input; + mOutput = mOriginalOutput = output; + + // Lock this pointer !!! + //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)); + - bbtkDebugDecTab("Kernel",7); + bbtkDebugMessage("connection",1,"<== Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""< Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""<bbGetName()<<"\",\""< Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""< Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""<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(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""< Connection(\"" + <bbGetName()<<"\",\""<bbGetName()<<"\",\""< ~Connection()" + <bbDisconnectOutput(mOutput,this); - if (mTo!=0) mTo->bbDisconnectInput(mInput,this); - if (mAdaptor!=0) mAdaptor->bbDelete(); + if (mAdaptor) mAdaptor.reset(); + if (mFrom!=0) + { + mFrom->bbDisconnectOutput(mOutput,this); + // GetThisPointer()); + mFrom.reset(); + } + else + { + bbtkInternalError("~Connection() : invalid initial box pointer"); + } + if (mTo!=0) + { + mTo->bbDisconnectInput(mInput,this);// GetThisPointer()); + mTo.reset(); + } + else + { + bbtkInternalError("~Connection() : invalid final box pointer"); + } - bbtkDebugDecTab("Kernel",7); + + bbtkCDebugMessage("object",4, + "<== ~Connection()" + < Connection::RecursiveExecute()" + <bbBackwardUpdate(this); + /* + // If box from already executing : nothing to do + if (mFrom->bbGetExecuting()) + { + bbtkDebugMessage("process",3, + " -> "<bbGetName() + <<" already executing : abort"<bbSetModifiedStatus(); + mFrom->bbRecursiveExecute(GetThisPointer()); - bbtkDebugDecTab("Process",2); + TransferData(); - return s; + // Transfer status + IOStatus s = MODIFIED; + if ( mFrom->bbGetOutputConnector(mOutput).GetStatus() == OUTOFDATE) + { + s = OUTOFDATE; + } + mTo->bbGetInputConnector(mInput).SetStatus(s); + + bbtkCDebugMessage("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, - "Connection::TransferData() [" - <() <<" which contains a <" <bbGetOutput(mOutput).type()) <<">"<bbGetInputType(mInput)) <<">"<bbGetOutput(mOutput).type() == typeid(void)) + { + bbtkCDebugMessage("data",3, + " -> Source is void : nothing to transfer!"<bbGetOutput(mOutput) + else if (mFrom->bbGetOutput(mOutput) .contains( mTo->bbGetInputType(mInput) ) ) { - bbtkDebugMessage("Data",3, + bbtkCDebugMessage("data",3, " -> Equal types : transfer ok"<bbSetInput( mInput, mFrom->bbGetOutput(mOutput), @@ -235,25 +448,26 @@ namespace bbtk else { // 2) Look for an adaptor - bbtk::BlackBox* adaptor = 0; + bbtk::BlackBox::Pointer adaptor; try { - adaptor = mFactory->NewAdaptor(mFrom->bbGetOutput(mOutput).type(), - mTo->bbGetInputType(mInput), - ""); + adaptor = mFactory.lock() + ->NewAdaptor(mFrom->bbGetOutput(mOutput).type(), + mTo->bbGetInputType(mInput), + ""); } catch (...) { } if (adaptor) { - bbtkDebugMessage("Data",3," -> Adaptor found : using it" + bbtkCDebugMessage("data",3," -> Adaptor found : using it" <bbSetInput("In",mFrom->bbGetOutput(mOutput),false); adaptor->bbExecute(); // LG : Connection Update does not set mTo as modified mTo->bbSetInput(mInput, adaptor->bbGetOutput("Out"),false); - adaptor->bbDelete(); + // adaptor->bbDelete(); } // 3) If no adaptor found but the any content is a pointer // and target type is also a pointer : we try run-time cast @@ -261,7 +475,7 @@ namespace bbtk (mTo->bbGetDescriptor()->GetInputDescriptor(mInput) ->IsPointerType()) ) { - bbtkDebugMessage("Data",3, + bbtkCDebugMessage("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(); + bbtkCDebugMessage("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); + } //================================================================== @@ -325,10 +543,12 @@ namespace bbtk { std::string res = mFrom->bbGetName()+"."+mOutput+"--" +mTo->bbGetName()+"."+mInput; - if ((mFrom!=mOriginalFrom)||(mTo!=mOriginalTo)) + if ((!mOriginalFrom.expired()) && (!mOriginalTo.expired()) && + ((mFrom!=mOriginalFrom.lock())||(mTo!=mOriginalTo.lock()))) { - res += "("+mOriginalFrom->bbGetName()+"."+mOriginalOutput+"--" - + mOriginalTo->bbGetName()+"."+mOriginalInput+")"; + res += "("+mOriginalFrom.lock()->bbGetName() + +"."+mOriginalOutput+"--" + + mOriginalTo.lock()->bbGetName()+"."+mOriginalInput+")"; } return res; } @@ -339,90 +559,151 @@ namespace bbtk //================================================================== void Connection::Check() const { - bbtkMessage("Debug",1,"** Checking Connection "<<(void*)this<<" ["<bbGetFullName()<bbGetName()<bbHasOutput(mOutput)) { - bbtkError(mFrom->bbGetFullName()<<" does not have output '" + bbtkError("** Checking Connection "<<(void*)this + <<" ["<bbGetName()<<" does not have output '" <bbGetOutputConnectorMap().find(mOutput); if (i== mFrom->bbGetOutputConnectorMap().end()) { - bbtkError(mFrom->bbGetFullName()<<" output '" + bbtkError("** Checking Connection "<<(void*)this + <<" ["<bbGetName()<<" output '" <::const_iterator j; + std::vector< Connection* >::const_iterator j; + /* + for (j = i->second->GetConnectionVector().begin(); + j != i->second->GetConnectionVector().end(); + ++j) + { + if ((*j)==this) break; + } + */ j = find(i->second->GetConnectionVector().begin(), i->second->GetConnectionVector().end(), this); + if (j==i->second->GetConnectionVector().end()) { - bbtkError("Connection ["<bbGetFullName() + <bbGetName() <<" does not point to this connection"); } - bbtkMessage("Debug",2," - From : This connection is in OutputConnector connection vector"<bbGetName()<bbGetDescriptor() << std::endl; - std::cout << mTo->bbGetDescriptor()->GetTypeName() << std::endl; - mTo->bbGetFullName(); - bbtkMessage("Debug",2," - To : "<bbGetFullName()<bbGetName()<bbGetDescriptor() << std::endl; + // std::cout << mTo->bbGetDescriptor()->GetTypeName() << std::endl; + // mTo->bbGetName(); + bbtkMessage("debug",2," - To : "<bbGetName()<bbHasInput(mInput)) { - bbtkError(mTo->bbGetFullName()<<" does not have input '" + bbtkError("** Checking Connection "<<(void*)this + <<" ["<bbGetName()<<" does not have input '" <bbGetInputConnectorMap().find(mInput); if (i== mTo->bbGetInputConnectorMap().end()) { - bbtkError(mTo->bbGetFullName()<<" input '" + bbtkError("** Checking Connection "<<(void*)this + <<" ["<bbGetName()<<" input '" <second->GetConnection()==0) { - bbtkError("Connection "<bbGetFullName() + <bbGetName() <<" does not point to this connection"); } - bbtkMessage("Debug",2," - To : This connection is in InputConnector connection vector"<