arbeit
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

SourceObj.cpp

Go to the documentation of this file.
00001 //------------------------------------------------------------------------
00002 //
00003 //   Joe Kniss
00004 //     6-20-03
00005 //                   ________    ____   ___ 
00006 //                  |        \  /    | /  /
00007 //                  +---+     \/     |/  /
00008 //                  +--+|  |\    /|     < 
00009 //                  |  ||  | \  / |  |\  \ 
00010 //                  |      |  \/  |  | \  \ 
00011 //                   \_____|      |__|  \__\
00012 //                       Copyright  2003 
00013 //                      Joe Michael Kniss
00014 //                   <<< jmk@cs.utah.edu >>>
00015 //               "All Your Base are Belong to Us"
00016 //-------------------------------------------------------------------------
00017 
00018 
00019 ///SourceObj.cpp
00020 ///  simian core
00021 
00022 #include "SourceObj.h"
00023 #include <mathGutz.h>
00024 
00025 ///////////////////////////////////////////////////////////////////////////
00026 /// Construction
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 /// Destruction
00054 ///////////////////////////////////////////////////////////////////////////
00055 SourceObj::~SourceObj()
00056 {
00057    if(_outputs)
00058       delete[] _outputs;
00059 }
00060 
00061 ///////////////////////////////////////////////////////////////////////////
00062 ///////////////////////////////////////////////////////////////////////////
00063 /// Public Execute Interface
00064 ///////////////////////////////////////////////////////////////////////////
00065 ///////////////////////////////////////////////////////////////////////////
00066 
00067 ///////////////////////////////////////////////////////////////////////////
00068 /// Execute if anything changed
00069 ///////////////////////////////////////////////////////////////////////////
00070 void SourceObj::execute()
00071 {
00072    AlgObj::execute();
00073    updateOutputs();
00074 }
00075 
00076 ///////////////////////////////////////////////////////////////////////////
00077 /// Execute no matter what!
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 /// Request Interface
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    /// how could this happen?
00107    /// shouldn't get a request for data we don't own
00108    if(!isOutput(d))
00109    {
00110       derr("request(), dataObject is not an output");
00111       /// it's ready, cuz we don't know about it
00112       return true;
00113    }
00114    /// how could this happen? 
00115    /// we should be forward too!
00116    if(!checkInputs())
00117    {
00118       derr("request(), inputs not ready, but this module is??");
00119       return false;
00120    }
00121    /// how could this happen?
00122    /// we have been changed, better update
00123    /// but not if we are a true source!
00124    if(_modified)
00125    {
00126       //derr("request(), we were modified but data was ready");
00127       execute();
00128    }
00129 
00130    return true;
00131 }
00132 
00133 ///////////////////////////////////////////////////////////////////////////
00134 ///////////////////////////////////////////////////////////////////////////
00135 /// Framework interfaces
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          /// only forward modify if we have to
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 /// Protected Member functions
00162 ///////////////////////////////////////////////////////////////////////////
00163 ///////////////////////////////////////////////////////////////////////////
00164 
00165 void SourceObj::updateOutputs()
00166 {
00167    //if(_updating) /// TODO: debug check, loop reporter
00168    //{
00169    //   derr("updateOuputs(), loop detected");
00170    //}
00171    _updating = true;
00172    /// for each output, send forward notification
00173    for(int i=0; i<_nOutputs; ++i)
00174    {
00175       /// error check
00176       if(!_outputs[i].isNull())
00177       {
00178          /// if it was changed
00179          if(_outputs[i]->isModified())
00180          {
00181             /// mark it for update
00182             _outputs[i]->setForwardModified();
00183          }
00184          else /// output unmodified, debug output
00185          {
00186             //derr("updateOutputs(), skipping un-modified output");
00187          }
00188       }
00189       else /// output was null, report it
00190       {
00191          derr("updateOutputs(), null DataObj encountered");
00192       }
00193    }
00194 
00195    /// now update each output
00196    for(int i=0; i<_nOutputs; ++i)
00197    {
00198       /// error check, always!
00199       if(!_outputs[i].isNull())
00200       {
00201          /// skip unodified outputs
00202          if(_outputs[i]->isModified())
00203          {
00204             ///derr("updateOutputs()");
00205             /// update the output
00206             _outputs[i]->update_ ();
00207          }
00208       }
00209    }
00210    _updating = false;
00211 }
00212 
00213 ///////////////////////////////////////////////////////////////////////////
00214 /// Set Number Outputs
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    /// copy old outputs
00225    for(int i=0; i<_nOutputs && i<nOut; ++i)
00226    {
00227       outNew[i] = _outputs[i];
00228    }
00229    
00230    /// unset any (about to be) nuked outputs
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 /// set Output number "N"
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 /// get Output number "N"
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 /// add Output
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 /// del Output
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 /// is Output
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 }

Send questions, comments, and bug reports to:
jmk