]> Creatis software - bbtk.git/blob - kernel/src/bbtkConnection.cxx
Bug fix in status propagation
[bbtk.git] / kernel / src / bbtkConnection.cxx
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbtkConnection.cxx,v $
4   Language:  C++
5   Date:      $Date: 2008/12/09 11:48:31 $
6   Version:   $Revision: 1.18 $
7 =========================================================================*/
8
9 /* ---------------------------------------------------------------------
10
11 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
12 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
13 *
14 *  This software is governed by the CeCILL-B license under French law and 
15 *  abiding by the rules of distribution of free software. You can  use, 
16 *  modify and/ or redistribute the software under the terms of the CeCILL-B 
17 *  license as circulated by CEA, CNRS and INRIA at the following URL 
18 *  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
19 *  or in the file LICENSE.txt.
20 *
21 *  As a counterpart to the access to the source code and  rights to copy,
22 *  modify and redistribute granted by the license, users are provided only
23 *  with a limited warranty  and the software's author,  the holder of the
24 *  economic rights,  and the successive licensors  have only  limited
25 *  liability. 
26 *
27 *  The fact that you are presently reading this means that you have had
28 *  knowledge of the CeCILL-B license and that you accept its terms.
29 * ------------------------------------------------------------------------ */                                                                         
30
31 /**
32  *\file
33  *\brief Class bbtk::Connection
34  */
35
36 #include "bbtkConnection.h"
37 #include "bbtkFactory.h"
38 #include "bbtkBlackBox.h"
39 #include "bbtkMessageManager.h"
40 #include "bbtkBlackBoxOutputConnector.h"
41
42 namespace bbtk
43 {
44   const std::string IOSTATUS_STRING[3] = 
45     {"Up-to-date","Modified","Out-of-date"}; 
46   
47   const std::string& GetIOStatusString(IOStatus s)
48   { return IOSTATUS_STRING[s]; }
49
50   //==================================================================
51   Connection::Pointer Connection::New(BlackBox::Pointer from, 
52                                       const std::string& output,
53                                       BlackBox::Pointer to, 
54                                       const std::string& input ,
55                                       const Factory::Pointer f  )
56   {
57     bbtkDebugMessage("object",1,"##> Connection::Connection(\""
58                      <<from->bbGetName()<<"\",\""<<output<<"\",\""
59                      <<to->bbGetName()<<"\",\""<<input<<"\")"
60                      <<std::endl);
61     Connection::Pointer p = 
62       MakePointer(new Connection(from,output,to,input,f));
63     bbtkDebugMessage("object",1,"<## Connection::Connection(\""
64                      <<from->bbGetName()<<"\",\""<<output<<"\",\""
65                      <<to->bbGetName()<<"\",\""<<input<<"\")"
66                      <<std::endl);
67     return p;
68   }
69   //==================================================================
70
71   //==================================================================
72   /// Ctor with the black box from and to and their input and output.
73 /// Check the input and output compatibility
74 Connection::Connection(BlackBox::Pointer from, const std::string& output,
75                        BlackBox::Pointer to, const std::string& input ,
76                        const Factory::Pointer f  )
77     : mAdaptor(),
78       mFactory(f),
79       mFromAny(false),
80       mToAny(false)
81   {
82     bbtkDebugMessage("object",2,"==> Connection::Connection(\""
83                      <<from->bbGetName()<<"\",\""<<output<<"\",\""
84                      <<to->bbGetName()<<"\",\""<<input<<"\")"
85                      <<std::endl);    
86
87     bbtkDebugMessage("connection",1,"==> Connection::Connection(\""
88                      <<from->bbGetFullName()<<"\",\""<<output<<"\",\""
89                      <<to->bbGetFullName()<<"\",\""<<input<<"\")"
90                      <<std::endl);    
91
92     
93
94     if (! from->bbHasOutput(output) )
95       {
96         bbtkError("The box \""<<from->bbGetTypeName()<<
97                   "\" has no output \""<<output<<"\"");
98       }
99     if (! to->bbHasInput(input) )
100       {
101         bbtkError("The box \""<<to->bbGetTypeName()<<
102                   "\" has no input \""<<input<<"\"");
103       } 
104
105     if (to->bbGetInputConnectorMap().find(input)->second->IsConnected())
106       {
107         bbtkError("The input \""<<input<<"\" of the box \""<<to->bbGetName()
108                   <<"\" is already connected");
109       }
110     
111     //  std::string t1 ( from->bbGetOutputType(output).name() );
112     //   std::string t2 ( to->bbGetInputType(input).name() );
113     // if  //( t1 != t2 ) 
114     if ( from->bbGetOutputType(output) !=
115          to->bbGetInputType(input) )
116       {
117         if ( from->bbGetOutputType(output) == typeid(Data) )
118           {
119             bbtkWarning("Connection '"
120                         <<GetFullName()
121                         <<"' : '"<<from->bbGetName()<<"."<<output
122                         <<"' is of type <"
123                         <<HumanTypeName<Data>()
124                         <<"> : type compatibility with '"
125                         <<to->bbGetName()<<"."<<input
126                         <<"' will be resolved at run time"
127                         );
128             mFromAny = true;
129           }
130         else if (  to->bbGetInputType(input) == typeid(Data) )
131           {   
132             bbtkDebugMessage("Kernel",8," -> '"<<input<<"' type is "
133                              <<TypeName<Data>()<<" : can receive any data"
134                              <<std::endl);
135             mToAny = true;
136           }
137         else 
138           {
139             //   std::cout << "Adaptive connection "<<std::endl;
140             std::string name;
141             name = from->bbGetName() + "." + output + "-" 
142               + to->bbGetName() + "." + input; 
143             mAdaptor = mFactory.lock()
144               ->NewAdaptor(from->bbGetOutputType(output),
145                            to->bbGetInputType(input),
146                            name);
147             if (!mAdaptor)  
148               {  
149                 bbtkError("did not find any <"
150                           <<TypeName(from->bbGetOutputType(output))
151                           <<"> to <"
152                           <<TypeName(to->bbGetInputType(input))
153                           <<"> adaptor");
154               } 
155           }
156       }
157
158
159     mFrom = from;
160     mOriginalFrom = from;
161     mTo = to;
162     mOriginalTo = to;
163     mInput = mOriginalInput = input;
164     mOutput = mOriginalOutput = output;
165
166      // Lock this pointer !!!
167     //Pointer p = MakePointer(this,true);
168     from->bbConnectOutput(output,this);
169     to->bbConnectInput(input,this);
170  
171     from->bbGetOutputConnector(output).AddChangeObserver(boost::bind(&bbtk::Connection::OnOutputChange,this, _1, _2, _3));
172
173     
174     bbtkDebugMessage("connection",1,"<== Connection::Connection(\""
175                      <<from->bbGetFullName()<<"\",\""<<output<<"\",\""
176                      <<to->bbGetFullName()<<"\",\""<<input<<"\")"
177                      <<std::endl);    
178
179     bbtkDebugMessage("object",2,"==> Connection::Connection(\""
180                      <<from->bbGetName()<<"\",\""<<output<<"\",\""
181                      <<to->bbGetName()<<"\",\""<<input<<"\")"
182                      <<std::endl);    
183   }
184  //==================================================================
185  
186   //==================================================================
187   Connection::Pointer Connection::New(BlackBox::Pointer from, 
188                                       const std::string& output,
189                                       BlackBox::Pointer to, 
190                                       const std::string& input )
191   {
192     bbtkDebugMessage("object",1,"##> Connection::Connection(\""
193                      <<from->bbGetName()<<"\",\""<<output<<"\",\""
194                      <<to->bbGetName()<<"\",\""<<input<<"\")"
195                      <<std::endl);
196     Connection::Pointer p = 
197       MakePointer(new Connection(from,output,to,input));
198     bbtkDebugMessage("object",1,"<## Connection::Connection(\""
199                      <<from->bbGetName()<<"\",\""<<output<<"\",\""
200                      <<to->bbGetName()<<"\",\""<<input<<"\")"
201                      <<std::endl);
202     return p;
203   }
204   //==================================================================
205
206   //==================================================================
207   /// Ctor with the black box from and to and their input and output.
208 /// Check the input and output compatibility
209 Connection::Connection(BlackBox::Pointer from, const std::string& output,
210                        BlackBox::Pointer to, const std::string& input )
211   : mAdaptor(),
212       mFactory(),
213       mFromAny(false),
214       mToAny(false)
215   {
216     bbtkDebugMessage("object",2,"==> Connection::Connection(\""
217                      <<from->bbGetName()<<"\",\""<<output<<"\",\""
218                      <<to->bbGetName()<<"\",\""<<input<<"\")"
219                      <<std::endl);    
220
221     bbtkDebugMessage("connection",1,"==> Connection::Connection(\""
222                      <<from->bbGetFullName()<<"\",\""<<output<<"\",\""
223                      <<to->bbGetFullName()<<"\",\""<<input<<"\")"
224                      <<std::endl);    
225
226     
227
228     if (! from->bbHasOutput(output) )
229       {
230         bbtkError("The box \""<<from->bbGetTypeName()<<
231                   "\" has no output \""<<output<<"\"");
232       }
233     if (! to->bbHasInput(input) )
234       {
235         bbtkError("The box \""<<to->bbGetTypeName()<<
236                   "\" has no input \""<<input<<"\"");
237       } 
238
239     if (to->bbGetInputConnectorMap().find(input)->second->IsConnected())
240       {
241         bbtkError("The input \""<<input<<"\" of the box \""<<to->bbGetName()
242                   <<"\" is already connected");
243       }
244     
245     //  std::string t1 ( from->bbGetOutputType(output).name() );
246     //   std::string t2 ( to->bbGetInputType(input).name() );
247     // if  //( t1 != t2 ) 
248     if ( from->bbGetOutputType(output) !=
249          to->bbGetInputType(input) )
250       {
251         if ( from->bbGetOutputType(output) == typeid(Data) )
252           {
253             bbtkWarning("Connection '"
254                         <<GetFullName()
255                         <<"' : '"<<from->bbGetName()<<"."<<output
256                         <<"' is of type <"
257                         <<HumanTypeName<Data>()
258                         <<"> : type compatibility with '"
259                         <<to->bbGetName()<<"."<<input
260                         <<"' will be resolved at run time"
261                         );
262             mFromAny = true;
263           }
264         else if (  to->bbGetInputType(input) == typeid(Data) )
265           {   
266             bbtkDebugMessage("Kernel",8," -> '"<<input<<"' type is "
267                              <<TypeName<Data>()<<" : can receive any data"
268                              <<std::endl);
269             mToAny = true;
270           }
271         else 
272           {
273             bbtkError("Connection created between different types without Factory provided");
274           }
275       }
276
277
278     mFrom = from;
279     mOriginalFrom = from;
280     mTo = to;
281     mOriginalTo = to;
282     mInput = mOriginalInput = input;
283     mOutput = mOriginalOutput = output;
284
285      // Lock this pointer !!!
286     //Pointer p = MakePointer(this,true);
287     from->bbConnectOutput(output,this);
288     to->bbConnectInput(input,this);
289
290     from->bbGetOutputConnector(output).AddChangeObserver(boost::bind(&bbtk::Connection::OnOutputChange,this, _1, _2, _3));
291     
292     bbtkDebugMessage("connection",1,"<== Connection::Connection(\""
293                      <<from->bbGetFullName()<<"\",\""<<output<<"\",\""
294                      <<to->bbGetFullName()<<"\",\""<<input<<"\")"
295                      <<std::endl);    
296
297     bbtkDebugMessage("object",2,"==> Connection::Connection(\""
298                      <<from->bbGetName()<<"\",\""<<output<<"\",\""
299                      <<to->bbGetName()<<"\",\""<<input<<"\")"
300                      <<std::endl);    
301   }
302  //==================================================================
303  
304   //==================================================================
305   /// Dtor 
306   Connection::~Connection()
307   {
308     bbtkDebugMessage("object",2,
309                      "==> Connection::~Connection() ["
310                      <<GetFullName()<<"]"<<std::endl);
311
312     if (mAdaptor) mAdaptor.reset();
313     if (mFrom!=0) 
314       {
315         mFrom->bbDisconnectOutput(mOutput,this);
316         //                                GetThisPointer<Connection>());
317         mFrom.reset();
318       }
319     else 
320       {
321         bbtkInternalError("Connection::~Connection() : invalid initial box pointer");
322       }
323     if (mTo!=0) 
324       {
325         mTo->bbDisconnectInput(mInput,this);//   GetThisPointer<Connection>());
326         mTo.reset();
327       }
328     else 
329       {
330         bbtkInternalError("Connection::~Connection() : invalid final box pointer");
331       }
332
333
334     bbtkDebugMessage("object",2,
335                      "<== Connection::~Connection() ["
336                      <<GetFullName()<<"]"<<std::endl);
337   }
338   //==================================================================
339   
340   //==================================================================
341   /// Backward Update
342   void Connection::BackwardUpdate()
343   {
344     bbtkDebugMessage("process",3,
345                      "===> Connection::BackwardUpdate() ["
346                      <<GetFullName()<<"]"<<std::endl);
347
348     mFrom->bbBackwardUpdate(GetThisPointer<Connection>());
349
350     TransferData();
351
352     // Transfer status
353     IOStatus s = MODIFIED;
354     if ( mFrom->bbGetOutputConnector(mOutput).GetStatus() == OUTOFDATE) 
355       {
356         s = OUTOFDATE;
357       }
358     mTo->bbGetInputConnector(mInput).SetStatus(s);
359     
360     bbtkDebugMessage("process",3,
361                      " --> '"<<mTo->bbGetName()<<"."<<mInput
362                      <<" ["<<&mTo->bbGetInputConnector(mInput)<<"] "
363                      <<"' new status '"
364                      <<GetIOStatusString(s)
365                      <<"'"
366                      << std::endl);
367
368     bbtkDebugMessage("process",3,
369                      "<=== Connection::BackwardUpdate() ["
370                      <<GetFullName()<<"]"<<std::endl);
371     return; // s;
372   }
373   //==================================================================
374
375   /*
376   //==================================================================
377   /// Forward Update
378   void Connection::ForwardUpdate()
379   {
380     bbtkDebugMessageInc("process",2,
381                         "Connection::ForwardUpdate() ["
382                         <<GetFullName()<<"]"<<std::endl);
383
384   
385     TransferData();
386
387     mTo->bbForwardUpdate(this);
388
389     bbtkDebugDecTab("process",2);
390   }
391   //==================================================================
392   */
393
394   //==================================================================
395   /// Transfers the data from the source output to the target input
396   /// doing necessary conversions (adaptation or pointer cast)
397   void Connection::TransferData()
398   {
399     bbtkDebugMessageInc("data",3,
400                         "Connection::TransferData() ["
401                         <<GetFullName()<<"]"<<std::endl);
402     
403     
404     // If an adaptor was created we need to adapt the data
405     if (mAdaptor) 
406       {
407         mAdaptor->bbSetInput("In",mFrom->bbGetOutput(mOutput),false);
408         mAdaptor->bbExecute();
409         // LG : Connection Update does not set mTo as modified
410         mTo->bbSetInput(mInput, mAdaptor->bbGetOutput("Out"),false);
411         
412       }
413     // If no adaptor but source type is an any and target is not an any
414     else if ( mFromAny && (! mToAny) )
415       {
416         bbtkDebugMessage("data",3,
417                          " * Source type is an "
418                          <<HumanTypeName<Data>()
419                          <<" which contains a <"
420                          <<HumanTypeName(mFrom->bbGetOutput(mOutput).type())
421                          <<">"<<std::endl);
422         bbtkDebugMessage("data",3,
423                          " * Target type is <"
424                          <<HumanTypeName(mTo->bbGetInputType(mInput))
425                          <<">"<<std::endl);
426         
427         // 1) Test strict type matching between any content and target
428         if (mFrom->bbGetOutput(mOutput)
429             .contains( mTo->bbGetInputType(mInput) ) )
430           {
431             bbtkDebugMessage("data",3,
432                              " -> Equal types : transfer ok"<<std::endl);
433             mTo->bbSetInput( mInput, 
434                              mFrom->bbGetOutput(mOutput),
435                              false);
436           }
437         else 
438           {
439             // 2) Look for an adaptor
440             bbtk::BlackBox::Pointer adaptor;
441             try 
442               {
443                 adaptor = mFactory.lock()
444                   ->NewAdaptor(mFrom->bbGetOutput(mOutput).type(),
445                                mTo->bbGetInputType(mInput),
446                                "");
447               }
448             catch (...)
449               {
450               }
451             if (adaptor)  
452               {
453                 bbtkDebugMessage("data",3," -> Adaptor found : using it"
454                                  <<std::endl);
455                   adaptor->bbSetInput("In",mFrom->bbGetOutput(mOutput),false);
456                 adaptor->bbExecute();
457                 // LG : Connection Update does not set mTo as modified
458                 mTo->bbSetInput(mInput, adaptor->bbGetOutput("Out"),false);
459                 //      adaptor->bbDelete();
460               }
461             // 3) If no adaptor found but the any content is a pointer
462             //    and target type is also a pointer : we try run-time cast
463             else if ( (mFrom->bbGetOutput(mOutput).contains_pointer()) &&
464                       (mTo->bbGetDescriptor()->GetInputDescriptor(mInput)
465                        ->IsPointerType()) )
466               {
467                 bbtkDebugMessage("data",3,
468                                  " -> No adaptor found but source and target types are both pointers : trying up or down cast"<<std::endl);
469                 
470                 void* nptr = 
471                   mFrom->bbGetOutput(mOutput)
472                   .get_pointer_to(mTo->bbGetInput(mInput).pointed_type());
473                 if (!nptr)  
474                   {
475                     bbtkError("Connection '"
476                               <<GetFullName()
477                               <<"' : <"
478                               <<HumanTypeName(mFrom->bbGetOutput(mOutput).type())
479                               <<"> to <"
480                               <<HumanTypeName(mTo->bbGetInputType(mInput))
481                               <<"> : no adaptor available and run-time up and down cast failed");
482                   }
483                 mTo->bbBruteForceSetInputPointer(mInput, nptr, false);
484               }
485             // 4) Nothing worked : error
486             else 
487               {
488                 bbtkError("Connection '"<<GetFullName()<<"' "
489                           <<"no adaptor found to convert <"
490                           <<HumanTypeName(mFrom->bbGetOutput(mOutput).type())
491                           <<"> to <"
492                           <<HumanTypeName(mTo->bbGetInputType(mInput))<<">");
493               }
494           }
495       }
496     // EO : mFromAny && ! mToAny
497     // Default case : types are the same; we use simple get-set
498     else 
499       {
500         // LG : Connection Update does not set mTo as modified
501         mTo->bbSetInput(mInput, mFrom->bbGetOutput(mOutput),false);
502       }
503
504   }
505   //==================================================================
506   
507   /*
508   //==================================================================
509   /// Modified
510   void Connection::SetModifiedStatus()
511   {
512     bbtkDebugMessage("modified",2,
513                      "==> Connection::SetModifiedStatus() ["
514                      <<GetFullName()<<"]"<<std::endl);
515     
516     if (mAdaptor) mAdaptor->bbSetModifiedStatus();
517     
518     mTo->bbSetModifiedStatus(  mTo->bbGetInputConnectorMap().find(mInput)->second );
519     
520  
521   }
522   //==================================================================
523   */
524   //==================================================================
525   /// From.Output change propagation
526   void Connection::OnOutputChange(bbtk::BlackBox::Pointer, const std::string&, 
527                                   IOStatus status)
528   {
529     bbtkDebugMessage("change",2,
530                      "==> Connection::OnOutputChange("
531                      <<GetIOStatusString(status)<<") ["
532                      <<GetFullName()<<"]"<<std::endl);
533     if (mAdaptor) 
534       {
535             BlackBoxInputConnector* ac = mAdaptor->bbGetInputConnectorMap().find("In")->second;
536             mAdaptor->bbSetStatusAndPropagate(ac,status);
537       }
538     
539     mTo->bbSetStatusAndPropagate( mTo->bbGetInputConnectorMap().find(mInput)->second, status);
540     
541  
542   }
543   //==================================================================
544
545   
546   //==================================================================
547   std::string Connection::GetFullName() const {
548     if (mFrom && mTo) 
549       {
550         std::string res = mFrom->bbGetName()+"."+mOutput+"--"
551           +mTo->bbGetName()+"."+mInput;
552         if ((!mOriginalFrom.expired()) && (!mOriginalTo.expired()) &&
553             ((mFrom!=mOriginalFrom.lock())||(mTo!=mOriginalTo.lock())))
554           {
555             res += "("+mOriginalFrom.lock()->bbGetName()
556               +"."+mOriginalOutput+"--"
557               + mOriginalTo.lock()->bbGetName()+"."+mOriginalInput+")";
558           }
559         return res;
560       }
561     return "***Invalid Connection***";
562   }
563   //==================================================================
564
565   //==================================================================
566   void Connection::Check() const
567   {
568     bbtkMessage("debug",1,"** Checking Connection "<<(void*)this<<" ["<<GetFullName()<<"]"
569                 <<std::endl);
570     if (mFrom==0) 
571       {
572         bbtkMessage("debug",2," - From = 0"<<std::endl);
573       }
574     else
575       {
576         bbtkMessage("debug",2," - From : "<<mFrom->bbGetFullName()<<std::endl);
577         if (!mFrom->bbHasOutput(mOutput))
578           {
579             bbtkError("** Checking Connection "<<(void*)this
580                        <<" ["<<GetFullName()<<"] : "
581                       << mFrom->bbGetFullName()<<" does not have output '"
582                       <<mOutput<<"'");
583           }     
584         bbtkMessage("debug",2," - From : Output '"<<mOutput<<"' exists"<<std::endl);
585         BlackBox::OutputConnectorMapType::const_iterator i 
586           = mFrom->bbGetOutputConnectorMap().find(mOutput);
587         if (i== mFrom->bbGetOutputConnectorMap().end())
588           {
589              bbtkError("** Checking Connection "<<(void*)this
590                        <<" ["<<GetFullName()<<"] : "
591                        <<mFrom->bbGetFullName()<<" output '"
592                        <<mOutput<<"' is not in OutputConnectorMap");
593           }
594         bbtkMessage("debug",2," - From : Output '"<<mOutput
595                     <<"' is in OutputConnectorMap"<<std::endl);
596
597         std::vector< Connection* >::const_iterator j;
598         /*
599         for (j  = i->second->GetConnectionVector().begin();
600              j != i->second->GetConnectionVector().end();
601              ++j)
602           {
603             if ((*j)==this) break;
604           }
605         */
606         j = find(i->second->GetConnectionVector().begin(),
607                  i->second->GetConnectionVector().end(),
608                  this);
609        
610         if (j==i->second->GetConnectionVector().end())
611           {
612             bbtkError("** Checking Connection "<<(void*)this
613                       <<" ["<<GetFullName()<<"] : "
614                       << "Connection ["<<GetFullName()<<"] : "
615                       <<" OutputConnector '"
616                       <<mOutput<<"' of "<<mFrom->bbGetFullName()
617                       <<" does not point to this connection");
618             
619           }
620         bbtkMessage("debug",2," - From : This connection is in OutputConnector connection vector"<<std::endl);
621         bbtkMessage("debug",2," * Box from : Check successfull"<<std::endl);
622
623       }
624
625     if (mTo==0) 
626       {
627         bbtkMessage("debug",2," - To   = 0"<<std::endl);
628       }
629     else
630       {
631         bbtkMessage("debug",2," - To   : "<<mTo->bbGetName()<<std::endl);
632         //      std::cout << mTo << std::endl;
633         //      std::cout << mTo->bbGetDescriptor() << std::endl;
634         //      std::cout << mTo->bbGetDescriptor()->GetTypeName() << std::endl;
635         //      mTo->bbGetFullName();
636         bbtkMessage("debug",2," - To   : "<<mTo->bbGetFullName()<<std::endl);
637         if (!mTo->bbHasInput(mInput))
638           {
639             bbtkError("** Checking Connection "<<(void*)this
640                       <<" ["<<GetFullName()<<"] : "
641                       <<mTo->bbGetFullName()<<" does not have input '"
642                       <<mInput<<"'");
643           }     
644         bbtkMessage("debug",2," - To   : Input '"<<mInput<<"' exists"<<std::endl);
645         BlackBox::InputConnectorMapType::const_iterator i 
646           = mTo->bbGetInputConnectorMap().find(mInput);
647         if (i== mTo->bbGetInputConnectorMap().end())
648           {
649              bbtkError("** Checking Connection "<<(void*)this
650                        <<" ["<<GetFullName()<<"] : "
651                        <<mTo->bbGetFullName()<<" input '"
652                        <<mInput<<"' is not in InputConnectorMap");
653           }
654         bbtkMessage("debug",2," - To   : Input '"<<mInput
655                     <<"' is in InputConnectorMap"<<std::endl);
656
657         if (i->second->GetConnection()==0)
658           {
659             bbtkError("** Checking Connection "<<(void*)this
660                       <<" ["<<GetFullName()<<"] : "
661                       <<"Connection "<<GetFullName()<<" : "
662                       <<" InputConnector '"
663                       <<mInput<<"' of "<<mTo->bbGetFullName()
664                       <<" does not point to this connection");
665     
666           }
667         bbtkMessage("debug",2," - To   : This connection is in InputConnector connection vector"<<std::endl);
668         bbtkMessage("debug",2," * Box to   : Check successfull"<<std::endl);
669
670       }
671   }
672   //==================================================================
673  //==========================================================================
674   std::string Connection::GetObjectName() const
675   {
676     std::string s("Connection '");
677     s += GetFullName();
678     s += "'";
679     return s;
680   }
681   //==========================================================================
682   
683   //==========================================================================
684   std::string  Connection::GetObjectInfo() const 
685   {
686     std::stringstream i;
687     return i.str();
688   }
689   //==========================================================================
690
691  //==========================================================================
692 size_t  Connection::GetObjectSize() const 
693 {
694   size_t s = Superclass::GetObjectSize();
695   s += Connection::GetObjectInternalSize();
696   return s;
697   }
698   //==========================================================================
699   //==========================================================================
700 size_t  Connection::GetObjectInternalSize() const 
701 {
702   size_t s = sizeof(Connection);
703   return s;
704   }
705   //==========================================================================
706   //==========================================================================
707   size_t  Connection::GetObjectRecursiveSize() const 
708   {
709     size_t s = Superclass::GetObjectRecursiveSize();
710     s += Connection::GetObjectInternalSize();
711     return s;
712   }
713   //==========================================================================
714
715 }// namespace bbtk
716
717
718
719
720