From eef0e9c1ce21851d56b58043295408adaa7d4c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Giann=20Karlo=20Aguirre=20Sambon=C3=AD?= <giannkas1@gmail.com> Date: Fri, 16 Nov 2018 22:43:58 +0100 Subject: [PATCH] Adding and removing states and transitions implemented --- src/adt2amas.cpp | 26 ++++++++++--- src/amas/action.hpp | 2 + src/amas/automata.cpp | 19 ++++++++-- src/amas/automata.hpp | 5 ++- src/amas/automaton.cpp | 63 +++++++++++++++++++++---------- src/amas/automaton.hpp | 6 +-- src/amas/channel.cpp | 9 ++++- src/amas/channel.hpp | 3 +- src/amas/label.cpp | 4 ++ src/amas/label.hpp | 1 + src/amas/state.cpp | 28 +++++++++++++- src/amas/state.hpp | 1 + src/amas/synchronization.cpp | 4 ++ src/amas/synchronization.hpp | 1 + src/amas/synchronization_type.cpp | 4 +- src/amas/transition.cpp | 7 +++- src/amas/transition.hpp | 1 + 17 files changed, 143 insertions(+), 41 deletions(-) diff --git a/src/adt2amas.cpp b/src/adt2amas.cpp index 14888af..2b6c5e8 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 24b0447..f4c6558 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 fc1bbbc..04efaee 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 6609f75..e01e3cb 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 4d481bd..c037925 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 fd823ff..4113f44 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 f57c3b8..cf4e9a8 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 e5ec8fd..6a66ea2 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 8d8459f..e819d43 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 fd2e3f1..06ee5a8 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 f368dc5..ed9c862 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 78b0a54..58146c7 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 ed2cfd0..2faaccc 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 726d9f2..d3ba123 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 67935dd..76623c2 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 ac3072e..3cf94c9 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 3797407..3b8df79 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 */ -- GitLab