]> Creatis software - bbtk.git/blob - kernel/src/bbtkAtomicBlackBox.h
*** empty log message ***
[bbtk.git] / kernel / src / bbtkAtomicBlackBox.h
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkAtomicBlackBox.h,v $
5   Language:  C++
6   Date:      $Date: 2008/04/08 06:59:29 $
7   Version:   $Revision: 1.3 $
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 : ancestor of all user defined (concrete) black boxes which are atomic (vs. complex boxes which are made up of other (atomic or complex) boxes).
23  */
24
25 /**
26  *  \class bbtk::AtomicBlackBox
27  *  \brief Ancestor of all user defined (concrete) black boxes which are atomic (vs. complex boxes which are made up of other (atomic or complex) boxes).
28  */
29  
30 #ifndef __bbtkAtomicBlackBox_h__
31 #define __bbtkAtomicBlackBox_h__
32
33 #include "bbtkBlackBox.h"
34 #include "bbtkAtomicBlackBoxDescriptor.h"
35
36 namespace bbtk
37 {
38
39  
40   //==================================================================
41   class BBTK_EXPORT AtomicBlackBox : public bbtk::BlackBox
42   {
43     //==================================================================
44   public: 
45     //==================================================================
46     /// Gets the output Data of a given label
47     Data bbGetOutput( const std::string &label );
48     ///  Gets the input Data of a given label
49     Data bbGetInput( const std::string &label );
50     ///  Sets the data of the output called <name>
51     void bbSetOutput( const std::string &name, Data data);
52     ///  Sets the data of the input called <name>
53     void bbSetInput( const std::string &name, Data data, 
54                      bool setModified = true);
55     ///  Sets the data of the input called <name>
56     void bbBruteForceSetInputPointer( const std::string &name, 
57                                       void* data, 
58                                       bool setModified = true);
59     //==================================================================
60
61     //==================================================================
62     ///  Destructor
63     virtual ~AtomicBlackBox();
64     //==================================================================
65
66     //==================================================================
67   protected:
68     //==================================================================
69     ///  Constructor with the AtomicBlackBox's instance name
70     AtomicBlackBox(const std::string &name, bool alloc = true);
71     /// Constructor from an existing box (copy) with a new instance name 
72     AtomicBlackBox(AtomicBlackBox& from, const std::string &name, 
73                  bool alloc = true);
74     //==================================================================
75
76   public:
77     //==================================================================   
78     /// Recursive pipeline processing in backward direction 
79     /// (recursion is in backward direction however execution always goes forward).
80     /// 
81     /// \returns The final status of the box (UPTODATE or MODIFIED)
82     ///
83     /// First checks that re-processing is needed (either Status==MODIFIED or InputProcessMode==Always)
84     /// then : 
85     /// - updates its inputs by calling bbUpdateInputs (which recursively calls bbBackwardUpdate on upstream boxes)
86     /// - calls bbProcess which here simply calls the user callback bbUserProcess which does the actual processing. 
87     ///    bbProcess is overloaded in WxBlackBox to handle widget creation and show
88     virtual IOStatus bbBackwardUpdate(Connection* caller);
89     //==================================================================
90
91     //==================================================================
92   protected:
93     //==================================================================
94     /// Calls the user defined processing method.
95     /// Overloaded in WxBlackBox to handle widget creation and show
96     virtual void bbProcess() { this->bbUserProcess(); }
97     //==================================================================
98
99     //==================================================================
100     /// User callback which computes the outputs as a function of the inputs. 
101     /// It is assumed to be deterministic and thus is only called is the inputs have changed 
102     /// (i.e. if the black box is marked as modified)
103     virtual void bbUserProcess() 
104     {
105       bbtkWarning("AtomicBlackBox::bbUserProcess() not overloaded for box '"
106                   <<bbGetFullName()
107                   <<"' : the box does nothing. Is it a bug or a feature ?"
108                   <<std::endl);
109     }
110     //==================================================================
111
112     //==================================================================
113     /// User callback called in the box contructor
114     virtual void bbUserConstructor() {}
115     /// User callback called in the box copy constructor
116     virtual void bbUserCopyConstructor() {}
117     /// User callback called in the box destructor
118     virtual void bbUserDestructor() {}
119     //==================================================================    
120
121      //==================================================================
122   private:
123     //================================================================== 
124     /// Default constructor is private : 
125     /// derived classes must use the constructor with the AtomicBlackBox's name
126     AtomicBlackBox() : BlackBox("") {}
127     //================================================================== 
128
129
130   };
131   // Class AtomicBlackBox
132   //===========================================================================
133
134
135
136 }
137 // namespace bbtk
138
139
140 #include "bbtkAtomicBlackBoxMacros.h"
141
142 #endif
143