SourceCombine.h

Go to the documentation of this file.
00001 #ifndef __SOURCECOMBINE_H__
00002 #define __SOURCECOMBINE_H__
00003 
00004 // $Id$
00005 
00006 #include "Source.h"
00007 #include "Registry.h"
00008 #include "libRefCount.h"
00009 #include "Vector.h"
00010 #include "String.h"
00011 
00012 #undef DEBUG 
00013 #define DEBUG 0
00014 #include "libDebug.h"
00015 
00016 template<class DATA, int DIMENSIONALITY, class PRECISION, class SOURCE>
00017 class SourceCombineOf: public SourceOf<DATA, DIMENSIONALITY, PRECISION>
00018 {
00019   typedef VectorOf<SOURCE*> VECPSRC;
00020 protected:
00021   VECPSRC m_vecpsrc;
00022   mutable PointOf<DIMENSIONALITY, PRECISION> m_ptSize;
00023 
00024 protected:
00025   SourceCombineOf() :
00026     SourceOf<DATA, DIMENSIONALITY, PRECISION> (), m_vecpsrc()
00027   {
00028   }
00029 
00030   SourceCombineOf(SourceCombineOf<DATA, DIMENSIONALITY, PRECISION, SOURCE>&src) :
00031     SourceOf<DATA, DIMENSIONALITY, PRECISION> (src), m_vecpsrc(src.m_vecpsrc)
00032   {
00033   }
00034 
00035   virtual ~SourceCombineOf()
00036   {
00037     if (m_vecpsrc.AboutToDie())
00038       {
00039       for (int n = 0; n < m_vecpsrc.C(); n++)
00040         {
00041         ReleasePointer(m_vecpsrc[n]);
00042         }
00043       }
00044   }
00045 
00046 public:
00047 
00048   SOURCE* PSource(int n)
00049   {
00050     return m_vecpsrc[n];
00051   }
00052 
00053   const SOURCE* PSource(int n) const
00054   {
00055     return m_vecpsrc[n];
00056   }
00057 
00058   SOURCE** VSources()
00059   {
00060     return m_vecpsrc.V();
00061   }
00062 
00063   const SOURCE** VSources() const
00064   {
00065     return m_vecpsrc.V();
00066   }
00067 
00068   virtual void AddSource(SOURCE* psource)
00069   {
00070     ClaimPointer(psource);
00071     m_vecpsrc.Append(psource);
00072   }
00073 
00074   const int& CSources() const
00075   {
00076     return m_vecpsrc.C();
00077   }
00078 
00079   virtual String Describe() const
00080   {
00081     return (_LINE + "SourceCombineOf(" + DIMENSIONALITY + "D)" + LINE_
00082         + this->DescribeCommon());
00083   }
00084 
00085   virtual String DescribeCommon() const
00086   {
00087     String s;
00088     for (int n = 0; n < m_vecpsrc.C(); n++)
00089       {
00090       s = s + (_INDENT + (_LINE + "source: " + n + LINE_ + (_INDENT
00091           + this->m_vecpsrc[n]->Describe() + LINE_)));
00092       }
00093 
00094     return _INDENT + (_LINE + "size: " + this->Size().Describe() + LINE_ + s);
00095   }
00096 
00097   const PointOf<DIMENSIONALITY, PRECISION>& Size() const
00098   {
00099     return m_ptSize;
00100   }
00101 
00102   virtual PointOf<DIMENSIONALITY, PRECISION> Bound(const PointOf<
00103       DIMENSIONALITY, PRECISION>& pt) const
00104   {
00105     return pt.Bound(PointOf<DIMENSIONALITY, PRECISION> (PRECISION(0)),
00106         this->Size());
00107   }
00108 
00109   virtual void PrepareForAccessAction() const
00110   {
00111     m_ptSize = PSource(0)->Size();
00112   }
00113 
00114   virtual void PrepareForAccess() const
00115   {
00116     // tell each source to prepare first
00117     for (int n = 0; n < m_vecpsrc.C(); n++)
00118       {
00119       m_vecpsrc[n]->PrepareForAccess();
00120       }
00121 
00122     // the call the specific Combine's AccessPreparation function
00123     this->PrepareForAccessAction();
00124   }
00125 
00126   virtual void RegisterDataAsParameters(RegistryOfParameters& reg)
00127   {
00128   }
00129 
00130   virtual void RegisterParameters(RegistryOfParameters& reg)
00131   {
00132   }
00133 
00134   virtual void SerializeSelf(Stream& st) const
00135   {
00136   }
00137 
00138   virtual void DeserializeSelf(Stream& st)
00139   {
00140   }
00141 
00142   void Serialize(Stream &st) const
00143   {
00144     SerializeSelf(st);
00145     for (int n = 0; n < m_vecpsrc.C(); n++)
00146       {
00147       ::SerializePointer(st, this->m_vecpsrc[n]);
00148       }
00149   }
00150 
00151   void Deserialize(Stream &st)
00152   {
00153     DeserializeSelf(st);
00154     for (int n = 0; n < m_vecpsrc.C(); n++)
00155       {
00156       ::DeserializePointer(st, this->m_vecpsrc[n]);
00157       }
00158   }
00159 
00160 };
00161 
00162 template<class DATA, class PRECISION, class SUBSOURCE>
00163 inline void Get(const SourceCombineOf<DATA, 3, PRECISION, SUBSOURCE>& src, DATA& dataOut, const PRECISION& nX, const PRECISION& nY)
00164 {
00165   src.VirtualGet(dataOut, nX, nY);
00166 }
00167 
00168 template<class DATA, class PRECISION, class SUBSOURCE>
00169 inline void Set(SourceCombineOf<DATA, 3, PRECISION, SUBSOURCE>& src, const PRECISION& nX, const PRECISION& nY, const DATA& data)
00170 {
00171   src.VirtualSet(nX, nY, data);
00172 }
00173 
00174 template<class DATA, class PRECISION, class SUBSOURCE>
00175 inline void Get(const SourceCombineOf<DATA, 3, PRECISION, SUBSOURCE>& src, DATA& dataOut, const PRECISION& nX, const PRECISION& nY, const PRECISION& nZ)
00176 {
00177   src.VirtualGet(dataOut, nX, nY, nZ);
00178 }
00179 
00180 template<class DATA, class PRECISION, class SUBSOURCE>
00181 inline void Set(SourceCombineOf<DATA, 3, PRECISION, SUBSOURCE>& src, const PRECISION& nX, const PRECISION& nY, const PRECISION& nZ, const DATA& data)
00182 {
00183   src.VirtualSet(nX, nY, nZ, data);
00184 }
00185 
00186 #define MAKE_COMBINE_ASSISTANT(                                                                                             \
00187     _name,_class,_data,_dims,_precision,_code,...                                                               \
00188 )                                                                                                                                                           \
00189     template <class SOURCE>                                                                                                         \
00190     inline _class<_data,_dims,_precision,SOURCE> *                                                          \
00191     _name(__VA_ARGS__ SOURCE* vsrcIn, int csrcIn)                                                               \
00192     {                                                                                                                                                       \
00193         typedef _class<_data,_dims,_precision,SOURCE> SRC_OUT;                                      \
00194                                                                                                                                                             \
00195         SRC_OUT *psrcOut=new SRC_OUT;                                                                                           \
00196         for (int n=0; n<csrcIn; n++){                                                                                           \
00197             psrcOut->AddSource(&vsrcIn[n]);                                                                                 \
00198         }                                                                                                                                                   \
00199         _code;                                                                                                                                      \
00200         HandoffPointer(psrcOut);                                                                                                    \
00201         return psrcOut;                                                                                                                     \
00202     }                                                                                                                                                       \
00203                                                                                                                                                             \
00204     template <class SOURCE>                                                                                                         \
00205     inline _class<_data,_dims,_precision,SOURCE> *                                                          \
00206     _name(__VA_ARGS__ SOURCE** vpsrcIn, int csrcIn)                                                         \
00207     {                                                                                                                                                       \
00208         typedef _class<_data,_dims,_precision,SOURCE> SRC_OUT;                                      \
00209                                                                                                                                                             \
00210         SRC_OUT *psrcOut=new SRC_OUT;                                                                                           \
00211         for (int n=0; n<csrcIn; n++){                                                                                           \
00212             psrcOut->AddSource(vpsrcIn[n]);                                                                                 \
00213         }                                                                                                                                                   \
00214         _code;                                                                                                                                      \
00215         HandoffPointer(psrcOut);                                                                                                    \
00216         return psrcOut;                                                                                                                     \
00217     }                                                                                                                                                       \
00218                                                                                                                                                             \
00219     template <class SOURCE, class SOURCE_SUB>                                                                       \
00220     inline _class<_data,_dims,_precision,SOURCE> *                                                          \
00221     _name(__VA_ARGS__ SOURCE_SUB* vsrcIn, int csrcIn, SOURCE*(*fxn)(SOURCE_SUB*) ) \
00222     {                                                                                                                                                       \
00223         typedef _class<_data,_dims,_precision,SOURCE> SRC_OUT;                                      \
00224                                                                                                                                                             \
00225         SRC_OUT *psrcOut=new SRC_OUT;                                                                                           \
00226         for (int n=0; n<csrcIn; n++){                                                                                           \
00227             psrcOut->AddSource(fxn(&vsrcIn[n]));                                                                        \
00228         }                                                                                                                                                   \
00229         _code;                                                                                                                                      \
00230         HandoffPointer(psrcOut);                                                                                                    \
00231         return psrcOut;                                                                                                                     \
00232     }                                                                                                                                                       \
00233                                                                                                                                                             \
00234 
00235 
00236 #endif // __SOURCECOMBINE_H__

Generated on 6 Apr 2011 for Slicer3 by  doxygen 1.6.1