00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "Crank.h"
00022 #include "EnvKeys.h"
00023 #include <mathGutz.h>
00024
00025 using namespace glift;
00026 using namespace gutz;
00027 using namespace std;
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 int Crank::addMP(MetaProgSP m)
00040 {
00041 if(checkKind(m))
00042 {
00043 kindErr("addMP()");
00044 return -1;
00045 }
00046 _mprogs.push_back(m);
00047 return int(_mprogs.size()) - 1;
00048 }
00049
00050
00051
00052
00053 int Crank::insertMP(int idx, MetaProgSP m)
00054 {
00055 if(checkKind(m))
00056 {
00057 kindErr("addMP()");
00058 return -1;
00059 }
00060 if(idx >= int(_mprogs.size()))
00061 {
00062 _mprogs.resize(idx+1,MetaProgSP(0));
00063 }
00064 _mprogs[idx] = m;
00065 return idx;
00066 }
00067
00068
00069
00070
00071 void Crank::setMP(SNameType name, MetaProgSP m)
00072 {
00073 if(checkKind(m))
00074 {
00075 kindErr("setMP");
00076 return;
00077 }
00078 int idx = getMPIdx(name);
00079 if(-1 == idx)
00080 {
00081 derr("setMP(), meta-prog not found ", name.c_str());
00082 return;
00083 }
00084 _mprogs[idx] = m;
00085 }
00086
00087
00088
00089
00090 void Crank::setMP(int idx, MetaProgSP m)
00091 {
00092 if(checkKind(m))
00093 {
00094 kindErr("setMP");
00095 return;
00096 }
00097 if(idx >= int(_mprogs.size()) || idx < 0)
00098 {
00099 derr("setMP(), index out of bounds", 0, idx);
00100 return;
00101 }
00102 _mprogs[idx] = m;
00103 }
00104
00105
00106
00107
00108 MetaProgSP Crank::getMP(int idx)
00109 {
00110 if(idx >= int(_mprogs.size()) || idx < 0)
00111 {
00112 derr("getMP(), index out of bounds", 0, idx);
00113 return MetaProgSP(0);
00114 }
00115 return _mprogs[idx];
00116 }
00117
00118 MetaProgSP Crank::getMP(SNameType name)
00119 {
00120 return getMP(getMPIdx(name));
00121 }
00122
00123
00124
00125
00126 int Crank::getMPIdx(SNameType name)
00127 {
00128 bool found = false;
00129 int i = 0;
00130 for(i=0; i<int(_mprogs.size()); ++i)
00131 {
00132 if(_mprogs[i].isNull()) continue;
00133 if(_mprogs[i]->getName() == name)
00134 {
00135 found = true;
00136 break;
00137 }
00138 }
00139 if(found) return i;
00140
00141 derr("getMPIdx(), name not found", name.c_str());
00142 return -1;
00143 }
00144
00145
00146
00147
00148 int Crank::getMPIdx(MetaProgSP m)
00149 {
00150 bool found = false;
00151 MetaProgSPVecIter mpi = _mprogs.begin();
00152 int i;
00153 for(i=0; i<int(_mprogs.size()); ++i)
00154 {
00155 if(_mprogs[i].isNull()) continue;
00156 if(_mprogs[i] == m)
00157 {
00158 found = true;
00159 break;
00160 }
00161 }
00162
00163 if(found) return i;
00164 derr("getMPIdx(), meta-prog not found");
00165 return -1;
00166 }
00167
00168
00169
00170
00171 MetaProgSP Crank::delMP(int idx)
00172 {
00173 if(idx >= int(_mprogs.size()) || idx < 0)
00174 {
00175 derr("delMP(), index out of bounds ", 0, idx);
00176 return MetaProgSP(0);
00177 }
00178 MetaProgSP ret = getMP(idx);
00179 _mprogs.erase(_mprogs.begin() + idx);
00180 return ret;
00181 }
00182
00183
00184
00185
00186 MetaProgSP Crank::delMP(SNameType name)
00187 {
00188 return delMP(getMPIdx(name));
00189 }
00190
00191
00192
00193
00194 MetaProgSP Crank::delMP(MetaProgSP m)
00195 {
00196 return delMP(getMPIdx(m));
00197 }
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 void Crank::addTape(TapeSPVec &v, TapeSP t)
00209 {
00210 v.push_back(t);
00211 }
00212
00213
00214
00215
00216 void Crank::insertTape(TapeSPVec &v, int idx, TapeSP t)
00217 {
00218 if( idx == v.size() )
00219 {
00220 addTape(v, t);
00221 return;
00222 }
00223 if( idx < int(v.size()) )
00224 {
00225 TapeSPVecIter ti = v.begin() + idx;
00226 v.insert(ti, t);
00227 return;
00228 }
00229
00230 derr("insertTape(), warning inserting null tapes", 0, idx - v.size());
00231 v.resize(idx+1);
00232 v[idx] = t;
00233 }
00234
00235
00236
00237
00238 void Crank::setTape(TapeSPVec &v, int i, TapeSP t)
00239 {
00240 if( i < int(v.size()))
00241 {
00242 v[i] = t;
00243 return;
00244 }
00245 else
00246 {
00247 derr("setTape(), setting tape out of bounds", 0, i);
00248 insertTape(v, i, t);
00249 }
00250 }
00251
00252
00253
00254
00255 TapeSP Crank::getTape(TapeSPVec &v, int i)
00256 {
00257 if( i < int(v.size()))
00258 {
00259 return v[i];
00260 }
00261 else
00262 {
00263 derr("getTape(), accessing tape out of bounds", 0, i);
00264 return TapeSP(0);
00265 }
00266 }
00267
00268
00269
00270
00271 void Crank::delTape(TapeSPVec &v, int i)
00272 {
00273 if( i < int(v.size()))
00274 {
00275 v.erase(v.begin() + i);
00276 return;
00277 }
00278 else
00279 {
00280 derr("delTape(), deleting tape out of bounds", 0, i);
00281 return;
00282 }
00283 }
00284
00285
00286
00287
00288 void Crank::delTape(TapeSPVec &v, TapeSP t)
00289 {
00290 bool found = false;
00291 TapeSPVecIter ti = v.begin();
00292 while(ti != v.end())
00293 {
00294 if((*ti) == t)
00295 {
00296 found = true;
00297 break;
00298 }
00299 ++ti;
00300 }
00301 if(!found)
00302 {
00303 derr("delTape(TapeSP), tape not found, can't delete");
00304 return;
00305 }
00306 v.erase(ti);
00307 }
00308
00309
00310
00311
00312
00313 GrinderKeysSP Crank::buildFPEnvKeys()
00314 {
00315
00316
00317 GrinderKeysSP gkeys;
00318
00319
00320 gkeys->addKey(EnvKey);
00321
00322
00323
00324 return gkeys;
00325 }
00326
00327
00328
00329
00330 bool Crank::mpsChanged()
00331 {
00332 bool changed = false;
00333 if(_lastCh.size() != int(_mprogs.size()))
00334 {
00335 arrayo1i tmp(_lastCh);
00336 _lastCh = arrayo1i(_mprogs.size(),-1);
00337 for(int i=0; i<g_min(tmp.size(),_lastCh.size()); ++i) _lastCh[i] = tmp[i];
00338 changed = true;
00339 }
00340
00341 for(int i=0; i<int(_mprogs.size()); ++i)
00342 {
00343 if(_mprogs[i].isNull())
00344 {
00345 if(_lastCh[i] != -1)
00346 {
00347 changed = true;
00348 _lastCh[i] = -1;
00349 }
00350 continue;
00351 }
00352 if(_mprogs[i]->getChangeID() != _lastCh[i])
00353 {
00354 _lastCh[i] = _mprogs[i]->getChangeID();
00355 changed = true;
00356 }
00357 }
00358
00359 return changed;
00360
00361 }
00362
00363