Recipie.h

Go to the documentation of this file.
00001 #ifndef __RECIPIE_H__
00002 #define __RECIPIE_H__
00003 
00004 #undef DEBUG
00005 #define DEBUG 0
00006 #include "libDebug.h"
00007 
00008 //============================================================================
00009 //=================================================p===========================
00010 template<class SOURCE>
00011 class RecipieOf: public Counted
00012 {
00013   typedef typename SOURCE::type_point POINT;
00014   typedef typename SOURCE::type_data DATA;
00015   typedef typename SOURCE::type_precision PRECISION;
00016 public:
00017   typedef typename SOURCE::type_point type_point;
00018   typedef typename SOURCE::type_data type_data;
00019   static const int type_dimensionality = SOURCE::type_dimensionality;
00020   typedef typename SOURCE::type_precision type_precision;
00021   typedef SOURCE type_source;
00022 
00023 private:
00024   int m_csrc;
00025   SOURCE* m_vsrcFinal;
00026 
00027 protected:
00028   // must call
00029   RecipieOf() :
00030     Counted(), m_csrc(0), m_vsrcFinal(NULL)
00031   {
00032   }
00033 
00034   void SetSource(int c, SOURCE* vsrc)
00035   {
00036     m_csrc = c;
00037     m_vsrcFinal = vsrc;
00038   }
00039 
00040 public:
00041   // must reimplement these
00042   virtual void RegisterParameters(RegistryOfParameters& regParam) =0;
00043 
00044   virtual void RegisterInitialSteps(RegistryOfInitialSteps& regSteps) =0;
00045 
00046   virtual void Normalize() =0;
00047 
00048 public:
00049   virtual ~RecipieOf() __attribute__((always_inline))
00050   {
00051   }
00052 
00053   // other methods
00054   virtual const POINT& Size() const
00055   {
00056     return m_vsrcFinal[0].Size();
00057   }
00058 
00059   virtual PRECISION CSize() const
00060   {
00061     return m_vsrcFinal[0].CSize();
00062   }
00063 
00064   virtual void GetPoint(DATA* vdataOut, const POINT& pt) const
00065   {
00066     for (int n = 0; n < m_csrc; n++)
00067       {
00068       ::GetPoint(m_vsrcFinal[n], vdataOut[n], pt);
00069       }
00070   }
00071 
00072   virtual void PrepareForAccess() const
00073   {
00074     for (int n = 0; n < m_csrc; n++)
00075       {
00076       m_vsrcFinal[n].PrepareForAccess();
00077       }
00078   }
00079 
00080   virtual void PrepareForAccess(int n) const
00081   {
00082     m_vsrcFinal[n].PrepareForAccess();
00083   }
00084 
00085   virtual String Describe() const
00086   {
00087     String s;
00088     for (int n = 0; n < m_csrc; n++)
00089       {
00090       s = s + (_LINE + "Source " + n + LINE_ + (_INDENT
00091           + m_vsrcFinal[n].Describe()));
00092       }
00093 
00094     return (_LINE + "Recipie with " + m_csrc + LINE_ + s);
00095   }
00096 
00097   virtual int CSources() const
00098   {
00099     return m_csrc;
00100   }
00101 
00102   virtual SOURCE* PSource(int n)
00103   {
00104     return &m_vsrcFinal[n];
00105   }
00106 
00107   virtual SOURCE* VSources()
00108   {
00109     return m_vsrcFinal;
00110   }
00111 
00112   template<class SOURCE_OUT>
00113   void AllocatedCopies(SOURCE_OUT* viOut)
00114   {
00115     int c = this->CSources();
00116     for (int n = 0; n < c; n++)
00117       {
00118       ::AllocatedCopy(viOut[n], m_vsrcFinal[n]);
00119       }
00120   }
00121 
00122   static String SerializationId()
00123   {
00124     return "Recipie";
00125   }
00126 
00127   void Serialize(Stream& st) const
00128   {
00129     for (int n = 0; n < m_csrc; n++)
00130       {
00131       ::Serialize(st, m_vsrcFinal[n]);
00132       }
00133   }
00134 
00135   void Deserialize(Stream &st)
00136   {
00137     for (int n = 0; n < m_csrc; n++)
00138       {
00139       ::Deserialize(st, m_vsrcFinal[n]);
00140       }
00141   }
00142 
00143 };
00144 
00145 //=============================================================================
00146 // MAKE RECIPIE PARTS
00147 //=============================================================================
00148 // warning: these are "unclean" macros in that they make use of variables
00149 // within the MAKE_RECIPIE macro below (e.g. c, n)
00150 #define _RECIPIE_TYPES(_name,_class,_data,_dims,_precision,_source)                     \
00151     typedef _class<_data,_dims,_precision,LAYER_##_source> LAYER_##_name; 
00152 
00153 #define _RECIPIE_STORAGE_TYPE(_name,_class,_data,_dims,_precision,_source)      \
00154     PRIVATE::LAYER_##_name
00155 
00156 //  _class<_data,_dims,_precision,PRIVATE::LAYER_##_source> 
00157 
00158 #define _RECIPIE_STORAGE(_name,_class,_data,_dims,_precision,_source)                   \
00159     PRIVATE::LAYER_##_name* m_vsrc##_name;                                                                          \
00160     bool m_bOptimize##_name;
00161 
00162 #define _RECIPIE_ACCESSOR(_name,_class,_data,_dims,_precision,_source)              \
00163     PRIVATE::LAYER_##_name& Layer##_name(int n){    return m_vsrc##_name[n];    }       \
00164     void OptimizeLayer##_name(bool b){  m_bOptimize##_name=b;   }                                   
00165 
00166 #define _RECIPIE_OPTIMIZELAYERDEFAULT(_name,_class,_data,_dims,_precision,_source) \
00167     m_bOptimize##_name=true;
00168 
00169 #define _RECIPIE_ALLOCATELAYER(_name,_class,_data,_dims,_precision,_source)     \
00170     m_vsrc##_name = new PRIVATE::LAYER_##_name[c];
00171 
00172 #define _RECIPIE_DELETELAYER(_name,_class,_data,_dims,_precision,_source)           \
00173     for (int n=CSources()-1; n>=0; n--){                                                                                \
00174         m_vsrc##_name[n].WipeSource();                                                                                      \
00175     }                                                                                                                                                       \
00176     delete [] m_vsrc##_name;                                                                                                        
00177 
00178 #define _RECIPIE_SETSOURCE(_name,_class,_data,_dims,_precision,_source)             \
00179     m_vsrc##_name[n].SetSource(&m_vsrc##_source[n]);
00180 
00181 #define _RECIPIE_SETLASTSOURCE(_name,_class,_data,_dims,_precision,_source)     \
00182     this->SetSource(c,m_vsrc##_name);
00183 
00184 #define _RECIPIE_REGISTER_PARAMS(_name,_class,_data,_dims,_precision,_source)   \
00185     if (m_bOptimize##_name){                                                                                                        \
00186         Layer##_name(n).RegisterParameters(regParam);                                                           \
00187     }                                                                                                                                                       
00188 
00189 #define _RECIPIE_REGISTER_INITIALSTEPS(_name,_class,_data,_dims,_precision,_source) \
00190     if (m_bOptimize##_name){                                                                                                        \
00191         ::RegisterInitialSteps(Layer##_name(n), regSteps);                                              \
00192     }
00193 
00194 #define _RECIPIE_NORMALIZE(_name,_class,_data,_dims,_precision,_source)             \
00195     if (m_bOptimize##_name){                                                                                                        \
00196         NormalizeGroup(this->CSources(),m_vsrc##_name);                                                     \
00197     }
00198 
00199 #define _RECIPIE_COUNT(_name,_class,_data,_dims,_precision,_source)                     \
00200     +1
00201 
00202 #define _RECIPIE_DESCRIBE(_name,_class,_data,_dims,_precision,_source)              \
00203     Layer##_name(n).Describe();
00204 
00205 #define CONCAT2(x,y) x ## y
00206 #define CONCAT(x,y) CONCAT2(x,y)
00207 
00208 #define PRIVATE CONCAT(_privateNS,__LINE__)
00209 
00210 //=============================================================================
00211 // MAKE RECIPIE
00212 //=============================================================================
00213 #define MAKE_RECIPIE(                                                                                                                   \
00214     _recipie,                                                                                                                                       \
00215     _source,                                                                                                                                        \
00216     _do_mid_layers,                                                                                                                         \
00217     _do_last_layer                                                                                                                          \
00218 )                                                                                                                                                           \
00219     namespace PRIVATE {                                                                                                                 \
00220         typedef _source LAYER_INPUT;                                                                                            \
00221         _do_mid_layers(_RECIPIE_TYPES);                                                                                     \
00222         _do_last_layer(_RECIPIE_TYPES);                                                                                     \
00223     }                                                                                                                                                       \
00224                                                                                                                                                             \
00225     class _recipie                                                                                                                          \
00226         : public RecipieOf<_do_last_layer(_RECIPIE_STORAGE_TYPE)>                                   \
00227     {                                                                                                                                                       \
00228         protected:                                                                                                                              \
00229                                                                                                                                                             \
00230         PRIVATE::LAYER_INPUT* m_vsrcINPUT;                                                                              \
00231         _do_mid_layers(_RECIPIE_STORAGE);                                                                                   \
00232         _do_last_layer(_RECIPIE_STORAGE);                                                                                   \
00233                                                                                                                                                             \
00234         public:                                                                                                                                     \
00235         _recipie(int c, _source* vsrcInput)                                                                             \
00236         : RecipieOf<_do_last_layer(_RECIPIE_STORAGE_TYPE)>()                                            \
00237         {                                                                                                                                                   \
00238             m_vsrcINPUT=vsrcInput;                                                                                                  \
00239             _do_mid_layers(_RECIPIE_ALLOCATELAYER);                                                                 \
00240             _do_last_layer(_RECIPIE_ALLOCATELAYER);                                                                 \
00241                                                                                                                                                             \
00242             _do_mid_layers(_RECIPIE_OPTIMIZELAYERDEFAULT);                                                  \
00243             _do_last_layer(_RECIPIE_OPTIMIZELAYERDEFAULT);                                                  \
00244                                                                                                                                                             \
00245             for (int n=0; n<c; n++){                                                                                                \
00246                 _do_mid_layers(_RECIPIE_SETSOURCE);                                                                     \
00247                 _do_last_layer(_RECIPIE_SETSOURCE);                                                                     \
00248             }                                                                                                                                               \
00249                                                                                                                                                             \
00250             _do_last_layer(_RECIPIE_SETLASTSOURCE);                                                                 \
00251         }                                                                                                                                                   \
00252                                                                                                                                                             \
00253         ~_recipie()                                                                                                                             \
00254         {                                                                                                                                                   \
00255             if (AboutToDie()){                                                                                                          \
00256                 _do_mid_layers(_RECIPIE_DELETELAYER);                                                                   \
00257                 _do_last_layer(_RECIPIE_DELETELAYER);                                                                   \
00258             }                                                                                                                                               \
00259         }                                                                                                                                                   \
00260                                                                                                                                                             \
00261         int CLayers() const                                                                                                             \
00262         {                                                                                                                                                   \
00263             return (                                                                                                                                \
00264                 _do_mid_layers(_RECIPIE_COUNT)                                                                              \
00265                 _do_last_layer(_RECIPIE_COUNT)                                                                              \
00266             );                                                                                                                                          \
00267         }                                                                                                                                                   \
00268                                                                                                                                                             \
00269         virtual String Describe()   const                                                                                       \
00270         {                                                                                                                                                   \
00271             return (                                                                                                                                \
00272                 _LINE +  #_recipie + LINE_ +                                                                                    \
00273                 (                                                                                                                                           \
00274                     _INDENT +                                                                                                                       \
00275                     RecipieOf<_do_last_layer(_RECIPIE_STORAGE_TYPE)>::Describe()                \
00276                 )                                                                                                                                           \
00277             );                                                                                                                                          \
00278         }                                                                                                                                                   \
00279                                                                                                                                                             \
00280         void RegisterParameters(                                                                                                    \
00281             RegistryOfParameters& regParam                                                                                  \
00282         )                                                                                                                                                   \
00283         {                                                                                                                                                   \
00284             int c=this->CSources();                                                                                                 \
00285             for (int n=0; n<c; n++){                                                                                                \
00286                 RegisterParameters(n,regParam);                                                                             \
00287             }                                                                                                                                               \
00288         }                                                                                                                                                   \
00289                                                                                                                                                             \
00290         void RegisterParameters(                                                                                                    \
00291             int n,                                                                                                                                  \
00292             RegistryOfParameters& regParam                                                                                  \
00293         )                                                                                                                                                   \
00294         {                                                                                                                                                   \
00295             _do_mid_layers(_RECIPIE_REGISTER_PARAMS);                                                               \
00296             _do_last_layer(_RECIPIE_REGISTER_PARAMS);                                                               \
00297         }                                                                                                                                                   \
00298                                                                                                                                                             \
00299         void RegisterInitialSteps(                                                                                              \
00300             RegistryOfInitialSteps& regSteps                                                                                \
00301         )                                                                                                                                                   \
00302         {                                                                                                                                                   \
00303             int c=this->CSources();                                                                                                 \
00304                                                                                                                                                             \
00305             for (int n=0; n<c; n++){                                                                                                \
00306                 RegisterInitialSteps(n,regSteps);                                                                           \
00307             }                                                                                                                                               \
00308         }                                                                                                                                                   \
00309                                                                                                                                                             \
00310         void RegisterInitialSteps(                                                                                              \
00311             int n,                                                                                                                                  \
00312             RegistryOfInitialSteps& regSteps                                                                                \
00313         )                                                                                                                                                   \
00314         {                                                                                                                                                   \
00315             _do_mid_layers(_RECIPIE_REGISTER_INITIALSTEPS);                                                 \
00316             _do_last_layer(_RECIPIE_REGISTER_INITIALSTEPS);                                                 \
00317         }                                                                                                                                                   \
00318                                                                                                                                                             \
00319         PRIVATE::LAYER_INPUT* LayerINPUT(){ return m_vsrcINPUT; }                                   \
00320         _do_mid_layers(_RECIPIE_ACCESSOR);                                                                              \
00321         _do_last_layer(_RECIPIE_ACCESSOR);                                                                              \
00322                                                                                                                                                             \
00323         void Normalize()                                                                                                                    \
00324         {                                                                                                                                                   \
00325             _do_mid_layers(_RECIPIE_NORMALIZE);                                                                         \
00326             _do_last_layer(_RECIPIE_NORMALIZE);                                                                         \
00327         }                                                                                                                                                   \
00328     };                                                                                                                                                  
00329 
00330 /* Example usage
00331 
00332 
00333 
00334  // A congeal recipie for a translate, rotate, warp of a volume
00335  #define my_mid_layers(_layer)                                                                                                          \
00336     _layer(Interp,       SourceAccessorLinearInterpolateOf,  Pixel8BitGrey, 3, Real, INPUT) \
00337         _layer(Translate0, SourceTransformTranslateOf,         Pixel8BitGrey, 3, Real, Interp) \
00338         _layer(Rotate,     SourceTransformRotateOf,            Pixel8BitGrey, 3, Real, Translate0) \
00339         _layer(Translate1, SourceTransformTranslateOf,         Pixel8BitGrey, 3, Real, Rotate) 
00340 
00341 
00342  #define my_last_layer(_layer)                                                                                                  \
00343     _layer(Warp, SourceTransformWarpOf, Pixel8BitGrey, 3, Real,Translate1)
00344 
00345  MAKE_RECIPIE(
00346  Recipie_G3R_All_G3I,
00347  GreyVolume,
00348  my_mid_layers,
00349  my_last_layer
00350  );
00351 
00352  */
00353 
00354 #endif //#ifndef __RECIPIE_H__

Generated on 6 Apr 2011 for Slicer3 by  doxygen 1.6.1