00001
00003 #ifndef DIVINE_PATH_HH
00004 #define DIVINE_PATH_HH
00005
00006 #ifndef DOXYGEN_PROCESSING
00007 #include <deque>
00008 #include "system/state.hh"
00009 #include "system/explicit_system.hh"
00010
00011 namespace divine {
00012 #endif //DOXYGEN_PROCESSING
00013
00022 #define PATH_CYCLE_SEPARATOR "================"
00023
00024 class path_t {
00025 private:
00026 std::deque<state_t> s_list;
00027 explicit_system_t* System;
00028 int cycle_start_index;
00029
00030 public:
00032
00033 path_t(explicit_system_t* S = 0) { System = S; cycle_start_index = -1;}
00035 ~path_t() { state_t s; while (!s_list.empty()) {s = s_list.front(); s_list.pop_front(); delete_state(s); }}
00037 void set_system(explicit_system_t* S) { System = S; }
00039 void erase() {state_t s; while (!s_list.empty()) {s = s_list.front(); s_list.pop_front(); delete_state(s); } cycle_start_index= -1;}
00040
00043 void push_front(state_t s) { state_t t = duplicate_state(s); s_list.push_front(t); if (cycle_start_index != -1) cycle_start_index++;}
00044
00047 void push_back(state_t s) { state_t t = duplicate_state(s); s_list.push_back(t); }
00048
00051 void mark_cycle_start_front() { cycle_start_index = 0;}
00052
00055 void mark_cycle_start_back() { cycle_start_index = s_list.size() -1;}
00056
00059 void write_trans(std::ostream & out = std::cout);
00060
00063 void write_states(std::ostream & out = std::cout);
00064
00067 int length() {return s_list.size(); }
00068
00071 std::deque<state_t>* get_state_list() { return &s_list; }
00072
00075 int get_cycle_start_index() { return cycle_start_index; }
00076 };
00077
00078 #ifndef DOXYGEN_PROCESSING
00079 }
00080 #endif //DOXYGEN_PROCESSING
00081
00082
00083 #endif