Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/valop is written in an unsupported language. File is not indexed.

0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003 
0004 #ifndef tools_valop
0005 #define tools_valop
0006 
0007 #include "ival_func"
0008 
0009 namespace tools {
0010 
0011 class valop {
0012   static const std::string& s_class() {
0013     static const std::string s_v("tools::valop");
0014     return s_v;
0015   }
0016 public:
0017   enum e_type {
0018     CMP_GT = 1,
0019     CMP_GE = 2,
0020     CMP_LT = 3,
0021     CMP_LE = 4,
0022     CMP_EQ = 5,
0023     CMP_NE = 6,
0024     CMP_AND = 7,
0025     CMP_OR = 8,
0026 
0027     ADD = 9,
0028     MUL = 10,
0029     SUB = 11,
0030     DIV = 12,
0031 
0032     ASSIGN = 13,
0033     MINUS = 14,
0034     UNSIGNED_INTEGER = 15,
0035     REAL = 16,
0036     NAME = 17,
0037     STRING = 18,
0038     //PI = 19,
0039     FUNC = 20,
0040     BOOL_TRUE = 21,
0041     BOOL_FALSE = 22,
0042     NOT = 23,
0043     // math edition :
0044     SYMBOL = 100,
0045     ASIDE = 101,
0046     NVMUL = 102, //not visible mul
0047     EQUAL = 103,
0048     SUPS = 104,  //super script
0049     SUBS = 105   //sub script
0050   };
0051 
0052 public:
0053   valop(e_type a_type)
0054   :m_type(a_type),m_function(0),m_index(not_found())
0055   ,m_A(0),m_B(0),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0056   }
0057 
0058   valop(e_type a_type,valop* a_A)
0059   :m_type(a_type),m_function(0),m_index(not_found())
0060   ,m_A(a_A),m_B(0),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0061   }
0062 
0063   valop(e_type a_type,valop* a_A,valop* a_B)
0064   :m_type(a_type),m_function(0),m_index(not_found())
0065   ,m_A(a_A),m_B(a_B),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0066   }
0067 
0068   valop(e_type a_type,ival_func* a_function,valop* a_A)
0069   :m_type(a_type),m_function(0),m_index(not_found())
0070   ,m_A(a_A),m_B(0),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0071     m_function = a_function?a_function->copy():0;
0072   }
0073 
0074   valop(e_type a_type,ival_func* a_function,valop* a_A,valop* a_B)
0075   :m_type(a_type),m_function(0),m_index(not_found())
0076   ,m_A(a_A),m_B(a_B),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0077     m_function = a_function?a_function->copy():0;
0078   }
0079 
0080   valop(e_type a_type,ival_func* a_function,valop* a_A,valop* a_B,valop* a_C)
0081   :m_type(a_type),m_function(0),m_index(not_found())
0082   ,m_A(a_A),m_B(a_B),m_C(a_C),m_D(0),m_E(0),m_F(0),m_tag(0){
0083     m_function = a_function?a_function->copy():0;
0084   }
0085 
0086   valop(e_type a_type,ival_func* a_function,valop* a_A,valop* a_B,valop* a_C,valop* a_D)
0087   :m_type(a_type),m_function(0),m_index(not_found())
0088   ,m_A(a_A),m_B(a_B),m_C(a_C),m_D(a_D),m_E(0),m_F(0),m_tag(0){
0089     m_function = a_function?a_function->copy():0;
0090   }
0091 
0092   valop(e_type a_type,ival_func* a_function,valop* a_A,valop* a_B,valop* a_C,valop* a_D,valop* a_E)
0093   :m_type(a_type),m_function(0),m_index(not_found())
0094   ,m_A(a_A),m_B(a_B),m_C(a_C),m_D(a_D),m_E(a_E),m_F(0),m_tag(0){
0095     m_function = a_function?a_function->copy():0;
0096   }
0097 
0098   valop(e_type a_type,ival_func* a_function,
0099              valop* a_A,valop* a_B,valop* a_C,
0100              valop* a_D,valop* a_E,valop* a_F)
0101   :m_type(a_type),m_function(0),m_index(not_found())
0102   ,m_A(a_A),m_B(a_B),m_C(a_C),m_D(a_D),m_E(a_E),m_F(a_F),m_tag(0){
0103     m_function = a_function?a_function->copy():0;
0104   }
0105 
0106   valop(e_type a_type,bool a_v)
0107   :m_type(a_type),m_function(0),m_index(not_found())
0108   ,m_A(0),m_B(0),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0109     m_variable.set(a_v);
0110   }
0111 
0112   valop(e_type a_type,unsigned int a_number)
0113   :m_type(a_type),m_function(0),m_index(not_found())
0114   ,m_A(0),m_B(0),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0115     m_variable.set(a_number);
0116   }
0117 
0118   valop(e_type a_type,double a_number)
0119   :m_type(a_type),m_function(0),m_index(not_found())
0120   ,m_A(0),m_B(0),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0121     m_variable.set(a_number);
0122   }
0123 
0124   valop(e_type a_type,const std::string& a_string)
0125   :m_type(a_type),m_function(0),m_index(not_found())
0126   ,m_A(0),m_B(0),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0127     m_variable.set(a_string);
0128   }
0129 
0130   //NOTE : the below is needed so that valop("t") not put on valop(bool).
0131   valop(e_type a_type,const char* a_cstr)
0132   :m_type(a_type),m_function(0),m_index(not_found())
0133   ,m_A(0),m_B(0),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0134     m_variable.set(a_cstr);
0135   }
0136 
0137   valop(e_type a_type,const std::string& a_name,int a_index)
0138   :m_type(a_type),m_function(0),m_name(a_name),m_index(a_index)
0139   ,m_A(0),m_B(0),m_C(0),m_D(0),m_E(0),m_F(0),m_tag(0){
0140     // a_name needed to not confuse with the constructor (e_type,unsigned int).
0141   }
0142 
0143   virtual ~valop() {
0144     delete m_function;
0145     delete m_A;
0146     delete m_B;
0147     delete m_C;
0148     delete m_D;
0149     delete m_E;
0150     delete m_F;
0151   }
0152 public:
0153   valop(const valop& a_from)
0154   :m_type(a_from.m_type)
0155   ,m_function(a_from.m_function?a_from.m_function->copy():0)
0156   ,m_variable(a_from.m_variable)
0157   ,m_name(a_from.m_name)
0158   ,m_index(a_from.m_index)
0159 
0160   ,m_A(a_from.m_A?new valop(*a_from.m_A):0)
0161   ,m_B(a_from.m_B?new valop(*a_from.m_B):0)
0162   ,m_C(a_from.m_C?new valop(*a_from.m_C):0)
0163   ,m_D(a_from.m_D?new valop(*a_from.m_D):0)
0164   ,m_E(a_from.m_E?new valop(*a_from.m_E):0)
0165   ,m_F(a_from.m_F?new valop(*a_from.m_F):0)
0166 
0167   ,m_tag(a_from.m_tag)
0168   {
0169   }
0170   valop& operator=(const valop& a_from) {
0171     if(&a_from==this) return *this;
0172 
0173     m_type = a_from.m_type;
0174 
0175     delete m_function;
0176     m_function = a_from.m_function?a_from.m_function->copy():0;
0177 
0178     m_variable = a_from.m_variable;
0179     m_name = a_from.m_name;
0180     m_index = a_from.m_index;
0181 
0182     delete m_A;
0183     delete m_B;
0184     delete m_C;
0185     delete m_D;
0186     delete m_E;
0187     delete m_F;
0188     m_A = a_from.m_A?new valop(*a_from.m_A):0;
0189     m_B = a_from.m_B?new valop(*a_from.m_B):0;
0190     m_C = a_from.m_C?new valop(*a_from.m_C):0;
0191     m_D = a_from.m_D?new valop(*a_from.m_D):0;
0192     m_E = a_from.m_E?new valop(*a_from.m_E):0;
0193     m_F = a_from.m_F?new valop(*a_from.m_F):0;
0194 
0195     m_tag = a_from.m_tag;
0196     return *this;
0197   }
0198 
0199 protected:
0200   static int not_found() {return -1;}
0201 public:
0202   e_type m_type;
0203   ival_func* m_function; //owner
0204   value m_variable;
0205   std::string m_name;
0206   int m_index;
0207   valop* m_A;
0208   valop* m_B;
0209   valop* m_C;
0210   valop* m_D;
0211   valop* m_E;
0212   valop* m_F;
0213 public:
0214   int m_tag;
0215 };
0216 
0217 class valop_visitor {
0218 public:
0219   virtual ~valop_visitor() {}
0220 public:
0221   virtual bool binary(unsigned int,const valop&,const valop&) = 0;
0222   virtual bool unary(unsigned int,const valop&) = 0;
0223   virtual bool variable(unsigned int,const value&) = 0;
0224   virtual bool option(const valop&) = 0;
0225   virtual bool func_1(const valop&,const valop&) = 0;
0226   virtual bool func_2(const valop&,const valop&,const valop&) = 0;
0227   virtual bool func_3(const valop&,const valop&,const valop&,const valop&) = 0;
0228   virtual bool func_4(const valop&,const valop&,const valop&,
0229                                    const valop&,const valop&) = 0;
0230   virtual bool func_5(const valop&,const valop&,const valop&,
0231                                    const valop&,const valop&,const valop&) = 0;
0232   virtual bool func_6(const valop&,const valop&,const valop&,
0233                                    const valop&,const valop&,
0234                                    const valop&,const valop&) = 0;
0235 public:
0236   bool visit(const valop& a_valop) {
0237     switch(a_valop.m_type) {
0238     case valop::CMP_GT:
0239     case valop::CMP_GE:
0240     case valop::CMP_LT:
0241     case valop::CMP_LE:
0242     case valop::CMP_EQ:
0243     case valop::CMP_NE:
0244     case valop::CMP_AND:
0245     case valop::CMP_OR:
0246 
0247     case valop::ADD:
0248     case valop::MUL:
0249     case valop::SUB:
0250     case valop::DIV:
0251 
0252     case valop::ASIDE:
0253     case valop::NVMUL:
0254     case valop::EQUAL:
0255     case valop::SUPS:
0256     case valop::SUBS:
0257       if(!a_valop.m_A || !a_valop.m_B) break;
0258       return binary(a_valop.m_type,*a_valop.m_A,*a_valop.m_B);
0259 
0260     case valop::BOOL_TRUE:
0261     case valop::BOOL_FALSE:
0262     case valop::UNSIGNED_INTEGER:
0263     case valop::REAL:
0264     case valop::STRING:
0265     case valop::SYMBOL:
0266       return variable(a_valop.m_type,a_valop.m_variable);
0267     case valop::NAME:
0268       return option(a_valop);
0269     case valop::MINUS:
0270     case valop::NOT:
0271     case valop::ASSIGN:
0272       if(!a_valop.m_A) break;
0273       return unary(a_valop.m_type,*a_valop.m_A);
0274     case valop::FUNC:{
0275       if(!a_valop.m_A) break;
0276       if(!a_valop.m_function) {
0277         return false;
0278       }
0279       size_t argn = a_valop.m_function->number_of_arguments();
0280       if(argn==1) {
0281         return func_1(a_valop,*a_valop.m_A);
0282       } else if(argn==2) {
0283         if(!a_valop.m_B) break;
0284         return func_2(a_valop,*a_valop.m_A,*a_valop.m_B);
0285       } else if(argn==3) {
0286         if(!a_valop.m_B || !a_valop.m_C) break;
0287         return func_3(a_valop,*a_valop.m_A,*a_valop.m_B,*a_valop.m_C);
0288       } else if(argn==4) {
0289         if(!a_valop.m_B || !a_valop.m_C || !a_valop.m_D) break;
0290         return func_4(a_valop,*a_valop.m_A,*a_valop.m_B,*a_valop.m_C,*a_valop.m_D);
0291       } else if(argn==5) {
0292         if(!a_valop.m_B || !a_valop.m_C || !a_valop.m_D || !a_valop.m_E) break;
0293         return func_5(a_valop,*a_valop.m_A,*a_valop.m_B,*a_valop.m_C,*a_valop.m_D,*a_valop.m_E);
0294       } else if(argn==6) {
0295         if(!a_valop.m_B || !a_valop.m_C || !a_valop.m_D || !a_valop.m_E || !a_valop.m_F) break;
0296         return func_6(a_valop,*a_valop.m_A,*a_valop.m_B,*a_valop.m_C,*a_valop.m_D,*a_valop.m_E,*a_valop.m_F);
0297       } else {
0298         return false;
0299       }}
0300     default:
0301       break;
0302     }
0303     return false;
0304   }
0305 };
0306 
0307 }
0308 
0309 #endif