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