00001
00012 #ifndef DIVINE_SYSTEM_TRANS_HH
00013 #define DIVINE_SYSTEM_TRANS_HH
00014
00015 #ifndef DOXYGEN_PROCESSING
00016 #include "system/transition.hh"
00017 #include "system/explicit_system.hh"
00018 #include "common/array_of_abstract.hh"
00019
00020 namespace divine {
00021 using std::cerr; using std::endl;
00022 #endif //DOXYGEN_PROCESSING
00023
00024 class explicit_system_t;
00025
00027
00036 class system_trans_t
00037 {
00038 public:
00040 system_trans_t() {}
00042 virtual ~system_trans_t() {}
00044
00045 virtual system_trans_t & operator=(const system_trans_t & second) = 0;
00047 virtual std::string to_string() const = 0;
00050 virtual void write(std::ostream & ostr) const = 0;
00051
00057
00058 virtual void set_count(const size_int_t new_count) = 0;
00061 virtual size_int_t get_count() const = 0;
00063 virtual transition_t *& operator[](const int i) = 0;
00065 virtual transition_t * const & operator[](const int i) const = 0;
00066
00067 };
00068
00070
00078 class enabled_trans_t: public virtual system_trans_t
00079 {
00080 private:
00081 bool error;
00082
00083 public:
00085 enabled_trans_t() { error = false; }
00087 virtual enabled_trans_t & operator=(const enabled_trans_t & second) = 0;
00089 void set_erroneous(const bool is_errorneous) { error = is_errorneous; }
00091 bool get_erroneous() const { return error; }
00092 };
00093
00094
00095
00096
00097 enabled_trans_t * system_new_enabled_trans(const void * params);
00098
00100
00113 class enabled_trans_container_t: public array_of_abstract_t<enabled_trans_t, system_new_enabled_trans>
00114 {
00115 private:
00116 size_int_t property_succ_count;
00117 size_int_t * trans_bounds;
00118
00119 public:
00121 enabled_trans_container_t(const explicit_system_t & system);
00123 ~enabled_trans_container_t();
00125
00126
00127
00128
00129
00130
00131 void set_next_begin(const size_int_t process_gid,
00132 const size_int_t next_begin)
00133 { trans_bounds[process_gid+1] = next_begin; }
00136 size_int_t get_begin(const size_int_t process_gid) const
00137 { return trans_bounds[process_gid]; }
00139 size_int_t get_count(const size_int_t process_gid) const
00140 { return (get_begin(process_gid+1)-get_begin(process_gid)); }
00142
00143 enabled_trans_t * get_enabled_transition
00144 (const size_int_t process_gid, const size_int_t index)
00145 { return &(*this)[get_begin(process_gid)+index]; }
00147
00148 const enabled_trans_t * get_enabled_transition
00149 (const size_int_t process_gid, const size_int_t index) const
00150 { return &(*this)[get_begin(process_gid)+index]; }
00152 void clear()
00153 { array_of_abstract_t<enabled_trans_t, system_new_enabled_trans>::clear();
00154 property_succ_count = 0; }
00156 void set_property_succ_count(const size_int_t count)
00157 { property_succ_count = count; }
00159 size_int_t get_property_succ_count() const { return property_succ_count; }
00160 };
00161
00162 #ifndef DOXYGEN_PROCESSING
00163 }
00164
00165 #endif //DOXYGEN_PROCESSING
00166
00167 #endif
00168