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