00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef TAO_CONSTRAINT_VISITOR_H
00015 #define TAO_CONSTRAINT_VISITOR_H
00016 #include "ace/pre.h"
00017
00018 #include "orbsvcs/Trader/Interpreter_Utils.h"
00019 #include "orbsvcs/Trader/trading_serv_export.h"
00020 #include "ace/Containers.h"
00021
00022 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00023
00024 class TAO_DynSequence_i;
00025
00026 class TAO_Constraint;
00027 class TAO_Unary_Constraint;
00028 class TAO_Binary_Constraint;
00029 class TAO_Literal_Constraint;
00030 class TAO_Property_Constraint;
00031 class TAO_Noop_Constraint;
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 class TAO_Trading_Serv_Export TAO_Constraint_Visitor
00051 {
00052 public:
00053
00054 virtual ~TAO_Constraint_Visitor (void) {}
00055
00056 virtual int visit_constraint (TAO_Unary_Constraint* constraint) = 0;
00057
00058 virtual int visit_with (TAO_Unary_Constraint* unary_with) = 0;
00059 virtual int visit_min (TAO_Unary_Constraint* unary_min) = 0;
00060 virtual int visit_max (TAO_Unary_Constraint* unary_max) = 0;
00061 virtual int visit_first (TAO_Noop_Constraint* noop_first) = 0;
00062 virtual int visit_random (TAO_Noop_Constraint* noop_random) = 0;
00063
00064 virtual int visit_and (TAO_Binary_Constraint* boolean_and) = 0;
00065 virtual int visit_or (TAO_Binary_Constraint* boolean_or) = 0;
00066 virtual int visit_not (TAO_Unary_Constraint* unary_not) = 0;
00067
00068 virtual int visit_exist (TAO_Unary_Constraint* unary_exist) = 0;
00069 virtual int visit_unary_minus (TAO_Unary_Constraint* unary_minus) = 0;
00070
00071 virtual int visit_add (TAO_Binary_Constraint* boolean_add) = 0;
00072 virtual int visit_sub (TAO_Binary_Constraint* boolean_sub) = 0;
00073 virtual int visit_mult (TAO_Binary_Constraint* boolean_mult) = 0;
00074 virtual int visit_div (TAO_Binary_Constraint* boolean_div) = 0;
00075
00076 virtual int visit_twiddle (TAO_Binary_Constraint* binary_twiddle) = 0;
00077 virtual int visit_in (TAO_Binary_Constraint* binary_in) = 0;
00078
00079 virtual int visit_less_than (TAO_Binary_Constraint* boolean_lt) = 0;
00080 virtual int visit_less_than_equal (TAO_Binary_Constraint* boolean_lte) = 0;
00081 virtual int visit_greater_than (TAO_Binary_Constraint* boolean_gt) = 0;
00082 virtual int visit_greater_than_equal (TAO_Binary_Constraint* boolean_gte) = 0;
00083 virtual int visit_equal (TAO_Binary_Constraint* boolean_eq) = 0;
00084 virtual int visit_not_equal (TAO_Binary_Constraint* boolean_neq) = 0;
00085
00086 virtual int visit_literal (TAO_Literal_Constraint* literal) = 0;
00087 virtual int visit_property (TAO_Property_Constraint* literal) = 0;
00088 };
00089
00090 TAO_END_VERSIONED_NAMESPACE_DECL
00091
00092 #include "orbsvcs/Trader/Constraint_Nodes.h"
00093
00094 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 class TAO_Trading_Serv_Export TAO_Constraint_Validator : public TAO_Constraint_Visitor
00117 {
00118 public:
00119
00120 TAO_Constraint_Validator (void);
00121
00122
00123 virtual ~TAO_Constraint_Validator (void);
00124
00125
00126
00127
00128
00129
00130 int validate (TAO_Constraint* root);
00131
00132
00133
00134 virtual int visit_constraint (TAO_Unary_Constraint* constraint);
00135
00136 virtual int visit_with (TAO_Unary_Constraint* unary_with);
00137 virtual int visit_min (TAO_Unary_Constraint* unary_min);
00138 virtual int visit_max (TAO_Unary_Constraint* unary_max);
00139 virtual int visit_first (TAO_Noop_Constraint* noop_first);
00140 virtual int visit_random (TAO_Noop_Constraint* noop_random);
00141
00142
00143 virtual int visit_and (TAO_Binary_Constraint* boolean_and);
00144 virtual int visit_or (TAO_Binary_Constraint* boolean_or);
00145
00146
00147 virtual int visit_not (TAO_Unary_Constraint* unary_not);
00148
00149
00150
00151 virtual int visit_exist (TAO_Unary_Constraint* unary_exist);
00152
00153
00154 virtual int visit_unary_minus (TAO_Unary_Constraint* unary_minus);
00155
00156
00157 virtual int visit_add (TAO_Binary_Constraint* boolean_add);
00158 virtual int visit_sub (TAO_Binary_Constraint* boolean_sub);
00159 virtual int visit_mult (TAO_Binary_Constraint* boolean_mult);
00160 virtual int visit_div (TAO_Binary_Constraint* boolean_div);
00161
00162
00163 virtual int visit_twiddle (TAO_Binary_Constraint* binary_twiddle);
00164
00165
00166
00167 virtual int visit_in (TAO_Binary_Constraint* binary_in);
00168
00169
00170 virtual int visit_less_than (TAO_Binary_Constraint* boolean_lt);
00171 virtual int visit_less_than_equal (TAO_Binary_Constraint* boolean_lte);
00172 virtual int visit_greater_than (TAO_Binary_Constraint* boolean_gt);
00173 virtual int visit_greater_than_equal (TAO_Binary_Constraint* boolean_gte);
00174 virtual int visit_equal (TAO_Binary_Constraint* boolean_eq);
00175 virtual int visit_not_equal (TAO_Binary_Constraint* boolean_neq);
00176
00177
00178 virtual int visit_literal (TAO_Literal_Constraint* literal);
00179 virtual int visit_property (TAO_Property_Constraint* literal);
00180
00181 protected:
00182
00183
00184
00185 TAO_Typecode_Table type_map_;
00186
00187 private:
00188
00189 CORBA::TypeCode* extract_type (TAO_Constraint* expr_type,
00190 TAO_Expression_Type& type);
00191
00192
00193
00194 int expr_returns_boolean (TAO_Expression_Type expr_type);
00195
00196
00197
00198 int expr_returns_number (TAO_Expression_Type expr_type);
00199
00200
00201
00202 int expr_returns_string (TAO_Expression_Type expr_type);
00203
00204 TAO_Constraint_Validator (const TAO_Constraint_Validator&);
00205 TAO_Constraint_Validator& operator= (const TAO_Constraint_Validator&);
00206 };
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 class TAO_Trading_Serv_Export TAO_Constraint_Evaluator : public TAO_Constraint_Visitor
00227 {
00228 public:
00229
00230
00231 TAO_Constraint_Evaluator (void);
00232
00233
00234
00235
00236
00237
00238
00239 CORBA::Boolean evaluate_constraint (TAO_Constraint* root);
00240
00241
00242
00243 int evaluate_preference (TAO_Constraint* root,
00244 TAO_Literal_Constraint& result);
00245
00246
00247
00248 virtual int visit_constraint (TAO_Unary_Constraint* constraint);
00249
00250 virtual int visit_with (TAO_Unary_Constraint* unary_with);
00251 virtual int visit_min (TAO_Unary_Constraint* unary_min);
00252 virtual int visit_max (TAO_Unary_Constraint* unary_max);
00253 virtual int visit_first (TAO_Noop_Constraint* noop_first);
00254 virtual int visit_random (TAO_Noop_Constraint* noop_random);
00255
00256
00257
00258
00259
00260
00261 virtual int visit_and (TAO_Binary_Constraint* boolean_and);
00262
00263
00264
00265
00266
00267
00268 virtual int visit_or (TAO_Binary_Constraint* boolean_or);
00269
00270
00271 virtual int visit_not (TAO_Unary_Constraint* unary_not);
00272
00273
00274
00275 virtual int visit_exist (TAO_Unary_Constraint* unary_exist);
00276
00277
00278 virtual int visit_unary_minus (TAO_Unary_Constraint* unary_minus);
00279
00280
00281 virtual int visit_add (TAO_Binary_Constraint* boolean_add);
00282
00283
00284 virtual int visit_sub (TAO_Binary_Constraint* boolean_sub);
00285
00286
00287 virtual int visit_mult (TAO_Binary_Constraint* boolean_mult);
00288
00289
00290 virtual int visit_div (TAO_Binary_Constraint* boolean_div);
00291
00292
00293 virtual int visit_twiddle (TAO_Binary_Constraint* binary_twiddle);
00294
00295
00296
00297 virtual int visit_in (TAO_Binary_Constraint* binary_in);
00298
00299
00300 virtual int visit_less_than (TAO_Binary_Constraint* boolean_lt);
00301 virtual int visit_less_than_equal (TAO_Binary_Constraint* boolean_lte);
00302 virtual int visit_greater_than (TAO_Binary_Constraint* boolean_gt);
00303 virtual int visit_greater_than_equal (TAO_Binary_Constraint* boolean_gte);
00304 virtual int visit_equal (TAO_Binary_Constraint* boolean_eq);
00305 virtual int visit_not_equal (TAO_Binary_Constraint* boolean_neq);
00306
00307
00308 virtual int visit_literal (TAO_Literal_Constraint* literal);
00309
00310
00311 virtual int visit_property (TAO_Property_Constraint* literal);
00312
00313 private:
00314
00315 class TAO_Trading_Serv_Export Operand_Queue :
00316 public ACE_Unbounded_Queue <TAO_Literal_Constraint>
00317
00318
00319
00320 {
00321 public:
00322
00323 Operand_Queue (void);
00324
00325
00326 TAO_Literal_Constraint& get_left_operand (void);
00327
00328
00329 TAO_Literal_Constraint& get_right_operand (void);
00330
00331
00332 TAO_Literal_Constraint& get_operand (void);
00333
00334
00335 void dequeue_operand (void);
00336 };
00337
00338
00339 void do_the_op (int operation);
00340
00341
00342 int visit_bin_op (TAO_Binary_Constraint* op, int operation);
00343
00344
00345
00346 CORBA::Boolean sequence_does_contain (CORBA::Any* sequence,
00347 TAO_Literal_Constraint& element);
00348
00349
00350 TAO_Constraint_Evaluator (const TAO_Constraint_Evaluator&);
00351 TAO_Constraint_Evaluator& operator= (const TAO_Constraint_Evaluator&);
00352
00353 protected:
00354
00355
00356 TAO_Lookup_Table props_;
00357
00358
00359 Operand_Queue queue_;
00360 };
00361
00362
00363 template <class ELEMENT_TYPE> class TAO_Element_Equal;
00364
00365 template<>
00366 class TAO_Element_Equal<CORBA::Short>
00367 {
00368 public:
00369
00370
00371 int operator () (TAO_DynSequence_i& dyn_any,
00372 CORBA::Short element) const;
00373 };
00374
00375 template<>
00376 class TAO_Element_Equal<CORBA::UShort>
00377 {
00378 public:
00379
00380
00381 int operator () (TAO_DynSequence_i& dyn_any,
00382 CORBA::UShort element) const;
00383 };
00384
00385 template<>
00386 class TAO_Element_Equal<CORBA::Long>
00387 {
00388 public:
00389
00390
00391 int operator () (TAO_DynSequence_i& dyn_any,
00392 CORBA::Long element) const;
00393 };
00394
00395 template<>
00396 class TAO_Element_Equal<CORBA::ULong>
00397 {
00398 public:
00399
00400
00401 int operator () (TAO_DynSequence_i& dyn_any,
00402 CORBA::ULong element) const;
00403
00404 };
00405
00406 template<>
00407 class TAO_Element_Equal<CORBA::Float>
00408 {
00409 public:
00410
00411
00412 int operator () (TAO_DynSequence_i& dyn_any,
00413 CORBA::Float element) const;
00414 };
00415
00416 template<>
00417 class TAO_Element_Equal<CORBA::Double>
00418 {
00419 public:
00420
00421
00422 int operator () (TAO_DynSequence_i& dyn_any,
00423 CORBA::Double element) const;
00424 };
00425
00426 template<>
00427 class TAO_Element_Equal<CORBA::Boolean>
00428 {
00429 public:
00430
00431
00432 int operator () (TAO_DynSequence_i& dyn_any,
00433 CORBA::Boolean element) const;
00434 };
00435
00436 template<>
00437 class TAO_Element_Equal<const char*>
00438 {
00439 public:
00440
00441
00442 int operator () (TAO_DynSequence_i& dyn_any,
00443 const char* element) const;
00444 };
00445
00446 TAO_END_VERSIONED_NAMESPACE_DECL
00447
00448 #include "ace/post.h"
00449 #endif