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

Crank.cpp

Go to the documentation of this file.
00001 //------------------------------------------------------------------------
00002 //
00003 //   Joe Kniss
00004 //     3-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 /// Crank.cpp
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 //// meta program management.
00033 ////////////////////////////////////////////////////
00034 ////////////////////////////////////////////////////
00035 
00036 ///////////////////////////////////////////////////////////////////
00037 /// add MP
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 /// insert MP
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 /// get MP by name
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 /// set by index
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 /// get by index
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 /// get index by name
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 /// get index by reference
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 /// del by index
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 /// del by index
00185 ///////////////////////////////////////////////////////////////////
00186 MetaProgSP Crank::delMP(SNameType name)
00187 {
00188    return delMP(getMPIdx(name));
00189 }
00190 
00191 ///////////////////////////////////////////////////////////////////
00192 /// del by reference
00193 ///////////////////////////////////////////////////////////////////
00194 MetaProgSP Crank::delMP(MetaProgSP m)
00195 {
00196    return delMP(getMPIdx(m));
00197 }
00198 
00199 ////////////////////////////////////////////////////
00200 ////////////////////////////////////////////////////
00201 //// generic tape management.
00202 ////////////////////////////////////////////////////
00203 ////////////////////////////////////////////////////
00204 
00205 ///////////////////////////////////////////////////////////////////
00206 /// add tape
00207 ///////////////////////////////////////////////////////////////////
00208 void     Crank::addTape(TapeSPVec &v, TapeSP t)
00209 {
00210    v.push_back(t);
00211 }
00212 
00213 ///////////////////////////////////////////////////////////////////
00214 /// insert tape
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 /// set tape
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 /// get tape
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 /// del tape, by index
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 /// del tape, by value
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 /// del tape, by value
00311 ///   this function mostly adds keys defined in <EnvKeys.h>
00312 ///////////////////////////////////////////////////////////////////
00313 GrinderKeysSP Crank::buildFPEnvKeys()
00314 {
00315 
00316    /// create keys
00317    GrinderKeysSP gkeys;
00318 
00319    /// add environment keys
00320    gkeys->addKey(EnvKey);
00321 
00322    /// TODO: flesh this out will ya.
00323       
00324    return gkeys;
00325 }
00326 
00327 ///////////////////////////////////////////////////////////////////
00328 /// check if any of the meta-progs changed
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 

Send questions, comments, and bug reports to:
jmk