]> 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/04/21 12:43:05 $
7   Version:   $Revision: 1.5 $
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     bbtkDebugMessage("Process",5,"Initial Status  = "<<bbGetStatus()
85                     <<std::endl);
86     bbtkDebugMessage("Process",5,"BoxProcessMode  = "
87                     <<bbGetInputBoxProcessMode()<<std::endl);
88    
89
90     if ( ( bbGetStatus() == MODIFIED ) ||
91         ( bbBoxProcessModeIsAlways() ) )
92       {
93         bool wasExecuting = bbGlobalGetSomeBoxExecuting();
94         bbGlobalSetSomeBoxExecuting(true);
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         // User process
115         bbProcess();
116
117         // Displays the window (WxBlackbox)
118         bbShowWindow(caller);
119
120         bbGlobalSetSomeBoxExecuting(wasExecuting);
121
122       }
123     else 
124       {
125         bbtkDebugMessage("Process",5,"Up-to-date : nothing to do"<<std::endl);
126       }
127
128     bbtkDebugMessage("Process",5,"Final Status    = "
129             <<bbGetStatus()<<std::endl);
130     bbtkDebugMessage("Process",1,
131             "<= AtomicBlackBox::bbBackwardUpdate() ["
132             <<bbGetFullName()<<"]"<<std::endl);
133     bbtkDebugDecTab("Process",1);
134
135
136     return bbGetStatus();
137
138   }
139   //=========================================================================
140   
141     
142   //=========================================================================
143   Data AtomicBlackBox::bbGetOutput( const std::string &name )
144   {
145     bbtkDebugMessageInc("Data",7,
146             "AtomicBlackBox::bbGetOutput(\""<<name<<"\") ["
147             <<bbGetFullName()<<"]"
148             <<std::endl);
149     
150     Data p = ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
151                 ->GetOutputDescriptor(name))->GetGetFunctor()->Get(this);
152     
153     bbtkDebugDecTab("Data",7);
154     return p;
155   }
156   //=========================================================================
157   
158   
159   //=========================================================================
160   ///  Gets the input Data of a given name
161   Data AtomicBlackBox::bbGetInput( const std::string &name ) 
162   {
163     bbtkDebugMessageInc("Data",7,
164             "AtomicBlackBox::bbGetInput(\""<<name<<"\") ["
165             <<bbGetFullName()<<"]"
166             <<std::endl);  
167     
168     Data p = ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
169                 ->GetInputDescriptor(name))->GetGetFunctor()->Get(this);
170     
171     bbtkDebugDecTab("Data",7);
172     return p;
173   }
174   //=========================================================================
175   
176   
177   //=========================================================================
178   ///  Sets the data of the output called <name>
179   void AtomicBlackBox::bbSetOutput( const std::string &name, Data data)
180   {
181     bbtkDebugMessageInc("Data",7,
182             "AtomicBlackBox::bbSetOutput(\""<<name<<"\",data) ["
183             <<bbGetFullName()<<"]"
184             <<std::endl); 
185     
186     ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
187         ->GetOutputDescriptor(name))->GetSetFunctor()->Set(this,data);
188     
189     bbtkDebugDecTab("Data",7);
190   }  
191   //=========================================================================
192   
193   
194   //=========================================================================
195   ///  Sets the data of the input called <name>
196   void AtomicBlackBox::bbSetInput(
197                 const std::string &name,
198                 Data data, 
199                 bool setModified )
200   {
201     bbtkDebugMessageInc("Data",7,
202             "AtomicBlackBox::bbSetInput(\""<<name<<"\",data) ["
203             <<bbGetFullName()<<"]"
204             <<std::endl);  
205     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()->GetInputDescriptor(name))->GetSetFunctor()->Set(this,data);
206     
207     if (setModified) 
208         {
209             bbSetModifiedStatus();
210         }
211     
212     bbtkDebugDecTab("Data",7);
213   }
214   //=========================================================================
215   
216     //=========================================================================
217   ///  Sets the data of the input called <name>
218   void AtomicBlackBox::bbBruteForceSetInputPointer
219     (
220                     const std::string &name, 
221                     void* data, 
222                     bool setModified
223     )
224   {
225     bbtkDebugMessageInc("Data",7,
226             "AtomicBlackBox::bbBruteForceSetInputPointer(\""
227             <<name<<"\",data) ["
228             <<bbGetFullName()<<"]"
229             <<std::endl);  
230     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
231         ->GetInputDescriptor(name))->GetSetFunctor()
232             ->BruteForceSetPointer(this,data);
233     
234     if (setModified) 
235       {
236         bbSetModifiedStatus();
237       }
238     
239     bbtkDebugDecTab("Data",7);
240   }
241   //=========================================================================
242  
243
244
245   //==========================================================================
246   std::string AtomicBlackBox::GetObjectInfo() const 
247   {
248     std::stringstream i;
249     return i.str();
250   }
251   //==========================================================================
252
253   //==========================================================================
254   size_t AtomicBlackBox::GetObjectSize() const 
255   {
256     return sizeof(*this);
257   }
258   //==========================================================================
259   
260   //==========================================================================
261   size_t AtomicBlackBox::GetObjectRecursiveSize() const 
262   {
263     size_t s = GetObjectSize();
264     return s;
265   }
266   //==========================================================================
267
268  
269 }
270 // EO namespace bbtk