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

DataObj.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 /// DataObj.cpp
00020 ///  core Simian
00021 
00022 #include "DataObj.h"
00023 #include "SourceObj.h"
00024 #include <iostream>
00025 
00026 using namespace std;
00027 
00028 ///////////////////////////////////////////////////////////////////////////
00029 /// Construct
00030 ///////////////////////////////////////////////////////////////////////////
00031 DataObj::DataObj()
00032 : DataObjIF(),
00033   _source(),
00034   _consumers(0),
00035   _nConsumers(0),
00036   _noForward(false)
00037 {
00038 }
00039 
00040 ///////////////////////////////////////////////////////////////////////////
00041 /// Destruct
00042 ///////////////////////////////////////////////////////////////////////////
00043 DataObj::~DataObj()
00044 {
00045    if(_consumers)
00046    {
00047       delete[] _consumers;
00048    }
00049 }
00050 
00051 ///////////////////////////////////////////////////////////////////////////
00052 ///////////////////////////////////////////////////////////////////////////
00053 /// Update interface
00054 ///////////////////////////////////////////////////////////////////////////
00055 ///////////////////////////////////////////////////////////////////////////
00056 
00057 void DataObj::update_()
00058 {
00059    //if(_updating)///TODO: debug loop detection
00060    //{
00061    //   derr("update(), loop detected");
00062    //}
00063 
00064    _forward = false;
00065    _updating = true;
00066    if(_modified)
00067    {
00068       _modified = false;
00069       for(int i=0; i<_nConsumers; ++i)
00070       {
00071          if(!_consumers[i].isNull())
00072          {
00073             ///derr("updateConsumer()");
00074             _consumers[i]->update_(DataObjSP((DataObjIF*)this));                 
00075          }
00076       }
00077    }
00078    _updating = false;
00079 }
00080 
00081 ///////////////////////////////////////////////////////////////////////////
00082 ///////////////////////////////////////////////////////////////////////////
00083 /// Request Interface
00084 ///////////////////////////////////////////////////////////////////////////
00085 ///////////////////////////////////////////////////////////////////////////
00086 bool DataObj::request_()
00087 {
00088 
00089    /// no reqests pass if we are forward modified
00090    if(_forward)
00091    {
00092       //derr("request(), a backward call when forward marked");
00093       return false;
00094    }
00095    else
00096    {
00097       /// this is modified
00098       if(_modified) 
00099       {
00100          /// see if source has work to do   
00101          if(_source.isNull())
00102          {
00103             derr("request(), no source for data!!!");
00104             return false;
00105          }
00106          if(_source->request(DataObjSP(this)))
00107          {
00108             /// nope source is good, so are we
00109             _modified = false;
00110             return true;
00111          }
00112          else 
00113          {
00114             /// hmm, can't go we aren't ready
00115             return false;
00116          }
00117       }
00118       /// not modified, not forward modified,
00119       /// must be good
00120       return true;
00121    }
00122 }
00123 
00124 ///////////////////////////////////////////////////////////////////////////
00125 ///////////////////////////////////////////////////////////////////////////
00126 /// Source interface
00127 ///////////////////////////////////////////////////////////////////////////
00128 ///////////////////////////////////////////////////////////////////////////
00129 
00130 void DataObj::setSource(SourceObjSP source)
00131 {
00132    if(_source == source) return;
00133    if(source.isNull())
00134    {
00135       derr("setSource(), source is null!");
00136       return;
00137    }
00138    _source = source;
00139 }
00140 
00141 
00142 ///////////////////////////////////////////////////////////////////////////
00143 ///////////////////////////////////////////////////////////////////////////
00144 /// Consumer interface
00145 ///////////////////////////////////////////////////////////////////////////
00146 ///////////////////////////////////////////////////////////////////////////
00147 
00148 ///////////////////////////////////////////////////////////////////////////
00149 /// add Consumer
00150 ///////////////////////////////////////////////////////////////////////////
00151 void  DataObj::addConsumer(SimModObjSP smo)
00152 {
00153    if(smo.isNull())
00154    {
00155       derr("addConsumer(), adding NULL consumer!");
00156       return;
00157    }
00158    if(isConsumer(smo))
00159    {
00160       derr("addConsumer(), consumer already in list");
00161       return;
00162    }
00163    SimModObjSP *consumers = new SimModObjSP[_nConsumers + 1];
00164    //bool        *upCons = new bool[_nConsumers + 1];
00165    for(int i=0; i<_nConsumers; ++i)
00166    {
00167       consumers[i] = _consumers[i];
00168       //upCons[i]  = _upConsumers[i];
00169    }
00170    consumers[_nConsumers] = smo;
00171    //upCons[_nConsumers] = false;
00172    delete[] _consumers;
00173    //delete[] _upConsumers;
00174    _consumers = consumers;
00175    //_upConsumers = upCons;
00176    ++_nConsumers;
00177 }
00178 
00179 ///////////////////////////////////////////////////////////////////////////
00180 /// del Consumer
00181 ///////////////////////////////////////////////////////////////////////////
00182 void  DataObj::delConsumer(SimModObjSP smo)
00183 {
00184    if(smo.isNull())
00185    {
00186       derr("delConsumer(), deleting NULL consumer!");
00187       return;
00188    }
00189    if(!isConsumer(smo)) //< is it there?
00190    {
00191       derr("delConsumer(), consumer not found");
00192       return;
00193    }
00194    /// now remove it from list
00195    SimModObjSP *consumers = new SimModObjSP[_nConsumers-1];
00196    //bool        *upCons = new bool[_nConsumers - 1];
00197    int nidx = 0;
00198    for(int i=0; i<_nConsumers; ++i)
00199    {
00200       if(smo != _consumers[i])
00201       {
00202          consumers[nidx] = _consumers[i];
00203          //upCons[nidx] = _upConsumers[i];
00204          ++nidx;
00205       }
00206    }
00207    delete[] _consumers;
00208    //delete[] _upConsumers;
00209    _consumers = consumers;
00210    //_upConsumers = upCons;
00211    --_nConsumers;
00212 }
00213 
00214 ///////////////////////////////////////////////////////////////////////////
00215 /// get Consumer
00216 ///////////////////////////////////////////////////////////////////////////
00217 SimModObjSP  DataObj::getConsumer(unsigned int i)
00218 {
00219    if( int(i) >= _nConsumers )
00220    {
00221       derr("getConsumer(), consumer index greater than number of consumers");
00222       return SimModObjSP();
00223    }
00224    return _consumers[i];
00225 }
00226 
00227 ///////////////////////////////////////////////////////////////////////////
00228 /// is Consumer
00229 ///////////////////////////////////////////////////////////////////////////
00230 bool DataObj::isConsumer(const SimModObjSP  smo) const
00231 {
00232    if(!_consumers || smo.isNull()) return false;
00233    for(int i=0; i<_nConsumers; ++i)
00234    {
00235       if(_consumers[i] == smo)
00236       {
00237          return true;
00238       }
00239    }
00240    return false;
00241 }
00242 
00243 ///////////////////////////////////////////////////////////////////////////
00244 ///////////////////////////////////////////////////////////////////////////
00245 /// Framework interface
00246 ///////////////////////////////////////////////////////////////////////////
00247 ///////////////////////////////////////////////////////////////////////////
00248 
00249 void DataObj::setForwardModified()
00250 {
00251    if(_noForward) return;
00252 
00253    _forward = true;
00254    for(int i=0; i<_nConsumers; ++i)
00255    {
00256       if(!_consumers[i].isNull())
00257       {
00258          /// only need to forward modify if those
00259          /// in front of us aren't
00260          if(!_consumers[i]->isForwardModified())
00261          {
00262             _consumers[i]->setForwardModified();
00263          }
00264       }
00265       else
00266       {
00267          derr("setForwardModified(), null DataObject encoundered");
00268       }
00269    }
00270 }
00271 
00272 ///////////////////////////////////////////////////////////////////////////
00273 ///////////////////////////////////////////////////////////////////////////
00274 /// Protected Functions
00275 ///////////////////////////////////////////////////////////////////////////
00276 ///////////////////////////////////////////////////////////////////////////
00277 
00278 ///////////////////////////////////////////////////////////////////////////
00279 /// update Consumers
00280 ///////////////////////////////////////////////////////////////////////////
00281 void DataObj::updateConsumers()
00282 {
00283 
00284 }
00285 
00286 

Send questions, comments, and bug reports to:
jmk