diff --git a/src/adt2amas.cpp b/src/adt2amas.cpp index 14888affed1f19c32e87a21ae2d21ffdf180537d..2b6c5e8b636ccd5e0a2c3d69cf8ca49322e6052e 100644 --- a/src/adt2amas.cpp +++ b/src/adt2amas.cpp @@ -43,9 +43,7 @@ int main(){ Label *label_one = new Label("TS"); - //Adding states - amaton_one->add_state(state_zero); amaton_one->add_state(state_one); amaton_one->add_state(state_two); amaton_one->add_state(state_three); @@ -58,15 +56,33 @@ int main(){ amaton_one->add_transition(state_two, state_three, label_one); amaton_one->add_transition(state_three, state_three, synchronization_five); amaton_one->add_transition(state_zero, state_four, synchronization_three); - amaton_one->add_transition(state_zero, state_three, synchronization_four); + amaton_one->add_transition(state_zero, state_four, synchronization_four); amaton_one->add_transition(state_four, state_four, synchronization_six); + //Adding channels + amata->add_channel(channel_one); + amata->add_channel(channel_two); + amata->add_channel(channel_three); + amata->add_channel(channel_four); + amata->add_channel(channel_five); + amata->add_channel(channel_six); + + //Adding automaton + amata->add_automaton(amaton_one); + + + cout << amata->get_info(); - StateType stateTest{StateType::Normal}; + //Removing... + cout << "Removing..." << endl; + amaton_one->remove_state(state_four); + //amaton_one->remove_transition(7); + cout << amata->get_info(); + /* StateType stateTest{StateType::Normal}; cout << "state type = " << static_cast<int>(stateTest) << endl; SynchronizationType synchronizationTest{SynchronizationType::Receive}; - cout << "synchronization type = " << static_cast<int>(synchronizationTest) << endl; + cout << "synchronization type = " << static_cast<int>(synchronizationTest) << endl; */ return 0; } diff --git a/src/amas/action.hpp b/src/amas/action.hpp index 24b0447c54041b876a1d19381c7a65919fd9aa8c..f4c65587360b445d44b9fd1d6bfc73ea63c8bd23 100644 --- a/src/amas/action.hpp +++ b/src/amas/action.hpp @@ -10,6 +10,8 @@ class Action public: Action(); ~Action(); + + virtual string get_info() = 0; }; #endif \ No newline at end of file diff --git a/src/amas/automata.cpp b/src/amas/automata.cpp index fc1bbbc27a54b2ae5fb170e0ddc5158c48be4d24..04efaeef203ee0c3bc74a71727318ab55ede1a03 100644 --- a/src/amas/automata.cpp +++ b/src/amas/automata.cpp @@ -14,7 +14,18 @@ set<int> Automata::get_automaton_ids(){ } vector<Channel*> Automata::get_channels(){ - return this->vector_channels_; + return this->channels_; +} + +string Automata::get_info(){ + string info_amata = ""; + for(auto& i : this->vector_automaton_){ + info_amata += i->get_info() + "\n"; + } + for(auto& i : this->channels_){ + info_amata += i->get_info() + "\n"; + } + return info_amata; } /* Sets */ @@ -26,8 +37,8 @@ void Automata::set_automaton_ids(set<int> automaton_ids){ this->automaton_ids_ = automaton_ids; } -void Automata::set_channels(vector<Channel*> vector_channels){ - this->vector_channels_ = vector_channels; +void Automata::set_channels(vector<Channel*> channels){ + this->channels_ = channels; } /* Other methods */ @@ -43,7 +54,7 @@ void Automata::add_channel(Channel *new_channel){ auto channel_in_automata = this->channel_ids_.find(new_channel->get_id()) == this->channel_ids_.end(); assert(("channel can't be in the automata to allow their addition", channel_in_automata)); this->channel_ids_.insert(new_channel->get_id()); - this->vector_channels_.push_back(new_channel); + this->channels_.push_back(new_channel); } // Removing... diff --git a/src/amas/automata.hpp b/src/amas/automata.hpp index 6609f7596497161fe8fddbfb5addeec20716070d..e01e3cb2725863e355bb2e0816eafe8a1866803e 100644 --- a/src/amas/automata.hpp +++ b/src/amas/automata.hpp @@ -11,7 +11,7 @@ class Automata set<int> automaton_ids_; set<int> channel_ids_; vector<Automaton*> vector_automaton_; - vector<Channel*> vector_channels_; + vector<Channel*> channels_; public: Automata(); ~Automata(); @@ -20,11 +20,12 @@ class Automata vector<Automaton*> get_vector_automaton(); set<int> get_automaton_ids(); vector<Channel*> get_channels(); + string get_info(); /* Sets */ void set_vector_automaton(vector<Automaton*> vector_automaton); void set_automaton_ids(set<int> automaton_ids); - void set_channels(vector<Channel*> vector_channels); + void set_channels(vector<Channel*> channels); /*Other methods */ void add_automaton(Automaton *new_automaton); diff --git a/src/amas/automaton.cpp b/src/amas/automaton.cpp index 4d481bd5670872c6a6d291ea40b212ab4017407a..c037925e0a0fbed358d4d717cabb2b9efc7e846c 100644 --- a/src/amas/automaton.cpp +++ b/src/amas/automaton.cpp @@ -1,9 +1,12 @@ #include "automaton.hpp" Automaton::Automaton(State* initial_state): initial_state_(initial_state){ + auto correct_type = initial_state->get_state_type() == StateType::Initial; + assert(("Incorrect type for the parameter initial_state, must be Initial type", correct_type)); ++current_id; id = current_id; - vector_states_.push_back(initial_state); + this->state_ids_.insert(initial_state->get_id()); + this->states_.push_back(initial_state); } Automaton::~Automaton(){} @@ -27,11 +30,20 @@ set<int> Automaton::get_state_ids(){ } vector<State*> Automaton::get_states(){ - return this->vector_states_; + return this->states_; } vector<Transition*> Automaton::get_transitions(){ - return this->vector_transitions_; + return this->transitions_; +} + +string Automaton::get_info(){ + string info_amaton = "Automaton " + to_string(this->id) + ":\n"; + for(auto& i : this->states_){ + info_amaton += "\t" + i->get_info(2); + info_amaton += i != this->states_.back() ? "\n" : ""; + } + return info_amaton; } /* Sets */ @@ -40,8 +52,10 @@ void Automaton::set_initial_state(State* initial_state){ State *tmp_state = new State; tmp_state = this->initial_state_; this->initial_state_ = initial_state; - remove_state(tmp_state); - vector_states_.push_back(initial_state); + tmp_state->set_state_type(StateType::Normal); + this->initial_state_->set_state_type(StateType::Initial); + this->state_ids_.insert(initial_state->get_id()); + this->states_.push_back(initial_state); } void Automaton::set_transition_ids(set<int> transition_ids){ @@ -53,11 +67,11 @@ void Automaton::set_state_ids(set<int> state_ids){ } void Automaton::set_states(vector<State*> vector_states){ - this->vector_states_ = vector_states; + this->states_ = vector_states; } void Automaton::set_transitions(vector<Transition*> vector_transitions){ - this->vector_transitions_ = vector_transitions; + this->transitions_ = vector_transitions; } int Automaton::current_id = 0; @@ -82,21 +96,32 @@ void Automaton::add_transition(State *source_state, State *destination_state, Ac destination_state->set_transitions(tmp_transitions); this->transition_ids_.insert(new_transition->get_id()); - this->vector_transitions_.push_back(new_transition); + this->transitions_.push_back(new_transition); } void Automaton::add_state(State *new_state){ auto state_in_automaton = this->state_ids_.find(new_state->get_id()) == this->state_ids_.end(); assert(("state can't be added to the automaton because it exists already", state_in_automaton)); this->state_ids_.insert(new_state->get_id()); - this->vector_states_.push_back(new_state); + this->states_.push_back(new_state); } // Removing... +void Automaton::remove_transition(int transition_id){ + auto transition_in_automaton = this->transition_ids_.find(transition_id) != this->transition_ids_.end(); + assert(("transition can't be removed since it doesn't belong to this automaton", transition_in_automaton)); + auto it = this->transitions_.begin(); + for(; it != this->transitions_.end() && (*it)->get_id() != transition_id; it++){} + remove_transition(*it); +} void Automaton::remove_transition(Transition *cur_transition){ auto transition_in_automaton = this->transition_ids_.find(cur_transition->get_id()) != this->transition_ids_.end(); assert(("transition can't be removed since it doesn't belong to this automaton", transition_in_automaton)); + bool more_transitions_initial_state = 1; + if (cur_transition->get_source_state() == this->initial_state_ || cur_transition->get_destination_state() == this->initial_state_) + more_transitions_initial_state = this->initial_state_->get_transitions().size() >= 1; + assert(("You can't remove this transition since it is the unique transition associated with the initial state", more_transitions_initial_state)); vector<Transition*> tmp_transitions = cur_transition->get_source_state()->get_transitions(); auto it = tmp_transitions.begin(); @@ -110,11 +135,10 @@ void Automaton::remove_transition(Transition *cur_transition){ it = tmp_transitions.erase(it); cur_transition->get_destination_state()->set_transitions(tmp_transitions); - it = this->vector_transitions_.begin(); - for(; it != this->vector_transitions_.end() && (*it)->get_id() != cur_transition->get_id(); it++){} - it = this->vector_transitions_.erase(it); + it = this->transitions_.begin(); + for(; it != this->transitions_.end() && (*it)->get_id() != cur_transition->get_id(); it++){} + it = this->transitions_.erase(it); this->transition_ids_.erase(cur_transition->get_id()); - delete cur_transition; } @@ -124,12 +148,13 @@ void Automaton::remove_state(State *cur_state){ auto no_initial_state = cur_state->get_id() != this->initial_state_->get_id(); assert(("you can't remove their automaton initial state before replace it", no_initial_state)); - vector<Transition*> tmp_transitions = cur_state->get_transitions(); - tmp_transitions.clear(); - cur_state->set_transitions(tmp_transitions); + + for(int i = 0; i < cur_state->get_transitions().size(); i++){ + remove_transition(cur_state->get_transitions()[i]); + } - auto it = this->vector_states_.begin(); - for(; it != this->vector_states_.end() && (*it)->get_id() != cur_state->get_id(); it++){} - it = this->vector_states_.erase(it); + auto it = this->states_.begin(); + for(; it != this->states_.end() && (*it)->get_id() != cur_state->get_id(); it++){} + it = this->states_.erase(it); this->state_ids_.erase(cur_state->get_id()); } diff --git a/src/amas/automaton.hpp b/src/amas/automaton.hpp index fd823ff4797226d4474c6a8b530b4f9172c41295..4113f44951ab1b6ff9e6f9a2cdf8a94308610e32 100644 --- a/src/amas/automaton.hpp +++ b/src/amas/automaton.hpp @@ -12,8 +12,8 @@ class Automaton State *initial_state_; set<int> state_ids_; set<int> transition_ids_; - vector<State*> vector_states_; - vector<Transition*> vector_transitions_; + vector<State*> states_; + vector<Transition*> transitions_; public: Automaton(State *initial_state); @@ -28,7 +28,6 @@ class Automaton vector<Transition*> get_transitions(); string get_info(); - /* Sets */ void set_initial_state(State *initial_state); void set_state_ids(set<int> state_ids); @@ -43,6 +42,7 @@ class Automaton void add_state(State *new_state); // Removing... void remove_transition(Transition *cur_transition); + void remove_transition(int transition_id); void remove_state(State *cur_state); }; diff --git a/src/amas/channel.cpp b/src/amas/channel.cpp index f57c3b868fc8b0b5b1dae03c8ee609ec73f8d5c6..cf4e9a81605ca873fde2928240a0a56e8e6c0172 100644 --- a/src/amas/channel.cpp +++ b/src/amas/channel.cpp @@ -1,6 +1,9 @@ #include "channel.hpp" -Channel::Channel(string name): name_(name){} +Channel::Channel(string name): name_(name){ + ++current_id; + id = current_id; +} Channel::~Channel(){} @@ -14,6 +17,10 @@ string Channel::get_name(){ return this->name_; } +string Channel::get_info(){ + string info_ch = "Channel " + to_string(this->id) + ": " + this->name_; + return info_ch; +} /* Sets */ void Channel::set_name(string name){ diff --git a/src/amas/channel.hpp b/src/amas/channel.hpp index e5ec8fdb4e39f4634448eb0cc38ccf963f749b1a..6a66ea2d6684a6ed4e969c64c7d8f7d6aff24434 100644 --- a/src/amas/channel.hpp +++ b/src/amas/channel.hpp @@ -19,7 +19,8 @@ class Channel int get_id(); string get_name(); - + string get_info(); + /* Sets */ void set_name(string name); diff --git a/src/amas/label.cpp b/src/amas/label.cpp index 8d8459f9210e84ba2a8a105b392428c25914c6c2..e819d4359f3ca942d7c786427ad8d0c5b5098738 100644 --- a/src/amas/label.cpp +++ b/src/amas/label.cpp @@ -10,6 +10,10 @@ string Label::get_name(){ return this->name_; } +string Label::get_info(){ + return this->name_; +} + /* Sets */ void Label::set_name(string name){ diff --git a/src/amas/label.hpp b/src/amas/label.hpp index fd2e3f1ef064e7c3ea4498e490475fd4ede253e7..06ee5a88ceee171742be59ac235ba16e331af27c 100644 --- a/src/amas/label.hpp +++ b/src/amas/label.hpp @@ -14,6 +14,7 @@ class Label: public Action /* Gets */ string get_name(); + string get_info(); /* Sets */ diff --git a/src/amas/state.cpp b/src/amas/state.cpp index f368dc52a3e9c134ed5203e311b17464ce6f521f..ed9c8621d4e422307775450ec59093e9e7aedb05 100644 --- a/src/amas/state.cpp +++ b/src/amas/state.cpp @@ -22,9 +22,33 @@ vector<Transition*> State::get_transitions(){ return this->transitions_; } +string State::get_info(int tabs){ + string tmp_info_transition; + string info_state = "State " + to_string(this->id) + " (" + to_string(this->state_type_) + "):\n"; + tmp_info_transition.insert(0, tabs, '\t'); + int j = 1; + for(auto& i : this->transitions_){ + info_state += tmp_info_transition + i->get_info(); + if (j == this->transitions_.size()) + info_state += ""; + else + info_state += "\n"; + j++; + } + return info_state; +} + string State::get_info(){ - string info_state = to_string(this->id); - info_state += "(" + to_string(this->state_type_) + ")"; + string info_state = "State " + to_string(this->id) + " (" + to_string(this->state_type_) + "):\n"; + int j = 1; + for(auto& i : this->transitions_){ + info_state += "\t" + i->get_info(); + if (j == this->transitions_.size()) + info_state += ""; + else + info_state += "\n"; + j++; + } return info_state; } diff --git a/src/amas/state.hpp b/src/amas/state.hpp index 78b0a54d3249b8eee39e1250192a1dd469495388..58146c7900642b2ebb1e2ea151ada3beff3f1583 100644 --- a/src/amas/state.hpp +++ b/src/amas/state.hpp @@ -26,6 +26,7 @@ class State StateType get_state_type(); vector<Transition*> get_transitions(); + string get_info(int tabs); string get_info(); /* Sets */ diff --git a/src/amas/synchronization.cpp b/src/amas/synchronization.cpp index ed2cfd06e4bc1f051c7b9cef6436377a7fc4fdd3..2faaccc7f4945beb86565561799a9fb98ee55334 100644 --- a/src/amas/synchronization.cpp +++ b/src/amas/synchronization.cpp @@ -14,6 +14,10 @@ Channel* Synchronization::get_channel(){ return this->channel_; } +string Synchronization::get_info(){ + string info_sync = to_string(this->synchronization_type_) + this->channel_->get_name(); + return info_sync; +} /* Sets */ void Synchronization::set_synchronization_type(SynchronizationType synchronization_type){ diff --git a/src/amas/synchronization.hpp b/src/amas/synchronization.hpp index 726d9f2363f6f8d7d3f574e58b5ba0969cf1f0e6..d3ba123ff9e27ec7ba015400aa5cdca9a90c1043 100644 --- a/src/amas/synchronization.hpp +++ b/src/amas/synchronization.hpp @@ -21,6 +21,7 @@ class Synchronization: public Action int get_synchronization_type(); Channel* get_channel(); + string get_info(); /* Sets */ diff --git a/src/amas/synchronization_type.cpp b/src/amas/synchronization_type.cpp index 67935dd96d1972f9d75be57559e56ac3a3cc8343..76623c2ad60aefb04e1e4482e3fc96937e93ca55 100644 --- a/src/amas/synchronization_type.cpp +++ b/src/amas/synchronization_type.cpp @@ -6,10 +6,10 @@ string to_string(SynchronizationType sh){ switch (sh) { case SynchronizationType::Send: - sh_ = "Send"; + sh_ = "!"; break; case SynchronizationType::Receive: - sh_ = "Receive"; + sh_ = "?"; break; default: break; diff --git a/src/amas/transition.cpp b/src/amas/transition.cpp index ac3072e69d341991e5c6f2df6694f4721fa9e746..3cf94c9a4487817f177795a2b03752e268a5aeeb 100644 --- a/src/amas/transition.cpp +++ b/src/amas/transition.cpp @@ -7,8 +7,6 @@ Transition::Transition(State *source_state, State *destination_state, Action *ac } Transition::~Transition(){ - delete source_state_; - delete destination_state_; delete action_; } @@ -30,6 +28,11 @@ Action* Transition::get_action(){ return this->action_; } +string Transition::get_info(){ + string info_tran = "Transition " + to_string(this->get_id()) + " " + this->action_->get_info(); + return info_tran; +} + /* Sets */ void Transition::set_source_state(State *source_state){ diff --git a/src/amas/transition.hpp b/src/amas/transition.hpp index 37974079c55cee7d4ae86fdf80e88dd16174f554..3b8df79a5a3589ea30a634d6123bed3c56f707dc 100644 --- a/src/amas/transition.hpp +++ b/src/amas/transition.hpp @@ -30,6 +30,7 @@ class Transition State* get_source_state(); State* get_destination_state(); Action* get_action(); + string get_info(); /* Sets */