| Home | nevrax.com |
|
module.hGo to the documentation of this file.00001
00007 /* Copyright, 2000 Nevrax Ltd.
00008 *
00009 * This file is part of NEVRAX NEL.
00010 * NEVRAX NEL is free software; you can redistribute it and/or modify
00011 * it under the terms of the GNU General Public License as published by
00012 * the Free Software Foundation; either version 2, or (at your option)
00013 * any later version.
00014
00015 * NEVRAX NEL is distributed in the hope that it will be useful, but
00016 * WITHOUT ANY WARRANTY; without even the implied warranty of
00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00018 * General Public License for more details.
00019
00020 * You should have received a copy of the GNU General Public License
00021 * along with NEVRAX NEL; see the file COPYING. If not, write to the
00022 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
00023 * MA 02111-1307, USA.
00024 */
00025 #ifndef NL_MODULE_H
00026 #define NL_MODULE_H
00027
00028 namespace NLAISCRIPT
00029 {
00031 typedef std::map<NLAISCRIPT::CStringType , NLAIAGENT::IObjectIA * > tDicoStr;
00032
00043 class IBlock: public NLAIC::IBasicInterface
00044 {
00045 public:
00046 static const NLAIC::CIdentType IdBlock;
00047
00048 protected:
00050 typedef std::map<NLAISCRIPT::CStringType , NLAIAGENT::IObjectIA *>::iterator tDicoStrIter;
00051
00052 private:
00054 CCodeBrancheRun* _Cbr;
00056 tListCode _ListCode;
00058 tDicoStr *_DicoLocVar;
00060 bool _HaveToDeleteDico;
00061
00062 bool _Debug;
00063 bool _FirstOpCodeInLine;
00064 uint16 _CurrentLine;
00065
00066
00067 public:
00068
00070 IBlock(bool debugMode,tDicoStr *dico)
00071 {
00072 _Debug = debugMode;
00073 _Cbr = NULL;
00074 _FirstOpCodeInLine = true;
00075 _CurrentLine = 0;
00076 _HaveToDeleteDico = false;
00077 _DicoLocVar = dico;
00078 }
00079
00080 IBlock(bool debugMode)
00081 {
00082 _Debug = debugMode;
00083 _Cbr = NULL;
00084 _FirstOpCodeInLine = true;
00085 _CurrentLine = 0;
00086 _HaveToDeleteDico = true;
00087 _DicoLocVar = new tDicoStr;
00088 }
00089
00090
00091 virtual ~IBlock()
00092 {
00093 while(_ListCode.size() != 0)
00094 {
00095 ((IOpCode *)*_ListCode.front())->release();
00096 delete _ListCode.front();
00097 _ListCode.pop_front();
00098 }
00099
00100 if(_Cbr) _Cbr->release();
00101 tDicoStrIter it = _DicoLocVar->begin();
00102 while(it != _DicoLocVar->end())
00103 {
00104 #ifdef NL_DEBUG
00105 const NLAIAGENT::IObjectIA *o = (*it).second;
00106 #endif
00107 (*it).second->release();
00108 it ++;
00109 }
00110 if(_HaveToDeleteDico) delete _DicoLocVar;
00111
00112 }
00113
00115 NLAIAGENT::IObjectIA *getVar(const char *Name)
00116 {
00117 tDicoStr::iterator Itr = _DicoLocVar->find(NLAISCRIPT::CStringType(Name));
00118
00119 if(Itr != _DicoLocVar->end())
00120 {
00121 return (*Itr).second;
00122 }
00123
00124 return NULL;
00125 }
00126
00127 NLAIAGENT::IObjectIA *eraseVar(const char *Name)
00128 {
00129 tDicoStr::iterator Itr = _DicoLocVar->find(NLAISCRIPT::CStringType(Name));
00130
00131 if(Itr != _DicoLocVar->end())
00132 {
00133 _DicoLocVar->erase(Itr);
00134 }
00135
00136 return NULL;
00137 }
00138
00139
00141 tDicoStr *lockDictionarry()
00142 {
00143 _HaveToDeleteDico = false;
00144 return _DicoLocVar;
00145 }
00146
00148 bool allocLocVar(const char *name, NLAIAGENT::IObjectIA *var)
00149 {
00150 if(getVar(name) != NULL) return false;
00151 _DicoLocVar->insert(tDicoStr::value_type(NLAISCRIPT::CStringType(name),var));
00152 return true;
00153 }
00154
00156 CCodeBrancheRun *getCode()
00157 {
00158 if(/*_Cbr == NULL && */_ListCode.size())
00159 {
00160 sint32 k = _ListCode.size();
00161 CCodeBrancheRun *cbr;
00162 cbr = new CCodeBrancheRun(k);
00163 for(sint32 i = 0; i < k; i++)
00164 {
00165 CBagOfCode *x = _ListCode.front();
00166 (*cbr)[i] = (IOpCode *)*x;
00167 x->setConstraintIndex(i,cbr);
00168 delete x;
00169 _ListCode.pop_front();
00170 }
00171 return cbr;
00172
00173 }
00174 return NULL;
00175 }
00176
00178 CCodeBrancheRunDebug* getCodeDebug(IScriptDebugSource* sourceCode)
00179 {
00180 if(/*_Cbr == NULL && */_ListCode.size())
00181 {
00182 sint32 k = _ListCode.size();
00183 CCodeBrancheRunDebug *cbr;
00184 cbr = new CCodeBrancheRunDebug(k, sourceCode);
00185
00186 for(sint32 i = 0; i < k; i++)
00187 {
00188 CBagOfCode *x = _ListCode.front();
00189 (*cbr)[i] = (IOpCode *)*x;
00190 x->setConstraintIndex(i,cbr);
00191 delete x;
00192 _ListCode.pop_front();
00193 }
00194 return cbr;
00195
00196 }
00197 return NULL;
00198 }
00199
00201 sint32 isCodeMonted()
00202 {
00203 return _Cbr != NULL;
00204 }
00205
00207
00208 const NLAIC::IBasicType *clone() const
00209 {
00210 NLAIC::IBasicType *x = new IBlock(_Debug);
00211 return x;
00212 }
00213
00214 const NLAIC::IBasicType *newInstance() const
00215 {
00216 return clone();
00217 }
00218
00219 const NLAIC::CIdentType &getType() const
00220 {
00221 return IdBlock;
00222 }
00223
00224 void getDebugString(std::string &) const
00225 {
00226 }
00227
00228 void save(NLMISC::IStream &os)
00229 {
00230 }
00231
00232 void load(NLMISC::IStream &is)
00233 {
00234 }
00235 const NLAIAGENT::IObjectIA::CProcessResult &run();
00236 bool isEqual(const NLAIAGENT::IBasicObjectIA &a) const{ return true;}
00238
00240 tListCode &listCode()
00241 {
00242 return _ListCode;
00243 }
00244
00246 void addCode(IOpCode *op)
00247 {
00248 //op->incRef();
00249 CBagOfCode *x = new CBagOfCode(op);
00250 _ListCode.push_back(x);
00251
00252 // Debug part
00253 CConstraintDebug* pcdb;
00254 if (_Debug && _FirstOpCodeInLine)
00255 {
00256 pcdb = new CConstraintDebug(_CurrentLine, 1);
00257 x->addConstraint(pcdb);
00258 _FirstOpCodeInLine = false;
00259 }
00260 }
00261
00263
00264 void pushCode(IOpCode *op)
00265 {
00266 _ListCode.push_back(new CBagOfCode(op));
00267 }
00268
00269 IOpCode *getBack()
00270 {
00271 return (IOpCode *)*_ListCode.back();
00272 }
00273
00274 IOpCode *getFront()
00275 {
00276 return (IOpCode *)*_ListCode.front();
00277 }
00278
00279 void pushBagCode(CBagOfCode *bOp)
00280 {
00281 _ListCode.push_back(bOp);
00282 }
00283
00284 CBagOfCode *getBagOfCode()
00285 {
00286 return _ListCode.back();
00287 }
00289
00291 void setCurrentLine (uint16 line)
00292 {
00293 _CurrentLine = line;
00294 }
00295
00297 void setFirstOpCodeInLine (bool b)
00298 {
00299 _FirstOpCodeInLine = b;
00300 }
00301 };
00302 }
00303 #endif
|
||||||||||||||||||||||||