]> Creatis software - bbtk.git/blob - kernel/src/bbtkAtomicBlackBox.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkAtomicBlackBox.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkAtomicBlackBox.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/02/07 11:06:37 $
7   Version:   $Revision: 1.1 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18
19
20 /**
21  *  \file 
22  *  \brief class bbtk::AtomicBlackBox : abstract user defined black boxes
23  */
24 #include "bbtkAtomicBlackBox.h"
25
26 namespace bbtk
27 {
28   
29   //=========================================================================
30   AtomicBlackBox::AtomicBlackBox(const std::string &name, bool alloc)
31     : BlackBox(name)
32   {
33     bbtkDebugMessageInc("Kernel",7,
34                         "AtomicBlackBox::AtomicBlackBox(\""
35                         <<name<<"\")"<<std::endl);
36     bbtkDebugDecTab("Kernel",7);
37   }
38   //========================================================================= 
39   
40   //=========================================================================
41   /// Constructor from an existing box (copy) with a new name 
42   AtomicBlackBox::AtomicBlackBox(AtomicBlackBox& from, 
43                              const std::string &name, 
44                              bool alloc)
45     : BlackBox(from,name)
46   {
47     bbtkDebugMessageInc("Kernel",7,
48                         "AtomicBlackBox::AtomicBlackBox("
49                         <<from.bbGetFullName()<<",\""
50                         <<name<<"\")"<<std::endl);
51     bbtkDebugDecTab("Kernel",7);
52     
53   }
54   //=========================================================================
55   
56   
57   //=========================================================================
58   ///  Destructor
59   AtomicBlackBox::~AtomicBlackBox()
60   {
61     bbtkDebugMessage("Kernel",7,"AtomicBlackBox::~AtomicBlackBox()"
62                      <<std::endl);
63   } 
64   //=========================================================================
65   
66   
67
68   //=========================================================================
69   /// Main processing method of the box.
70   IOStatus AtomicBlackBox::bbBackwardUpdate( Connection* caller )
71   {
72     bbtkDebugMessageInc("Process",1,
73                         "=> AtomicBlackBox::bbBackwardUpdate() ["
74                         <<bbGetFullName()<<"]"<<std::endl);
75     
76     bbtkDebugMessage("Process",5,"Initial Status  = "<<bbGetStatus()<<std::endl);
77     bbtkDebugMessage("Process",5,"BoxProcessMode  = "<<bbGetInputBoxProcessMode()<<std::endl);
78    
79     /* 
80     if ( bbGetStatus() == UPDATING ) 
81       {
82         bbtkMessage("Warning",1,"!! WARNING !! Cyclic pipeline execution (bbBackwardUpdate ["<<bbGetFullName()<<"] reentered). This may indicate an error in pipeline conception"<<std::endl);
83         //      return UPTODATE;
84         bbSetStatus(MODIFIED);
85       }
86     */
87
88     if ( ( bbGetStatus() == MODIFIED ) ||
89          ( bbBoxProcessModeIsAlways() ) )
90       {
91         bool wasExecuting = bbGlobalGetSomeBoxExecuting();
92         bbGlobalSetSomeBoxExecuting(true);
93
94         //      bbSetStatus(UPDATING);
95
96         // Updates its inputs
97         IOStatus s = bbUpdateInputs();
98         
99         bbtkDebugMessage("Process",6,"Inputs post-update status = "<<s<<std::endl);
100         // If all inputs are in UPTODATE post-update status 
101         // and mProcessMode is not "Always"
102         // then the box is now UPTODATE
103         if ( ( s == UPTODATE ) && 
104              ( ! bbBoxProcessModeIsAlways() ) ) 
105           {
106             bbSetStatus(UPTODATE);
107           }
108         else 
109           {
110             // else it remains MODIFIED
111             bbSetStatus(MODIFIED);
112           }     
113
114         // Creates the window (WxBlackbox)
115         //      bbCreateWindow();
116
117         // Children update (WxContainerBlackBox)
118         //      bbUpdateChildren(caller);       
119
120         // User process
121         bbProcess();
122
123         // Displays the window (WxBlackbox)
124         bbShowWindow(caller);
125
126
127
128         bbGlobalSetSomeBoxExecuting(wasExecuting);
129
130
131       }
132     else 
133       {
134         bbtkDebugMessage("Process",5,"Up-to-date : nothing to do"<<std::endl);
135       }
136
137     bbtkDebugMessage("Process",5,"Final Status    = "
138                      <<bbGetStatus()<<std::endl);
139     bbtkDebugMessage("Process",1,
140                      "<= AtomicBlackBox::bbBackwardUpdate() ["
141                      <<bbGetFullName()<<"]"<<std::endl);
142     bbtkDebugDecTab("Process",1);
143
144     return bbGetStatus();
145
146   }
147   //=========================================================================
148   
149     
150   //=========================================================================
151   Data AtomicBlackBox::bbGetOutput( const std::string &name )
152   {
153     bbtkDebugMessageInc("Data",7,
154                         "AtomicBlackBox::bbGetOutput(\""<<name<<"\") ["
155                         <<bbGetFullName()<<"]"
156                         <<std::endl);
157     
158     Data p = ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()->GetOutputDescriptor(name))->GetGetFunctor()->Get(this);
159     
160     bbtkDebugDecTab("Data",7);
161     return p;
162   }
163   //=========================================================================
164   
165   
166   //=========================================================================
167   ///  Gets the input Data of a given name
168   Data AtomicBlackBox::bbGetInput( const std::string &name ) 
169   {
170     bbtkDebugMessageInc("Data",7,
171                         "AtomicBlackBox::bbGetInput(\""<<name<<"\") ["
172                         <<bbGetFullName()<<"]"
173                         <<std::endl);  
174     
175     Data p = ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()->GetInputDescriptor(name))->GetGetFunctor()->Get(this);
176     
177     bbtkDebugDecTab("Data",7);
178     return p;
179   }
180   //=========================================================================
181   
182   
183   //=========================================================================
184   ///  Sets the data of the output called <name>
185   void AtomicBlackBox::bbSetOutput( const std::string &name, Data data)
186   {
187     bbtkDebugMessageInc("Data",7,
188                         "AtomicBlackBox::bbSetOutput(\""<<name<<"\",data) ["
189                         <<bbGetFullName()<<"]"
190                         <<std::endl); 
191     
192     ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()->GetOutputDescriptor(name))->GetSetFunctor()->Set(this,data);
193     
194     bbtkDebugDecTab("Data",7);
195   }  
196   //=========================================================================
197   
198   
199   //=========================================================================
200   ///  Sets the data of the input called <name>
201   void AtomicBlackBox::bbSetInput( const std::string &name, Data data, 
202                                  bool setModified )
203   {
204     bbtkDebugMessageInc("Data",7,
205                         "AtomicBlackBox::bbSetInput(\""<<name<<"\",data) ["
206                         <<bbGetFullName()<<"]"
207                         <<std::endl);  
208     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()->GetInputDescriptor(name))->GetSetFunctor()->Set(this,data);
209     
210     if (setModified) 
211       {
212         bbSetModifiedStatus();
213       }
214     
215     bbtkDebugDecTab("Data",7);
216   }
217   //=========================================================================
218   
219     //=========================================================================
220   ///  Sets the data of the input called <name>
221   void AtomicBlackBox::bbBruteForceSetInputPointer( const std::string &name, 
222                                                   void* data, 
223                                                   bool setModified )
224   {
225     bbtkDebugMessageInc("Data",7,
226                         "AtomicBlackBox::bbBruteForceSetInputPointer(\""
227                         <<name<<"\",data) ["
228                         <<bbGetFullName()<<"]"
229                         <<std::endl);  
230     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()->GetInputDescriptor(name))->GetSetFunctor()->BruteForceSetPointer(this,data);
231     
232     if (setModified) 
233       {
234         bbSetModifiedStatus();
235       }
236     
237     bbtkDebugDecTab("Data",7);
238   }
239   //=========================================================================
240   
241 }
242 // EO namespace bbtk