00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "SourceObj.h"
00023 #include <mathGutz.h>
00024
00025
00026
00027
00028 SourceObj::SourceObj()
00029 :SourceObjIF(),
00030 _outputs(0),
00031 _nOutputs(0)
00032 {
00033
00034 }
00035
00036 SourceObj::SourceObj(unsigned int numOutputs)
00037 :SourceObjIF(),
00038 _outputs(0),
00039 _nOutputs(0)
00040 {
00041 setNumOutputs(numOutputs);
00042 }
00043
00044 SourceObj::SourceObj(unsigned int numInputs, unsigned int numOutputs)
00045 :SourceObjIF(numInputs),
00046 _outputs(0),
00047 _nOutputs(0)
00048 {
00049 setNumOutputs(numOutputs);
00050 }
00051
00052
00053
00054
00055 SourceObj::~SourceObj()
00056 {
00057 if(_outputs)
00058 delete[] _outputs;
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 void SourceObj::execute()
00071 {
00072 AlgObj::execute();
00073 updateOutputs();
00074 }
00075
00076
00077
00078
00079 void SourceObj::force()
00080 {
00081 if(!checkInputs()){
00082 derr("force(), inputs not valid, deffering execution");
00083 _modified = true;
00084 return;
00085 }
00086 execDef();
00087 _modified = false;
00088 _forward = false;
00089 updateOutputs();
00090 }
00091
00092
00093
00094
00095
00096
00097
00098 bool SourceObj::request(DataObjSP d)
00099 {
00100 if(_forward)
00101 {
00102 derr("request(), marked forward modified");
00103 return false;
00104 }
00105
00106
00107
00108 if(!isOutput(d))
00109 {
00110 derr("request(), dataObject is not an output");
00111
00112 return true;
00113 }
00114
00115
00116 if(!checkInputs())
00117 {
00118 derr("request(), inputs not ready, but this module is??");
00119 return false;
00120 }
00121
00122
00123
00124 if(_modified)
00125 {
00126
00127 execute();
00128 }
00129
00130 return true;
00131 }
00132
00133
00134
00135
00136
00137
00138
00139 void SourceObj::setForwardModified()
00140 {
00141 _forward = true;
00142 for(int i=0; i<_nOutputs; ++i)
00143 {
00144 if(!_outputs[i].isNull())
00145 {
00146
00147 if(!_outputs[i]->isForwardModified())
00148 {
00149 _outputs[i]->setForwardModified();
00150 }
00151 }
00152 else
00153 {
00154 derr("setForwardModified(), null DataObj encountered");
00155 }
00156 }
00157 }
00158
00159
00160
00161
00162
00163
00164
00165 void SourceObj::updateOutputs()
00166 {
00167
00168
00169
00170
00171 _updating = true;
00172
00173 for(int i=0; i<_nOutputs; ++i)
00174 {
00175
00176 if(!_outputs[i].isNull())
00177 {
00178
00179 if(_outputs[i]->isModified())
00180 {
00181
00182 _outputs[i]->setForwardModified();
00183 }
00184 else
00185 {
00186
00187 }
00188 }
00189 else
00190 {
00191 derr("updateOutputs(), null DataObj encountered");
00192 }
00193 }
00194
00195
00196 for(int i=0; i<_nOutputs; ++i)
00197 {
00198
00199 if(!_outputs[i].isNull())
00200 {
00201
00202 if(_outputs[i]->isModified())
00203 {
00204
00205
00206 _outputs[i]->update_ ();
00207 }
00208 }
00209 }
00210 _updating = false;
00211 }
00212
00213
00214
00215
00216 void SourceObj::setNumOutputs(int nOut)
00217 {
00218 if(_nOutputs == nOut) return;
00219
00220 DataObjSP *outNew = 0;
00221 if(nOut)
00222 outNew = new DataObjSP[nOut];
00223
00224
00225 for(int i=0; i<_nOutputs && i<nOut; ++i)
00226 {
00227 outNew[i] = _outputs[i];
00228 }
00229
00230
00231 for(int i=gutz::g_max(nOut-1,0); i<_nOutputs; ++i)
00232 {
00233 if(!_outputs[i].isNull())
00234 _outputs[i]->setSource(SourceObjSP());
00235 }
00236
00237 if(_outputs)
00238 delete[] _outputs;
00239 _outputs = outNew;
00240 _nOutputs = nOut;
00241
00242 }
00243
00244
00245
00246
00247 void SourceObj::setOutputN(int outNum, DataObjSP d)
00248 {
00249 if(d.isNull())
00250 {
00251 derr("setOutputN(), setting null DataObj output!!");
00252 return;
00253 }
00254 if(outNum >= _nOutputs)
00255 {
00256 setNumOutputs(outNum+1);
00257 }
00258
00259 _outputs[outNum] = d;
00260 d->setSource(SourceObjSP(this));
00261 }
00262
00263
00264
00265
00266 DataObjIF *SourceObj::getOutputN(int outNum)
00267 {
00268 if(outNum >= _nOutputs)
00269 {
00270 derr("getOutputN(), index greater than number of outputs");
00271 return 0;
00272 }
00273 return _outputs[outNum].getPtr();
00274 }
00275
00276
00277
00278
00279 void SourceObj::addOutput(DataObjSP d)
00280 {
00281 if(d.isNull())
00282 {
00283 derr("addOutput(), setting null DataObj output!!");
00284 return;
00285 }
00286 setOutputN(_nOutputs,d);
00287 }
00288
00289
00290
00291
00292 void SourceObj::delOutput(DataObjSP d)
00293 {
00294 if(!isOutput(d))
00295 {
00296 derr("delOutput(), DataObj is not an output.");
00297 return;
00298 }
00299
00300 DataObjSP *outNew = new DataObjSP[_nOutputs - 1];
00301
00302 int idx = 0;
00303 for(int i=0; i<_nOutputs; ++i)
00304 {
00305 if(d != _outputs[i])
00306 {
00307 outNew[idx] = _outputs[i];
00308 ++idx;
00309 }
00310 }
00311
00312 d->setSource(SourceObjSP());
00313 delete[] _outputs;
00314 _outputs = outNew;
00315 --_nOutputs;
00316
00317 }
00318
00319
00320
00321
00322 bool SourceObj::isOutput(const DataObjSP d) const
00323 {
00324 if(d.isNull()) return false;
00325 for(int i=0; i<_nOutputs; ++i)
00326 {
00327 if(_outputs[i] == d)
00328 {
00329 return true;
00330 }
00331 }
00332 return false;
00333 }