00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef MARSYAS_EX_NODE_H
00042 #define MARSYAS_EX_NODE_H
00043 #include <string>
00044 #include <iostream>
00045 #include <cstdlib>
00046 #include "ExVal.h"
00047 #include "ExSymTbl.h"
00048 #include "MarControl.h"
00049 #include "MarSystem.h"
00050 #include "common_header.h"
00051 #include "TmTimer.h"
00052 #include "ExCommon.h"
00053
00054 namespace Marsyas
00055 {
00086 void loadlib_Real(ExRecord* st);
00087 void loadlib_String(ExRecord* st);
00088 void loadlib_Natural(ExRecord* st);
00089 void loadlib_Stream(ExRecord* st);
00090 void loadlib_List(ExRecord* st);
00091 void load_symbols(ExRecord*);
00092 void loadlib_timer(ExRecord* st, TmTimer** tmr);
00093
00094 class ExNode : public ExRefCount {
00095 std::string type; int kind;
00096 public:
00097 std::string val_str;
00098 ExVal value;
00099
00100 ExNode* next;
00101
00102 ExNode();
00103 ExNode(int k, std::string t);
00104 ExNode(int k, std::string t, ExVal v);
00105 ExNode(ExVal v);
00106 ExNode(const ExNode& v);
00107 virtual ~ExNode();
00108
00109 void init();
00110
00111 virtual bool is_const();
00112 bool is_list() const;
00113 bool is_seq() const;
00114
00115 std::string getType() const;
00116 std::string getEvalType() const;
00117 void setType(const std::string t);
00118 int getKind() const { return kind; }
00119 void setKind(const int k);
00120
00121 virtual ExNode* copy();
00122
00123 ExVal getValue() { return value; }
00124 mrs_natural valToNatural() {return value.toNatural();}
00125
00126 void setValue(mrs_natural x){value.set(x);setKind(T_CONST);setType("mrs_natural");}
00127 void setValue(std::string x){value.set(x);setKind(T_CONST);setType("mrs_string");}
00128 void setValue(mrs_real x){value.set(x);setKind(T_CONST);setType("mrs_real");}
00129 void setValue(mrs_bool x){value.set(x);setKind(T_CONST);setType("mrs_bool");}
00130
00131 virtual std::string toString();
00132 virtual std::string oot();
00133 virtual ExVal eval();
00134 virtual ExVal calc() { return value; }
00135
00136 ExVal getSeqRange(int lidx, int ridx);
00137 ExVal getSeqElem(int idx);
00138 void setSeqElem(int idx, ExVal v);
00139 std::string getElemType() const;
00140 };
00141
00142
00143 #define UNARYOP(_NM,_KIND,_TYPE,_TO,_OP) \
00144 class ExNode_##_NM : public ExNode { \
00145 ExNode* child; public: \
00146 ExNode_##_NM(ExNode* v) : ExNode(_KIND,_TYPE) { child=v; } \
00147 virtual ~ExNode_##_NM() { child->deref(); } \
00148 virtual ExVal calc() { return _OP((child->eval())._TO); } \
00149 };
00150 UNARYOP(MathNeg_Real ,OP_MNEG,"mrs_real" ,toReal() ,-);
00151 UNARYOP(MathNeg_Natural,OP_MNEG,"mrs_natural",toNatural(),-);
00152 UNARYOP(BoolNeg ,OP_BNEG,"mrs_bool" ,toBool() ,!);
00153
00154
00155
00156 UNARYOP(NaturalToReal ,OP_CONV,"mrs_real" ,toNatural(),(mrs_real) );
00157 UNARYOP(RealToNatural ,OP_CONV,"mrs_natural",toReal() ,(mrs_natural));
00158 UNARYOP(RealToString ,OP_CONV,"mrs_string" ,toReal() ,dtos );
00159 UNARYOP(NaturalToString,OP_CONV,"mrs_string" ,toNatural(),ltos );
00160 UNARYOP(BoolToString ,OP_CONV,"mrs_string" ,toBool() ,btos );
00161
00162
00163
00164 #define BINOP(_NM,_KIND,_OP) \
00165 class ExNode_##_NM : public ExNode { \
00166 ExNode* lchild; ExNode* rchild; std::string d; public: \
00167 ExNode_##_NM(std::string t, ExNode* u, ExNode* v) : ExNode(_KIND,t) { \
00168 lchild=u; rchild=v; \
00169 if (getType()=="mrs_real") { d="d"; } else d=""; \
00170 } \
00171 virtual ~ExNode_##_NM() { lchild->deref(); rchild->deref(); } \
00172 virtual ExVal calc() { return (lchild->eval()) _OP (rchild->eval()); } \
00173 };
00174 BINOP(ADD,OP_ADD,+);
00175 BINOP(SUB,OP_SUB,-);
00176 BINOP(MUL,OP_MUL,*);
00177 BINOP(DIV,OP_DIV,/);
00178 BINOP(MOD,OP_MOD,%);
00179 BINOP(EQ,OP_EQ,==);
00180 BINOP(NE,OP_NE,!=);
00181 BINOP(GT,OP_GT,> );
00182 BINOP(GE,OP_GE,>=);
00183 BINOP(LT,OP_LT,< );
00184 BINOP(LE,OP_LE,<=);
00185 BINOP(OR,OP_OR,||);
00186 BINOP(AND,OP_AND,&&);
00187
00188
00189 class ExNode_Conditional : public ExNode
00190 {
00191 ExNode* cond; ExNode* then_; ExNode* else_; public:
00192 ExNode_Conditional(std::string t, ExNode* c, ExNode* ts, ExNode* es) : ExNode(T_COND,t) {
00193 cond=c; then_=ts; else_=es;
00194 }
00195 ~ExNode_Conditional() { cond->deref(); then_->deref(); else_->deref(); }
00196 virtual ExVal calc() {
00197 ExVal v = cond->eval();
00198 return (v.toBool()) ? then_->eval() : else_->eval();
00199 }
00200 };
00201
00203 class ExNode_IterMap : public ExNode
00204 {
00205 ExNode* xs; ExRecord* var; ExNode* exprs; public:
00206 ExNode_IterMap(ExNode* s, ExRecord* r, ExNode* e, std::string t) : ExNode(T_VAR,t) {
00207 xs=s; var=r; var->inc_ref(); exprs=e;
00208 }
00209 virtual ~ExNode_IterMap() { xs->deref(); var->deref(); exprs->deref(); }
00210 virtual ExVal calc() {
00211 ExVal liszt=xs->eval();
00212 mrs_natural len=liszt.toNatural();
00213 ExNode** new_xs=NULL;
00214 if (len>0) {
00215 new_xs=new ExNode*[len];
00216 for (int i=0;i<len;++i) {
00217 ExVal e=liszt.getSeqElem(i);
00218 var->setValue(e);
00219 ExVal v=exprs->eval();
00220 new_xs[i]=new ExNode(v);
00221 }
00222 }
00223 return ExVal(len,new_xs);
00224 }
00225 };
00227 class ExNode_IterIter : public ExNode
00228 {
00229 ExRecord* xs; ExRecord* var; ExNode* exprs; public:
00230 ExNode_IterIter(ExRecord* s, ExRecord* r, ExNode* e) : ExNode(T_VAR,"mrs_unit") {
00231 xs=s; xs->inc_ref(); var=r; var->inc_ref(); exprs=e;
00232 }
00233 virtual ~ExNode_IterIter() { xs->deref(); var->deref(); exprs->deref(); }
00234 virtual ExVal calc() {
00235 ExVal liszt=xs->getValue();
00236 mrs_natural len=liszt.toNatural();
00237 if (len>0) {
00238 for (int i=0;i<len;++i) {
00239 ExVal e=liszt.getSeqElem(i);
00240 var->setValue(e);
00241 ExVal v=exprs->eval();
00242 xs->setValue(v,"",i);
00243 }
00244 }
00245 return ExVal();
00246 }
00247 };
00249 class ExNode_IterFor : public ExNode
00250 {
00251 ExNode* xs; ExRecord* var; ExNode* exprs; public:
00252 ExNode_IterFor(ExNode* s, ExRecord* r, ExNode* e) : ExNode(T_VAR,"mrs_unit") {
00253 xs=s; var=r; var->inc_ref(); exprs=e;
00254 }
00255 virtual ~ExNode_IterFor() { xs->deref(); var->deref(); exprs->deref(); }
00256 virtual ExVal calc() {
00257 ExVal liszt=xs->eval();
00258 mrs_natural len=liszt.toNatural();
00259 if (len>0) {
00260 for (int i=0;i<len;++i) {
00261 ExVal e=liszt.getSeqElem(i);
00262 var->setValue(e);
00263 exprs->eval();
00264 }
00265 }
00266 return ExVal();
00267 }
00268 };
00269 class ExNode_IterRFor : public ExNode
00270 {
00271 ExNode* xs; ExRecord* var; ExNode* exprs; public:
00272 ExNode_IterRFor(ExNode* s, ExRecord* r, ExNode* e) : ExNode(T_VAR,"mrs_unit") {
00273 xs=s; var=r; var->inc_ref(); exprs=e;
00274 }
00275 virtual ~ExNode_IterRFor() { xs->deref(); var->deref(); exprs->deref(); }
00276 virtual ExVal calc() {
00277 ExVal liszt=xs->eval();
00278 mrs_natural len=liszt.toNatural();
00279 if (len>0) {
00280 for (int i=len-1;i>=0;i--) {
00281 ExVal e=liszt.getSeqElem(i);
00282 var->setValue(e);
00283 exprs->eval();
00284 }
00285 }
00286 return ExVal();
00287 }
00288 };
00289
00292 class ExNode_StringMap : public ExNode
00293 {
00294 ExNode* xs; ExRecord* var; ExNode* exprs; public:
00295 ExNode_StringMap(ExNode* s, ExRecord* r, ExNode* e, std::string t) : ExNode(T_VAR,t) {
00296 xs=s; var=r; var->inc_ref(); exprs=e;
00297 }
00298 virtual ~ExNode_StringMap() { xs->deref(); var->deref(); exprs->deref(); }
00299 virtual ExVal calc() {
00300 std::string str=(xs->eval()).toString();
00301 std::string result="";
00302 mrs_natural len=(mrs_natural)str.length();
00303 if (len>0) {
00304 for (int i=0;i<len;++i) {
00305 ExVal v=ExVal(((std::string)"")+str[i]);
00306 var->setValue(v);
00307 std::string r=(exprs->eval()).toString();
00308 result+=(exprs->eval()).toString();
00309 }
00310 }
00311 return ExVal(result);
00312 }
00313 };
00315 class ExNode_StringIter : public ExNode
00316 {
00317 ExRecord* xs; ExRecord* var; ExNode* exprs; public:
00318 ExNode_StringIter(ExRecord* s, ExRecord* r, ExNode* e) : ExNode(T_VAR,"mrs_unit") {
00319 xs=s; xs->inc_ref(); var=r; var->inc_ref(); exprs=e;
00320 }
00321 virtual ~ExNode_StringIter() { xs->deref(); var->deref(); exprs->deref(); }
00322 virtual ExVal calc() {
00323 std::cout << "ITER:"<<std::endl;
00324 std::string str=(xs->getValue()).toString();
00325 std::string result="";
00326 mrs_natural len=(mrs_natural)str.length();
00327 if (len>0) {
00328 for (int i=0;i<len;++i) {
00329 ExVal v=ExVal(((std::string)"")+str[i]);
00330 var->setValue(v);
00331 result+=(exprs->eval()).toString();
00332 }
00333 }
00334 ExVal v=ExVal(result);
00335 xs->setValue(v);
00336 return ExVal();
00337 }
00338 };
00340 class ExNode_StringFor : public ExNode
00341 {
00342 ExNode* xs; ExRecord* var; ExNode* exprs; public:
00343 ExNode_StringFor(ExNode* s, ExRecord* r, ExNode* e) : ExNode(T_VAR,"mrs_unit") {
00344 xs=s; var=r; var->inc_ref(); exprs=e;
00345 }
00346 virtual ~ExNode_StringFor() { xs->deref(); var->deref(); exprs->deref(); }
00347 virtual ExVal calc() {
00348 std::string str=(xs->eval()).toString();
00349 std::string result="";
00350 mrs_natural len=(mrs_natural)str.length();
00351 if (len>0) {
00352 for (int i=0;i<len;++i) {
00353 ExVal v=ExVal(((std::string)"")+str[i]);
00354 var->setValue(v);
00355 exprs->eval();
00356 }
00357 }
00358 return ExVal();
00359 }
00360 };
00361 class ExNode_StringRFor : public ExNode
00362 {
00363 ExNode* xs; ExRecord* var; ExNode* exprs; public:
00364 ExNode_StringRFor(ExNode* s, ExRecord* r, ExNode* e) : ExNode(T_VAR,"mrs_unit") {
00365 xs=s; var=r; var->inc_ref(); exprs=e;
00366 }
00367 virtual ~ExNode_StringRFor() { xs->deref(); var->deref(); exprs->deref(); }
00368 virtual ExVal calc() {
00369 std::string str=(xs->eval()).toString();
00370 std::string result="";
00371 mrs_natural len=(mrs_natural)str.length();
00372 if (len>0) {
00373 for (int i=len-1;i>=0;i--) {
00374 ExVal v=ExVal(((std::string)"")+str[i]);
00375 var->setValue(v);
00376 exprs->eval();
00377 }
00378 }
00379 return ExVal();
00380 }
00381 };
00382
00383
00384 class ExNode_SetElem : public ExNode
00385 {
00386 ExRecord* list; ExNode* var; ExNode* idx; public:
00387 ExNode_SetElem(ExRecord* xs, ExNode* i, ExNode* v) : ExNode(T_VAR,xs->getType()) {
00388 list=xs; list->inc_ref(); idx=i; var=v; var->inc_ref();
00389 }
00390 ~ExNode_SetElem() { list->deref(); var->deref(); idx->deref(); }
00391 virtual ExVal calc() {
00392 ExVal v=var->eval();
00393 mrs_natural i=(idx->eval()).toNatural();
00394 v.setSeqElem(i,v);
00395 return v;
00396 }
00397 };
00398 class ExNode_Range : public ExNode
00399 {
00400 ExNode* xs; ExNode* lidx; ExNode* ridx; public:
00401 ExNode_Range(ExNode* s, ExNode* l, ExNode* r) : ExNode(s->getKind(),s->getType()) { xs=s;lidx=l;ridx=r; }
00402 ~ExNode_Range() { xs->deref(); lidx->deref(); ridx->deref(); }
00403 virtual ExVal calc() {
00404 ExVal v=xs->eval();
00405 mrs_natural l=(lidx->eval()).toNatural();
00406 mrs_natural r=(ridx->eval()).toNatural();
00407 if (l<0) l=0; if (r<l) r=l;
00408 return v.getSeqRange(l,r);
00409 }
00410 };
00411 class ExNode_GetElem : public ExNode
00412 {
00413 ExNode* xs; ExNode* idx; public:
00414 ExNode_GetElem(ExNode* s, ExNode* i) : ExNode(s->getKind(),s->getElemType()) { xs=s; idx=i; }
00415 ~ExNode_GetElem() { xs->deref(); idx->deref(); }
00416 virtual ExVal calc() {
00417 ExVal v=xs->eval();
00418 mrs_natural i=(idx->eval()).toNatural();
00419 return v.getSeqElem(i);
00420 }
00421 };
00422
00423
00424 #define GETCTRL(_T,_METHOD,_TP) \
00425 class ExNode_GetCtrl##_T : public ExNode { public: \
00426 std::string nm; MarControlPtr ptr; \
00427 ExNode_GetCtrl##_T(std::string n, MarControlPtr p) : ExNode(OP_GETCTRL,_TP) { nm=n; ptr=p; } \
00428 virtual ExVal calc() { return ptr->_METHOD; } \
00429 };
00430 GETCTRL(Real,to<mrs_real>(),"mrs_real");
00431 GETCTRL(String,to<mrs_string>(),"mrs_string");
00432 GETCTRL(Natural,to<mrs_natural>(),"mrs_natural");
00433 GETCTRL(Bool,to<mrs_bool>(),"mrs_bool");
00434
00435
00436 #define SETCTRL(_N,_METHOD,_TP) \
00437 class ExNode_SetCtrl##_N : public ExNode { \
00438 std::string nm; MarControlPtr ptr; ExNode* ex; public: \
00439 ExNode_SetCtrl##_N(std::string n, MarControlPtr p, ExNode* u) : ExNode(OP_SETCTRL,_TP) { nm=n; ptr=p; ex=u; } \
00440 ~ExNode_SetCtrl##_N() { ex->deref(); } \
00441 virtual ExVal calc() { ExVal v=ex->eval(); ptr->setValue(v._METHOD); return v; } \
00442 };
00443 SETCTRL(Real,toReal(),"mrs_real");
00444 SETCTRL(String,toString(),"mrs_string");
00445 SETCTRL(Natural,toNatural(),"mrs_natural");
00446 SETCTRL(Bool,toBool(),"mrs_bool");
00447
00448 class ExNode_Link : public ExNode
00449 { public:
00450 MarControlPtr ptr_a; MarControlPtr ptr_b;
00451 ExNode_Link(MarControlPtr pf, MarControlPtr pt, std::string t) : ExNode(OP_LINK,t) { ptr_a=pf; ptr_b=pt; }
00452 virtual ExVal calc() { return ptr_a->linkTo(ptr_b); }
00453 };
00454
00455 class ExCNameAlias
00456 { public:
00457 std::string tp; std::string nm; MarControlPtr ptr;
00458 ExCNameAlias() { };
00459 ExCNameAlias(std::string t, std::string n, MarControlPtr p) { tp=t; nm=n; ptr=p; };
00460 virtual ~ExCNameAlias(){};
00461 virtual ExNode* getctrl(){
00462 if (tp=="mrs_real" ) { return new ExNode_GetCtrlReal(nm,ptr); }
00463 if (tp=="mrs_natural") { return new ExNode_GetCtrlNatural(nm,ptr); }
00464 if (tp=="mrs_string" ) { return new ExNode_GetCtrlString(nm,ptr); }
00465 if (tp=="mrs_bool" ) { return new ExNode_GetCtrlBool(nm,ptr); }
00466 return NULL;
00467 };
00468 virtual ExNode* setctrl(ExNode* u){
00469 if (tp=="mrs_real" ) { return new ExNode_SetCtrlReal(nm,ptr,u); }
00470 if (tp=="mrs_natural") { return new ExNode_SetCtrlNatural(nm,ptr,u); }
00471 if (tp=="mrs_string" ) { return new ExNode_SetCtrlString(nm,ptr,u); }
00472 if (tp=="mrs_bool" ) { return new ExNode_SetCtrlBool(nm,ptr,u); }
00473 return NULL;
00474 };
00475 };
00476
00477 class ExNode_AsgnVar : public ExNode
00478 {
00479 ExRecord* var; ExNode* ex; std::string d; public:
00480 ExNode_AsgnVar(ExNode* f, ExRecord* r) : ExNode(OP_ASGN,f->getType()) {
00481 ex=f; var=r; var->inc_ref();
00482 if (f->getType()=="mrs_real") d="d"; else d="n";
00483 }
00484 virtual ~ExNode_AsgnVar() { var->deref(); ex->deref(); }
00485 virtual ExVal calc() { ExVal v=(ex->eval()); var->setValue(v); return v; }
00486 };
00487 class ExNode_ReadVar : public ExNode
00488 {
00489 ExRecord* var; std::string d; public:
00490 ExNode_ReadVar(ExRecord* es, std::string nm) : ExNode(T_NAME,es->getType()) {
00491 var=es; var->inc_ref(); val_str=nm;
00492 std::string t = es->getType();
00493 if (t=="mrs_real") d="d"; else d="n";
00494 }
00495 virtual ~ExNode_ReadVar() { var->deref(); }
00496 virtual ExVal calc() { return var->getValue(); }
00497 };
00498
00499 class ExFun : public ExNode
00500 {
00501 protected:
00502 ExNode** params;
00503 int num_params;
00504 std::vector<std::string> param_types;
00505 bool is_pure; bool const_params;
00506 std::string signature;
00507 public:
00508 ExFun(std::string t, std::string r) : ExNode(T_FUN,t) { setSignature(r); params=NULL; num_params=0; is_pure=false; }
00509 ExFun(std::string t, std::string r, bool pure) : ExNode(T_FUN,t) { setSignature(r); is_pure=pure; params=NULL; num_params=0; is_pure=false; }
00510 virtual ~ExFun();
00511 void setSignature(const std::string);
00512 std::string getSignature() const { return signature; }
00513 void setParams(ExNode* ps);
00514 void setParamTypes(std::string t);
00515 virtual bool is_const();
00516 ExFun* copy()=0;
00517 };
00518
00519 #define LibExNode0(_NM,_FUN) \
00520 class ExFun_##_NM : public ExFun { public: \
00521 ExFun_##_NM() : ExFun(type_,sig_,true) { } \
00522 virtual ExVal calc() { return _FUN(); } \
00523 ExFun* copy() { return new ExFun_##_NM (); } \
00524 };
00525
00526 #define LibExFun1(_NM,_FUN,_T1,type_,sig_) \
00527 class ExFun_##_NM : public ExFun { public: \
00528 ExFun_##_NM() : ExFun(type_,sig_,true) { } \
00529 virtual ExVal calc() { return _FUN((params[0]->eval())._T1); } \
00530 ExFun* copy() { return new ExFun_##_NM (); } \
00531 };
00532 #define LibExFun2(_NM,_FUN,_T1,_T2) \
00533 class ExFun_##_NM : public ExFun { public: \
00534 ExFun_##_NM() : ExFun(type_,sig_,true) { } \
00535 virtual ExVal calc() { return _FUN((params[0]->eval())._T1,(params[1]->eval())._T2); } \
00536 ExFun* copy() { return new ExFun_##_NM (); } \
00537 };//}}}
00538
00539 class ExFun_NaturalMin : public ExFun
00540 { public:
00541 ExFun_NaturalMin() : ExFun("mrs_natural","Natural.min(mrs_natural,mrs_natural)",true) { }
00542 virtual ExVal calc() {
00543 mrs_natural n1=(params[0]->eval()).toNatural();
00544 mrs_natural n2=(params[1]->eval()).toNatural();
00545 return (n2<n1) ? n2 : n1;
00546 }
00547 ExFun* copy() { return new ExFun_NaturalMin(); }
00548 };
00549 class ExFun_NaturalMax : public ExFun
00550 { public:
00551 ExFun_NaturalMax() : ExFun("mrs_natural","Natural.max(mrs_natural,mrs_natural)",true) { }
00552 virtual ExVal calc() {
00553 mrs_natural n1=(params[0]->eval()).toNatural();
00554 mrs_natural n2=(params[1]->eval()).toNatural();
00555 return (n2>n1) ? n2 : n1;
00556 }
00557 ExFun* copy() { return new ExFun_NaturalMax(); }
00558 };
00559 class ExFun_NaturalRand : public ExFun
00560 { public:
00561 ExFun_NaturalRand() : ExFun("mrs_natural","Natural.rand()",true) { }
00562 virtual ExVal calc() { return (mrs_natural)rand(); }
00563 ExFun* copy() { return new ExFun_NaturalRand(); }
00564 };
00565 class ExFun_NaturalRandRange1 : public ExFun
00566 { public:
00567 ExFun_NaturalRandRange1() : ExFun("mrs_natural","Natural.rand(mrs_natural)",true) { }
00568 virtual ExVal calc() {
00569 mrs_natural n1=(params[0]->eval()).toNatural();
00570 mrs_natural on=((int)((double)rand()/(double)RAND_MAX*n1));
00571 return (mrs_natural)on;
00572 }
00573 ExFun* copy() { return new ExFun_NaturalRandRange1(); }
00574 };
00575 class ExFun_NaturalRandRange2 : public ExFun
00576 { public:
00577 ExFun_NaturalRandRange2() : ExFun("mrs_natural","Natural.rand(mrs_natural,mrs_natural)",true) { }
00578 virtual ExVal calc() {
00579 mrs_natural n1=(params[0]->eval()).toNatural();
00580 mrs_natural n2=(params[1]->eval()).toNatural();
00581 mrs_natural on=((int)((double)rand()/(double)RAND_MAX*(n2-n1)))+n1;
00582 return (mrs_natural)on;
00583 }
00584 ExFun* copy() { return new ExFun_NaturalRandRange2(); }
00585 };
00586 class ExFun_NaturalSRand : public ExFun
00587 { public:
00588 ExFun_NaturalSRand() : ExFun("mrs_natural","Natural.srand(mrs_natural)",true) { }
00589 virtual ExVal calc() { return (mrs_natural)0; }
00590 ExFun* copy() { return new ExFun_NaturalSRand(); }
00591 };
00592 class ExFun_NaturalAbs : public ExFun
00593 { public:
00594 ExFun_NaturalAbs() : ExFun("mrs_real","Natural.abs(mrs_real)",true) { }
00595 virtual ExVal calc() { mrs_natural d = (params[0]->eval()).toNatural(); return (d<0) ? -d : d; }
00596 ExFun* copy() { return new ExFun_NaturalAbs(); }
00597 };
00598
00599 LibExFun1(RealCos,cos,toReal(),"mrs_real","Real.cos(mrs_real)");
00600 LibExFun1(RealSqrt,sqrt,toReal(),"mrs_real","Real.sqrt(mrs_real)");
00601 LibExFun1(RealSin,sin,toReal(),"mrs_real","Real.sin(mrs_real)");
00602 LibExFun1(RealACos,acos,toReal(),"mrs_real","Real.acos(mrs_real)");
00603 LibExFun1(RealASin,asin,toReal(),"mrs_real","Real.asin(mrs_real)");
00604 LibExFun1(RealATan,atan,toReal(),"mrs_real","Real.atan(mrs_real)");
00605 LibExFun1(RealCosH,cosh,toReal(),"mrs_real","Real.cosh(mrs_real)");
00606 LibExFun1(RealSinH,sinh,toReal(),"mrs_real","Real.sinh(mrs_real)");
00607 LibExFun1(RealTan,tan,toReal(),"mrs_real","Real.tan(mrs_real)");
00608 LibExFun1(RealLog,log,toReal(),"mrs_real","Real.log(mrs_real)");
00609 LibExFun1(RealLog10,log10,toReal(),"mrs_real","Real.log10(mrs_real)");
00610
00611 class ExFun_RealAbs : public ExFun
00612 { public:
00613 ExFun_RealAbs() : ExFun("mrs_real","Real.abs(mrs_real)",true) { }
00614 virtual ExVal calc() { mrs_real d = (params[0]->eval()).toReal(); return (d<0.0) ? -d : d; }
00615 ExFun* copy() { return new ExFun_RealAbs(); }
00616 };
00617 class ExFun_RealLog2 : public ExFun
00618 { public:
00619 ExFun_RealLog2() : ExFun("mrs_real","Real.log2(mrs_real)",true) { }
00620 virtual ExVal calc() { return log10((params[0]->eval()).toReal())/log10(2.0); }
00621 ExFun* copy() { return new ExFun_RealLog2(); }
00622 };
00623 class ExFun_RealRand : public ExFun
00624 { public:
00625 ExFun_RealRand() : ExFun("mrs_real","Real.rand()",false) { }
00626 virtual ExVal calc() { return ((mrs_real)rand())/((mrs_real)RAND_MAX); }
00627 ExFun* copy() { return new ExFun_RealRand(); }
00628 };
00629
00630 class ExFun_StrLen : public ExFun
00631 { public:
00632 ExFun_StrLen() : ExFun("mrs_natural","String.len(mrs_string)",true) { }
00633 virtual ExVal calc() { return (mrs_natural)((params[0]->eval()).toString()).length(); }
00634 ExFun* copy() { return new ExFun_StrLen(); }
00635 };
00636 class ExFun_StrSub : public ExFun
00637 { public:
00638 ExFun_StrSub() : ExFun("mrs_string","String.sub(mrs_string,mrs_natural,mrs_natural)",true) { }
00639 virtual ExVal calc() {
00640 std::string str = params[0]->eval().toString();
00641 int s = params[1]->eval().toNatural();
00642 int e = params[2]->eval().toNatural();
00643 if (s<0) { s=0; }
00644 if (e>(int)(str.length()-s)) { e=((mrs_natural)str.length())-s; }
00645 return str.substr(s,e);
00646 }
00647 ExFun* copy() { return new ExFun_StrSub(); }
00648 };
00649
00650
00651 #define ExFun_StreamOutType(_TYPE,_CONVERSION,_METHOD,_type,_sig) \
00652 class ExFun_StreamOut##_TYPE : public ExFun { public: \
00653 ExFun_StreamOut##_TYPE() : ExFun(_type,_sig,false) { } \
00654 virtual ExVal calc() { ExVal x = params[0]->eval(); std::cout << _CONVERSION(x._METHOD()); return x; } \
00655 ExFun* copy() { return new ExFun_StreamOut##_TYPE(); } \
00656 };
00657 ExFun_StreamOutType(String, ,toString, "mrs_string","Stream.op(mrs_string)");
00658 ExFun_StreamOutType(Real, dtos,toReal, "mrs_real","Stream.op(mrs_real)");
00659 ExFun_StreamOutType(Natural,ltos,toNatural,"mrs_natural","Stream.op(mrs_natural)");
00660 ExFun_StreamOutType(Bool, btos,toBool, "mrs_bool","Stream.op(mrs_bool)");
00661
00662
00663 #define ExFun_StreamOutNType(_TYPE,_CONVERSION,_METHOD,_type,_sig) \
00664 class ExFun_StreamOutN##_TYPE : public ExFun { public: \
00665 ExFun_StreamOutN##_TYPE() : ExFun(_type,_sig,false) { } \
00666 virtual ExVal calc() { ExVal x = params[0]->eval(); std::cout << _CONVERSION(x._METHOD()) << std::endl; return x; } \
00667 ExFun* copy() { return new ExFun_StreamOutN##_TYPE(); } \
00668 };
00669 ExFun_StreamOutNType(String, ,toString,"mrs_string","Stream.opn(mrs_string)");
00670 ExFun_StreamOutNType(Real,dtos,toReal,"mrs_real","Stream.opn(mrs_real)");
00671 ExFun_StreamOutNType(Natural,ltos,toNatural,"mrs_natural","Stream.opn(mrs_natural)");
00672 ExFun_StreamOutNType(Bool,btos,toBool,"mrs_bool","Stream.opn(mrs_bool)");
00673 class ExFun_StreamOutNVal : public ExFun {
00674 ExNode* rec; public:
00675 ExFun_StreamOutNVal(ExNode* r) : ExFun("mrs_unit","Stream.opn(mrs_val)",false) { rec=r; }
00676 virtual ExVal calc() { ExVal x=rec->eval(); std::cout << x << std::endl; return x; }
00677 virtual ~ExFun_StreamOutNVal() { rec->deref(); }
00678 ExFun* copy() { return new ExFun_StreamOutNVal(rec); }
00679 };
00680
00681
00682
00683 #define TIMER_GET(_NM,_ZERO,_METHOD,_type,_sig) \
00684 class ExFun_TimerGet##_NM : public ExFun { \
00685 ExFun* child; public: \
00686 ExFun_TimerGet##_NM() : ExFun(_type,_sig,false) {} \
00687 virtual ExVal calc() { TmTimer** t=params[0]->eval().toTimer(); return (t==NULL||*t==NULL) ? _ZERO : (*t)->_METHOD; } \
00688 ExFun* copy() { return new ExFun_TimerGet##_NM(); } \
00689 };
00690 TIMER_GET(Prefix,"",getPrefix(),"mrs_string","Timer.prefix(mrs_timer)");
00691 TIMER_GET(Name,"",getName(),"mrs_string","Timer.name(mrs_timer)");
00692 TIMER_GET(Type,"",getType(),"mrs_string","Timer.type(mrs_timer)");
00693 TIMER_GET(Time,0,getTime(),"mrs_natural","Timer.time(mrs_timer)");
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703 class ExFun_TimerIntrvlSize : public ExFun
00704 { public:
00705 ExFun_TimerIntrvlSize() : ExFun("mrs_natural","Timer.ival(mrs_timer,mrs_string)",false) {}
00706 virtual ExVal calc() {
00707 TmTimer** t=params[0]->eval().toTimer();
00708 std::string ts=params[1]->eval().toString();
00709 return (t==NULL||*t==NULL) ? 0 : (*t)->intervalsize(ts);
00710 }
00711 ExFun* copy() { return new ExFun_TimerIntrvlSize(); }
00712 };
00713
00714 #define TIMER_UPD(_NM,_ZERO,_METHOD,_type,_sig) \
00715 class ExFun_TimerUpd##_NM : public ExFun { public: \
00716 ExFun_TimerUpd##_NM() : ExFun(_type,_sig,false) {} \
00717 virtual ExVal calc() { \
00718 TmTimer** t=params[0]->eval().toTimer(); \
00719 ExVal s=params[1]->eval(); \
00720 ExVal v=params[2]->eval(); \
00721 if (t==NULL||*t==NULL) { (*t)->updtimer(s.toString(),v._METHOD); return true; } return false; \
00722 } \
00723 ExFun* copy() { return new ExFun_TimerUpd##_NM(); } \
00724 };
00725 TIMER_UPD(Real,0.0,toReal(),"mrs_bool","Timer.upd(mrs_timer,mrs_string,mrs_real)");
00726 TIMER_UPD(Natural,0,toNatural(),"mrs_bool","Timer.upd(mrs_timer,mrs_string,mrs_natural)");
00727 TIMER_UPD(String,"",toString(),"mrs_bool","Timer.upd(mrs_timer,mrs_string,mrs_string)");
00728 TIMER_UPD(Bool,false,toBool(),"mrs_bool","Timer.upd(mrs_timer,mrs_string,mrs_bool)");
00729
00730
00731 class ExFun_ListLen : public ExFun
00732 { public:
00733 ExFun_ListLen() : ExFun("mrs_natural","List.len(mrs_list)",true) { }
00734 virtual ExVal calc() { return (mrs_natural)(params[0]->eval()).toNatural(); }
00735 ExFun* copy() { return new ExFun_ListLen(); }
00736 };
00737
00738
00739 }
00740
00741 #endif
00742