]> Creatis software - bbtk.git/blob - kernel/src/bbtkAtomicBlackBox.cxx
=== MAJOR RELEASE ====
[bbtk.git] / kernel / src / bbtkAtomicBlackBox.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkAtomicBlackBox.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/04/18 12:59:14 $
7   Version:   $Revision: 1.4 $
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     bbtkDebugMessage("object",3,
34                      "==> AtomicBlackBox::AtomicBlackBox(\""
35                      <<name<<"\")"<<std::endl);
36     bbtkDebugMessage("object",3,
37                      "<== AtomicBlackBox::AtomicBlackBox(\""
38                      <<name<<"\")"<<std::endl);
39   }
40   //========================================================================= 
41   
42   //=========================================================================
43   /// Constructor from an existing box (copy) with a new name 
44   AtomicBlackBox::AtomicBlackBox(AtomicBlackBox& from, 
45                 const std::string &name, 
46                 bool alloc)
47     : BlackBox(from,name)
48   {
49     bbtkDebugMessage("object",3,
50                      "==>AtomicBlackBox::AtomicBlackBox("
51                      <<from.bbGetFullName()<<",\""
52                      <<name<<"\")"<<std::endl);
53     bbtkDebugMessage("object",3,
54                      "<==AtomicBlackBox::AtomicBlackBox("
55                      <<from.bbGetFullName()<<",\""
56                      <<name<<"\")"<<std::endl);
57     
58   }
59   //=========================================================================
60   
61   
62   //=========================================================================
63   ///  Destructor
64   AtomicBlackBox::~AtomicBlackBox()
65   {
66     bbtkDebugMessage("object",3,"==> AtomicBlackBox::~AtomicBlackBox()"
67                      <<std::endl);
68     bbtkDebugMessage("object",3,"<== AtomicBlackBox::~AtomicBlackBox()"
69                      <<std::endl);
70   } 
71   //=========================================================================
72   
73
74
75   //=========================================================================
76   /// Main processing method of the box.
77   IOStatus AtomicBlackBox::bbBackwardUpdate( Connection::Pointer caller )
78   {
79     bbtkDebugMessageInc("Process",1,
80                         "=> AtomicBlackBox::bbBackwardUpdate("
81                         <<(caller?caller->GetFullName():"0")<<") ["
82                         <<bbGetFullName()<<"]"<<std::endl);
83     
84     if (bbGetExecuting()) 
85       {
86         bbtkWarning(bbGetFullName()<<" : Cyclic execution stopped");
87         return UPTODATE;
88       }
89     bbSetExecuting(true);
90
91     bbtkDebugMessage("Process",5,"Initial Status  = "<<bbGetStatus()
92                     <<std::endl);
93     bbtkDebugMessage("Process",5,"BoxProcessMode  = "
94                     <<bbGetInputBoxProcessMode()<<std::endl);
95    
96     /* 
97     if ( bbGetStatus() == UPDATING ) 
98       {
99     bbtkMessage("Warning",1,"!! WARNING !! Cyclic pipeline execution (bbBackwardUpdate ["<<bbGetFullName()<<"] reentered). This may indicate an error in pipeline conception"<<std::endl);
100     //  return UPTODATE;
101     bbSetStatus(MODIFIED);
102       }
103     */
104
105     if ( ( bbGetStatus() == MODIFIED ) ||
106         ( bbBoxProcessModeIsAlways() ) )
107       {
108         bool wasExecuting = bbGlobalGetSomeBoxExecuting();
109         bbGlobalSetSomeBoxExecuting(true);
110
111         //      bbSetStatus(UPDATING);
112
113         // Updates its inputs
114         IOStatus s = bbUpdateInputs();
115     
116         bbtkDebugMessage("Process",6,"Inputs post-update status = "<<s<<std::endl);
117         // If all inputs are in UPTODATE post-update status 
118         // and mProcessMode is not "Always"
119         // then the box is now UPTODATE
120         if ( ( s == UPTODATE ) && 
121             ( ! bbBoxProcessModeIsAlways() ) ) 
122             {
123                 bbSetStatus(UPTODATE);
124             }
125         else 
126             {
127                 // else it remains MODIFIED
128                 bbSetStatus(MODIFIED);
129             }
130
131         // User process
132         bbProcess();
133
134         // Displays the window (WxBlackbox)
135         bbShowWindow(caller);
136
137         bbGlobalSetSomeBoxExecuting(wasExecuting);
138
139       }
140     else 
141       {
142         bbtkDebugMessage("Process",5,"Up-to-date : nothing to do"<<std::endl);
143       }
144
145     bbtkDebugMessage("Process",5,"Final Status    = "
146             <<bbGetStatus()<<std::endl);
147     bbtkDebugMessage("Process",1,
148             "<= AtomicBlackBox::bbBackwardUpdate() ["
149             <<bbGetFullName()<<"]"<<std::endl);
150     bbtkDebugDecTab("Process",1);
151
152     bbSetExecuting(false);
153
154     return bbGetStatus();
155
156   }
157   //=========================================================================
158   
159     
160   //=========================================================================
161   Data AtomicBlackBox::bbGetOutput( const std::string &name )
162   {
163     bbtkDebugMessageInc("Data",7,
164             "AtomicBlackBox::bbGetOutput(\""<<name<<"\") ["
165             <<bbGetFullName()<<"]"
166             <<std::endl);
167     
168     Data p = ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
169                 ->GetOutputDescriptor(name))->GetGetFunctor()->Get(this);
170     
171     bbtkDebugDecTab("Data",7);
172     return p;
173   }
174   //=========================================================================
175   
176   
177   //=========================================================================
178   ///  Gets the input Data of a given name
179   Data AtomicBlackBox::bbGetInput( const std::string &name ) 
180   {
181     bbtkDebugMessageInc("Data",7,
182             "AtomicBlackBox::bbGetInput(\""<<name<<"\") ["
183             <<bbGetFullName()<<"]"
184             <<std::endl);  
185     
186     Data p = ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
187                 ->GetInputDescriptor(name))->GetGetFunctor()->Get(this);
188     
189     bbtkDebugDecTab("Data",7);
190     return p;
191   }
192   //=========================================================================
193   
194   
195   //=========================================================================
196   ///  Sets the data of the output called <name>
197   void AtomicBlackBox::bbSetOutput( const std::string &name, Data data)
198   {
199     bbtkDebugMessageInc("Data",7,
200             "AtomicBlackBox::bbSetOutput(\""<<name<<"\",data) ["
201             <<bbGetFullName()<<"]"
202             <<std::endl); 
203     
204     ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
205         ->GetOutputDescriptor(name))->GetSetFunctor()->Set(this,data);
206     
207     bbtkDebugDecTab("Data",7);
208   }  
209   //=========================================================================
210   
211   
212   //=========================================================================
213   ///  Sets the data of the input called <name>
214   void AtomicBlackBox::bbSetInput(
215                 const std::string &name,
216                 Data data, 
217                 bool setModified )
218   {
219     bbtkDebugMessageInc("Data",7,
220             "AtomicBlackBox::bbSetInput(\""<<name<<"\",data) ["
221             <<bbGetFullName()<<"]"
222             <<std::endl);  
223     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()->GetInputDescriptor(name))->GetSetFunctor()->Set(this,data);
224     
225     if (setModified) 
226         {
227             bbSetModifiedStatus();
228         }
229     
230     bbtkDebugDecTab("Data",7);
231   }
232   //=========================================================================
233   
234     //=========================================================================
235   ///  Sets the data of the input called <name>
236   void AtomicBlackBox::bbBruteForceSetInputPointer
237     (
238                     const std::string &name, 
239                     void* data, 
240                     bool setModified
241     )
242   {
243     bbtkDebugMessageInc("Data",7,
244             "AtomicBlackBox::bbBruteForceSetInputPointer(\""
245             <<name<<"\",data) ["
246             <<bbGetFullName()<<"]"
247             <<std::endl);  
248     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
249         ->GetInputDescriptor(name))->GetSetFunctor()
250             ->BruteForceSetPointer(this,data);
251     
252     if (setModified) 
253       {
254         bbSetModifiedStatus();
255       }
256     
257     bbtkDebugDecTab("Data",7);
258   }
259   //=========================================================================
260  
261
262
263   //==========================================================================
264   std::string AtomicBlackBox::GetObjectInfo() const 
265   {
266     std::stringstream i;
267     return i.str();
268   }
269   //==========================================================================
270
271   //==========================================================================
272   size_t AtomicBlackBox::GetObjectSize() const 
273   {
274     return sizeof(*this);
275   }
276   //==========================================================================
277   
278   //==========================================================================
279   size_t AtomicBlackBox::GetObjectRecursiveSize() const 
280   {
281     size_t s = GetObjectSize();
282     return s;
283   }
284   //==========================================================================
285
286  
287 }
288 // EO namespace bbtk