00001
00011 #ifndef DIVINE_EXPLICIT_SYSTEM_HH
00012 #define DIVINE_EXPLICIT_SYSTEM_HH
00013
00014 #ifndef DOXYGEN_PROCESSING
00015 #include "system/system.hh"
00016 #include "system/state.hh"
00017 #include "system/system_trans.hh"
00018 #include "system/expression.hh"
00019 #include "common/types.hh"
00020 #include "common/deb.hh"
00021
00022 namespace divine {
00023 using std::cerr; using std::endl;
00024 #endif //DOXYGEN_PROCESSING
00025
00026 class succ_container_t;
00027 class enabled_trans_container_t;
00028 class system_trans_t;
00029 class enabled_trans_t;
00030
00031
00035 const int SUCC_NORMAL = 0;
00039 const int SUCC_ERROR = 1;
00043 const int SUCC_DEADLOCK = 2;
00044
00045
00047
00053 inline bool succs_normal(const int succs_result)
00054 { return (succs_result == SUCC_NORMAL); }
00055
00057
00065 inline bool succs_error(const int succs_result)
00066 { return ((succs_result | SUCC_ERROR) == succs_result); }
00067
00069
00077 inline bool succs_deadlock(const int succs_result)
00078 { return ((succs_result | SUCC_DEADLOCK) == succs_result); }
00079
00082
00090 class explicit_system_t: public virtual system_t
00091 {
00092
00093 public:
00094
00095
00096
00098
00099 explicit_system_t(error_vector_t & evect):system_t(evect) { }
00100
00102 virtual ~explicit_system_t() {};
00103
00108
00109
00116 virtual bool is_erroneous(state_t state) = 0;
00117
00122
00130 virtual bool is_accepting(state_t state, size_int_t acc_group=0, size_int_t pair_member=1) = 0;
00131
00133
00135 virtual bool violates_assertion(const state_t state) const = 0;
00136
00138
00140 virtual size_int_t violated_assertion_count(const state_t state) const = 0;
00141
00144
00146 virtual std::string violated_assertion_string(const state_t state,
00147 const size_int_t index) const = 0;
00148
00150
00153 virtual size_int_t get_preallocation_count() const = 0;
00154
00156 virtual void print_state(state_t state, std::ostream & outs = std::cout) = 0;
00157
00159
00161 virtual state_t get_initial_state() = 0;
00162
00164
00173 virtual int get_succs(state_t state, succ_container_t & succs) = 0;
00174
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 virtual int get_ith_succ(state_t state, const int i, state_t & succ) = 0;
00188
00189
00190 bool can_system_transitions()
00191 { return get_abilities().explicit_system_can_system_transitions; }
00192
00193
00198
00199
00213 virtual int get_succs(state_t state, succ_container_t & succs,
00214 enabled_trans_container_t & etc) = 0;
00215
00217
00228 virtual int get_enabled_trans(const state_t state,
00229 enabled_trans_container_t & enb_trans) = 0;
00230
00232
00244 virtual int get_enabled_trans_count(const state_t state, size_int_t & count)
00245 = 0;
00246
00248
00259 virtual int get_enabled_ith_trans(const state_t state,
00260 const size_int_t i,
00261 enabled_trans_t & enb_trans) = 0;
00262
00264
00270 virtual bool get_enabled_trans_succ
00271 (const state_t state, const enabled_trans_t & enabled,
00272 state_t & new_state) = 0;
00273
00276
00283 virtual bool get_enabled_trans_succs
00284 (const state_t state, succ_container_t & succs,
00285 const enabled_trans_container_t & enabled_trans) = 0;
00286
00288
00304 virtual enabled_trans_t * new_enabled_trans() const = 0;
00305
00308
00309
00310 bool can_evaluate_expressions()
00311 { return get_abilities().explicit_system_can_evaluate_expressions; }
00312
00317
00318
00326 virtual bool eval_expr(const expression_t * const expr,
00327 const state_t state,
00328 data_t & data) const = 0;
00331 };
00332
00334
00339 class succ_container_t: public array_t<state_t>
00340 {
00341 public:
00344 succ_container_t(): array_t<state_t>(4096, 16) {}
00347 succ_container_t(const explicit_system_t & system):
00348 array_t<state_t>(system.get_preallocation_count(), 16) {}
00350 ~succ_container_t() { DEBFUNC(cerr << "Destructing succ_container_t" << endl;)}
00351 };
00352
00353
00354 #ifndef DOXYGEN_PROCESSING
00355 }
00356 #include "common/undeb.hh"
00357
00358 #endif //DOXYGEN_PROCESSING
00359
00360 #endif