-/*=========================================================================
-
+/*=========================================================================
Program: bbtk
Module: $RCSfile: bbtkConnection.cxx,v $
Language: C++
- Date: $Date: 2008/04/24 10:11:28 $
- Version: $Revision: 1.12 $
-
- 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
#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,
<<std::endl);
return p;
}
+ //==================================================================
//==================================================================
/// Ctor with the black box from and to and their input and output.
}
+ 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));
+
+
+ bbtkDebugMessage("connection",1,"<== Connection::Connection(\""
+ <<from->bbGetFullName()<<"\",\""<<output<<"\",\""
+ <<to->bbGetFullName()<<"\",\""<<input<<"\")"
+ <<std::endl);
+
+ bbtkDebugMessage("object",2,"==> Connection::Connection(\""
+ <<from->bbGetName()<<"\",\""<<output<<"\",\""
+ <<to->bbGetName()<<"\",\""<<input<<"\")"
+ <<std::endl);
+ }
+ //==================================================================
+
+ //==================================================================
+ Connection::Pointer Connection::New(BlackBox::Pointer from,
+ const std::string& output,
+ BlackBox::Pointer to,
+ const std::string& input )
+ {
+ bbtkDebugMessage("object",1,"##> Connection::Connection(\""
+ <<from->bbGetName()<<"\",\""<<output<<"\",\""
+ <<to->bbGetName()<<"\",\""<<input<<"\")"
+ <<std::endl);
+ Connection::Pointer p =
+ MakePointer(new Connection(from,output,to,input));
+ bbtkDebugMessage("object",1,"<## Connection::Connection(\""
+ <<from->bbGetName()<<"\",\""<<output<<"\",\""
+ <<to->bbGetName()<<"\",\""<<input<<"\")"
+ <<std::endl);
+ return p;
+ }
+ //==================================================================
+
+ //==================================================================
+ /// Ctor with the black box from and to and their input and output.
+/// Check the input and output compatibility
+Connection::Connection(BlackBox::Pointer from, const std::string& output,
+ BlackBox::Pointer to, const std::string& input )
+ : mAdaptor(),
+ mFactory(),
+ mFromAny(false),
+ mToAny(false)
+ {
+ bbtkDebugMessage("object",2,"==> Connection::Connection(\""
+ <<from->bbGetName()<<"\",\""<<output<<"\",\""
+ <<to->bbGetName()<<"\",\""<<input<<"\")"
+ <<std::endl);
+
+ bbtkDebugMessage("connection",1,"==> Connection::Connection(\""
+ <<from->bbGetFullName()<<"\",\""<<output<<"\",\""
+ <<to->bbGetFullName()<<"\",\""<<input<<"\")"
+ <<std::endl);
+
+
+
+ if (! from->bbHasOutput(output) )
+ {
+ bbtkError("The box \""<<from->bbGetTypeName()<<
+ "\" has no output \""<<output<<"\"");
+ }
+ if (! to->bbHasInput(input) )
+ {
+ bbtkError("The box \""<<to->bbGetTypeName()<<
+ "\" has no input \""<<input<<"\"");
+ }
+
+ if (to->bbGetInputConnectorMap().find(input)->second->IsConnected())
+ {
+ bbtkError("The input \""<<input<<"\" of the box \""<<to->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 '"
+ <<GetFullName()
+ <<"' : '"<<from->bbGetName()<<"."<<output
+ <<"' is of type <"
+ <<HumanTypeName<Data>()
+ <<"> : type compatibility with '"
+ <<to->bbGetName()<<"."<<input
+ <<"' will be resolved at run time"
+ );
+ mFromAny = true;
+ }
+ else if ( to->bbGetInputType(input) == typeid(Data) )
+ {
+ bbtkDebugMessage("Kernel",8," -> '"<<input<<"' type is "
+ <<TypeName<Data>()<<" : can receive any data"
+ <<std::endl);
+ mToAny = true;
+ }
+ else
+ {
+ bbtkError("Connection created between different types without Factory provided");
+ }
+ }
+
+
mFrom = from;
mOriginalFrom = from;
mTo = to;
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(\""
<<from->bbGetFullName()<<"\",\""<<output<<"\",\""
//==================================================================
//==================================================================
- /// Backward Update
- IOStatus Connection::BackwardUpdate()
+ /// Recursive execution
+ void Connection::RecursiveExecute()
{
- bbtkDebugMessage("process",5,
- "===> Connection::BackwardUpdate() ["
+ bbtkDebugMessage("process",4,
+ "===> Connection::RecursiveExecute() ["
<<GetFullName()<<"]"<<std::endl);
- IOStatus s = UPTODATE;
- s = mFrom->bbBackwardUpdate(GetThisPointer<Connection>());
+ mFrom->bbRecursiveExecute(GetThisPointer<Connection>());
TransferData();
- if (mAdaptor && (s==MODIFIED)) mAdaptor->bbSetModifiedStatus();
-
- bbtkDebugMessage("process",5,
- "<=== Connection::BackwardUpdate() ["
+ // Transfer status
+ IOStatus s = MODIFIED;
+ if ( mFrom->bbGetOutputConnector(mOutput).GetStatus() == OUTOFDATE)
+ {
+ s = OUTOFDATE;
+ }
+ mTo->bbGetInputConnector(mInput).SetStatus(s);
+
+ bbtkDebugMessage("process",4,
+ " --> '"<<mTo->bbGetName()<<"."<<mInput
+ <<" ["<<&mTo->bbGetInputConnector(mInput)<<"] "
+ <<"' new status '"
+ <<GetIOStatusString(s)
+ <<"'"
+ << std::endl);
+
+ bbtkDebugMessage("process",4,
+ "<=== Connection::RecursiveExecute() ["
<<GetFullName()<<"]"<<std::endl);
- return s;
+ return;
}
//==================================================================
- /*
- //==================================================================
- /// Forward Update
- void Connection::ForwardUpdate()
- {
- bbtkDebugMessageInc("process",2,
- "Connection::ForwardUpdate() ["
- <<GetFullName()<<"]"<<std::endl);
-
- TransferData();
-
- mTo->bbForwardUpdate(this);
-
- bbtkDebugDecTab("process",2);
- }
- //==================================================================
- */
//==================================================================
/// Transfers the data from the source output to the target input
}
//==================================================================
-
+
//==================================================================
- /// Modified
- void Connection::SetModifiedStatus()
+ /// From.Output change propagation
+ void Connection::OnOutputChange(bbtk::BlackBox::Pointer, const std::string&,
+ IOStatus status)
{
- bbtkDebugMessage("modified",2,
- "==> Connection::SetModifiedStatus() ["
+ bbtkDebugMessage("change",2,
+ "==> Connection::OnOutputChange("
+ <<GetIOStatusString(status)<<") ["
<<GetFullName()<<"]"<<std::endl);
+ if (mAdaptor)
+ {
+ BlackBoxInputConnector* ac = mAdaptor->bbGetInputConnectorMap().find("In")->second;
+ mAdaptor->bbSetStatusAndPropagate(ac,status);
+ }
- if (mAdaptor) mAdaptor->bbSetModifiedStatus();
-
- mTo->bbSetModifiedStatus( mTo->bbGetInputConnectorMap().find(mInput)->second );
+ mTo->bbSetStatusAndPropagate( mTo->bbGetInputConnectorMap().find(mInput)->second, status);
- /*
- bbtkDebugMessage("modified",2,
- "==> Connection::SetModifiedStatus() ["
- <<GetFullName()<<"]"<<std::endl);
- */
+
}
//==================================================================
}
bbtkMessage("debug",2," - From : This connection is in OutputConnector connection vector"<<std::endl);
- bbtkMessage("debug",1," * Box from : Check successfull"<<std::endl);
+ bbtkMessage("debug",2," * Box from : Check successfull"<<std::endl);
}
}
bbtkMessage("debug",2," - To : This connection is in InputConnector connection vector"<<std::endl);
- bbtkMessage("debug",1," * Box to : Check successfull"<<std::endl);
+ bbtkMessage("debug",2," * Box to : Check successfull"<<std::endl);
}
}