00001 #ifndef __SOURCECOMBINE_H__
00002 #define __SOURCECOMBINE_H__
00003
00004
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
00117 for (int n = 0; n < m_vecpsrc.C(); n++)
00118 {
00119 m_vecpsrc[n]->PrepareForAccess();
00120 }
00121
00122
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__