]> Creatis software - bbtk.git/blob - kernel/src/bbtkAtomicBlackBox.cxx
1dba6df361e943a0857a2fdaa979883317692e59
[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/24 10:11:27 $
7   Version:   $Revision: 1.6 $
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",3,
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",3,
131             "<= AtomicBlackBox::bbBackwardUpdate() ["
132             <<bbGetFullName()<<"]"<<std::endl);
133
134
135     return bbGetStatus();
136
137   }
138   //=========================================================================
139   
140     
141   //=========================================================================
142   Data AtomicBlackBox::bbGetOutput( const std::string &name )
143   {
144     bbtkDebugMessageInc("Data",7,
145             "AtomicBlackBox::bbGetOutput(\""<<name<<"\") ["
146             <<bbGetFullName()<<"]"
147             <<std::endl);
148     
149     Data p = ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
150                 ->GetOutputDescriptor(name))->GetGetFunctor()->Get(this);
151     
152     bbtkDebugDecTab("Data",7);
153     return p;
154   }
155   //=========================================================================
156   
157   
158   //=========================================================================
159   ///  Gets the input Data of a given name
160   Data AtomicBlackBox::bbGetInput( const std::string &name ) 
161   {
162     bbtkDebugMessageInc("Data",7,
163             "AtomicBlackBox::bbGetInput(\""<<name<<"\") ["
164             <<bbGetFullName()<<"]"
165             <<std::endl);  
166     
167     Data p = ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
168                 ->GetInputDescriptor(name))->GetGetFunctor()->Get(this);
169     
170     bbtkDebugDecTab("Data",7);
171     return p;
172   }
173   //=========================================================================
174   
175   
176   //=========================================================================
177   ///  Sets the data of the output called <name>
178   void AtomicBlackBox::bbSetOutput( const std::string &name, Data data)
179   {
180     bbtkDebugMessageInc("Data",7,
181             "AtomicBlackBox::bbSetOutput(\""<<name<<"\",data) ["
182             <<bbGetFullName()<<"]"
183             <<std::endl); 
184     
185     ((AtomicBlackBoxOutputDescriptor*)bbGetDescriptor()
186         ->GetOutputDescriptor(name))->GetSetFunctor()->Set(this,data);
187     
188     bbtkDebugDecTab("Data",7);
189   }  
190   //=========================================================================
191   
192   
193   //=========================================================================
194   ///  Sets the data of the input called <name>
195   void AtomicBlackBox::bbSetInput(
196                 const std::string &name,
197                 Data data, 
198                 bool setModified )
199   {
200     bbtkDebugMessageInc("Data",7,
201             "AtomicBlackBox::bbSetInput(\""<<name<<"\",data) ["
202             <<bbGetFullName()<<"]"
203             <<std::endl);  
204     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()->GetInputDescriptor(name))->GetSetFunctor()->Set(this,data);
205     
206     if (setModified) 
207         {
208             bbSetModifiedStatus();
209         }
210     
211     bbtkDebugDecTab("Data",7);
212   }
213   //=========================================================================
214   
215     //=========================================================================
216   ///  Sets the data of the input called <name>
217   void AtomicBlackBox::bbBruteForceSetInputPointer
218     (
219                     const std::string &name, 
220                     void* data, 
221                     bool setModified
222     )
223   {
224     bbtkDebugMessageInc("Data",7,
225             "AtomicBlackBox::bbBruteForceSetInputPointer(\""
226             <<name<<"\",data) ["
227             <<bbGetFullName()<<"]"
228             <<std::endl);  
229     ((AtomicBlackBoxInputDescriptor*)bbGetDescriptor()
230         ->GetInputDescriptor(name))->GetSetFunctor()
231             ->BruteForceSetPointer(this,data);
232     
233     if (setModified) 
234       {
235         bbSetModifiedStatus();
236       }
237     
238     bbtkDebugDecTab("Data",7);
239   }
240   //=========================================================================
241  
242
243
244   //==========================================================================
245   std::string AtomicBlackBox::GetObjectInfo() const 
246   {
247     std::stringstream i;
248     return i.str();
249   }
250   //==========================================================================
251
252   //==========================================================================
253   size_t AtomicBlackBox::GetObjectSize() const 
254   {
255     return sizeof(*this);
256   }
257   //==========================================================================
258   
259   //==========================================================================
260   size_t AtomicBlackBox::GetObjectRecursiveSize() const 
261   {
262     size_t s = GetObjectSize();
263     return s;
264   }
265   //==========================================================================
266
267  
268 }
269 // EO namespace bbtk