From 554c9765bf1c40135a0354ddd9155c05d9b90c52 Mon Sep 17 00:00:00 2001
From: chihebabid <chiheb.abid@fst.utm.tn>
Date: Sun, 3 Jul 2022 23:46:20 +0100
Subject: [PATCH] Refactoring to C++17

---
 src/algorithm/CNDFS.cpp  | 33 ++++++++++++++++-----------------
 src/algorithm/CNDFS.h    | 32 +++++++++++++++-----------------
 src/misc/SafeDequeue.cpp |  4 ++--
 src/misc/SafeDequeue.h   |  2 +-
 4 files changed, 34 insertions(+), 37 deletions(-)

diff --git a/src/algorithm/CNDFS.cpp b/src/algorithm/CNDFS.cpp
index 6786df6..b093999 100644
--- a/src/algorithm/CNDFS.cpp
+++ b/src/algorithm/CNDFS.cpp
@@ -49,7 +49,7 @@ void CNDFS::threadHandler(void *context) {
 
 //get initial state of the product automata
 void CNDFS::getInitialState(){
-    mInitStatePtr  = new _state; //static_cast<_state *>(malloc(sizeof(_state)));
+    mInitStatePtr  = new myState_t; //static_cast<_state *>(malloc(sizeof(_state)));
     mInitStatePtr->left = mMcl->getInitialMetaState();
     mInitStatePtr->right = mAa->get_init_state();
     //mInitStatePtr->new_successors = nullptr;
@@ -59,14 +59,13 @@ void CNDFS::getInitialState(){
 
 
 //this function is to build a state with list of successor initially null
-_state* CNDFS::buildState(LDDState* left, spot::state* right, bool acc, bool constructed, bool cyan){
+myState_t* CNDFS::buildState(LDDState* left, spot::state* right, bool acc, bool constructed, bool cyan){
     bool _cyan{false};
     mMutex.lock();
-    _state * buildStatePtr  = static_cast<_state *>(malloc(sizeof(_state)));
+    myState_t * buildStatePtr  = static_cast<myState_t *>(malloc(sizeof(myState_t)));
     _cyan = cyan;
     buildStatePtr->left = left;
     buildStatePtr->right = dynamic_cast<const spot::twa_graph_state *>(right);
-    buildStatePtr->new_successors =  static_cast<vector<pair<_state *, int>>>(NULL);
     buildStatePtr->isAcceptance = acc;
     buildStatePtr->isConstructed = constructed;
     buildStatePtr->cyan= _cyan;
@@ -74,7 +73,7 @@ _state* CNDFS::buildState(LDDState* left, spot::state* right, bool acc, bool con
     return buildStatePtr;
 }
 
-std::ostream & operator<<(std::ostream & Str,_state* state) {
+std::ostream & operator<<(std::ostream & Str,myState_t* state) {
      Str << "({ Sog state= " << state->left << ", BA state= " << state->right << ", acceptance= "  << state->isAcceptance <<  ", constructed= "  << state->isConstructed <<  ", cyan= "  << state->cyan << ", red= "  << state->red << ", blue= "  <<  state->blue <<  " }" << endl;
      int i = 0;
      for (auto ii : state->new_successors)
@@ -86,7 +85,7 @@ std::ostream & operator<<(std::ostream & Str,_state* state) {
 }
 
 //all visited accepting nodes (non seed, non red) should be red
-atomic_bool CNDFS::awaitCondition(_state* state,deque<_state*> localDeque)
+atomic_bool CNDFS::awaitCondition(myState_t* state,deque<myState_t*> localDeque)
 {
     vector<bool> localList ;
     for (auto qu: localDeque)
@@ -108,7 +107,7 @@ atomic_bool CNDFS::awaitCondition(_state* state,deque<_state*> localDeque)
 //    while ( awaitCondition(state) == false) ;
 //}
 
-void CNDFS::dfsRed(_state* state,deque<_state*> localDeque)
+void CNDFS::dfsRed(myState_t* state,deque<myState_t*> localDeque)
 {
     cout << "dfsRed" << endl;
     localDeque.push_back(state);
@@ -126,7 +125,7 @@ void CNDFS::dfsRed(_state* state,deque<_state*> localDeque)
 }
 
 //compute new successors of a product state
-void CNDFS::computeSuccessors(_state *state)
+void CNDFS::computeSuccessors(myState_t *state)
 {
     LDDState* sog_current_state = state->left;
     const spot::twa_graph_state* ba_current_state = state->right;
@@ -134,7 +133,7 @@ void CNDFS::computeSuccessors(_state *state)
     while (!sog_current_state->isCompletedSucc());
     auto p = mAa->get_dict(); //avoir le dictionnaire bdd,proposition atomique
     //fetch the state's atomic proposition
-    for (auto vv: sog_current_state->getMarkedPlaces(mMcl->getPlaceProposition()))
+    for (const auto & vv: sog_current_state->getMarkedPlaces(mMcl->getPlaceProposition()))
     {
         string name = string(mMcl->getPlace(vv));
         auto f = spot::formula::ap(name);
@@ -142,9 +141,9 @@ void CNDFS::computeSuccessors(_state *state)
         cv.notify_one();
     }
     //iterate over the successors of a current aggregate
-    for (int i = 0; i < sog_current_state->Successors.size(); i++)
+    for (const auto &elt : sog_current_state->Successors)
     {
-        int transition = sog_current_state->Successors.at(i).second; // je récupère le numéro du transition
+        int transition = elt.second; // je récupère le numéro du transition
         auto name = string(mMcl->getTransition(transition)); // récuprer le nom de la transition
         auto f = spot::formula::ap(name);// récuperer la proposition atomique qui correspond à la transition
         transitionNames.push(f); // push state'S AP to edge'S AP
@@ -169,13 +168,13 @@ void CNDFS::computeSuccessors(_state *state)
                             {
                                 //make a copy that we can iterate
 //                              SafeDequeue<myCouple> tempSharedPool = sharedPool;
-                                SafeDequeue<_state*> tempSharedPool = sharedPoolTemp;
+                                SafeDequeue<myState_t*> tempSharedPool = mSharedPoolTemp;
                                 while (!tempSharedPool.empty())
                                 {
                                    std::lock_guard<std::mutex> guard(mMutex);
 //                                    if ((tempSharedPool.front().first == sog_current_state->Successors.at(i).first) &&
 //                                      (tempSharedPool.front().second == const_cast<spot::state *>(ii->dst())))
-                                   if ((tempSharedPool.front()->left == sog_current_state->Successors.at(i).first) && (tempSharedPool.front()->right == const_cast<spot::state *>(ii->dst())))
+                                   if ((tempSharedPool.front()->left == elt.first) && (tempSharedPool.front()->right == const_cast<spot::state *>(ii->dst())))
                                     {
 //                                        nd->cyan = true;
                                         state->new_successors.push_back(make_pair(tempSharedPool.front(), transition));
@@ -183,7 +182,7 @@ void CNDFS::computeSuccessors(_state *state)
                                     {
                                         //new terminal state without successors
                                         //state_is_accepting() should only be called on automata with state-based acceptance
-                                        _state *nd = buildState(sog_current_state->Successors.at(i).first,
+                                        myState_t *nd = buildState(elt.first,
                                                                 const_cast<spot::state *>(ii->dst()),
                                                                 mAa->state_is_accepting(ii->dst()), true, false);
                                         state->new_successors.push_back(make_pair(nd, transition));
@@ -206,14 +205,14 @@ void CNDFS::computeSuccessors(_state *state)
 int i = 1;
 
 //Perform the dfsBlue
-void CNDFS::dfsBlue(_state *state) {
-    deque<_state*> localDeque;
+void CNDFS::dfsBlue(myState_t *state) {
+    deque<myState_t*> localDeque;
     uint16_t idThread = mIdThread++;
     cout<< "appel recursif " << i  << endl;
     i++;
     state->cyan = true;
 //    sharedPool.push(myCouple (state->left,state->right));
-    sharedPoolTemp.push(state);
+    mSharedPoolTemp.push(state);
     cv.notify_one();
 //    new_successor.push(coupleSuccessor(state,2));
     computeSuccessors(state);
diff --git a/src/algorithm/CNDFS.h b/src/algorithm/CNDFS.h
index f4b189c..32b5b22 100644
--- a/src/algorithm/CNDFS.h
+++ b/src/algorithm/CNDFS.h
@@ -14,19 +14,18 @@
 #include "misc/SafeDequeue.h"
 
 using namespace std ;
-typedef pair<struct myState*, int> coupleSuccessor;
+typedef pair<struct myState_t*, int> coupleSuccessor;
 
-struct myState{
+struct myState_t {
     LDDState *left;
     const spot::twa_graph_state* right;
-    vector<pair<struct myState*, int>> new_successors;
-    atomic<bool> isAcceptance {false};
-    atomic<bool> isConstructed {false};
+    vector<pair<struct myState_t*, int>> new_successors;
+    bool isAcceptance {false};
+    bool isConstructed {false};
     bool cyan {false};
     atomic<bool> blue {false};
     atomic<bool> red {false};
 };
-typedef struct myState _state; // @alias
 
 class CNDFS {
 private:
@@ -39,25 +38,24 @@ private:
     mutex mMutex;
     condition_variable cv;
     void spawnThreads();
-    _state * mInitStatePtr;
+    myState_t * mInitStatePtr;
+    SafeDequeue<struct myState_t*> mSharedPoolTemp;
+    static spot::bdd_dict_ptr* m_dict_ptr;
     void getInitialState();
     static void threadHandler(void *context);
 public:
-
-//    typedef myState _state;
-     SafeDequeue<struct myState*> sharedPoolTemp;
 //    SafeDequeue<myCouple> sharedPool;
      SafeDequeue<spot::formula> transitionNames;
      SafeDequeue<coupleSuccessor> new_successor;
     CNDFS(ModelCheckBaseMT *mcl,const spot::twa_graph_ptr &af,const uint16_t& nbTh);
     virtual ~CNDFS();
-    void computeSuccessors(_state *state);
-    void dfsBlue(_state *state);
-    void dfsRed(_state* state, deque<_state*> mydeque);
-    void WaitForTestCompleted(_state* state);
-    atomic_bool awaitCondition(_state* state,deque<_state*> mydeque);
-    _state* buildState(LDDState* left, spot::state* right, bool acc, bool constructed,bool cyan);
-    static spot::bdd_dict_ptr* m_dict_ptr;
+    void computeSuccessors(myState_t *state);
+    void dfsBlue(myState_t *state);
+    void dfsRed(myState_t* state, deque<myState_t*> mydeque);
+    void WaitForTestCompleted(myState_t* state);
+    atomic_bool awaitCondition(myState_t* state,deque<myState_t*> mydeque);
+    myState_t* buildState(LDDState* left, spot::state* right, bool acc, bool constructed,bool cyan);
+
 };
 
 #endif //PMC_SOG_CNDFS_H
diff --git a/src/misc/SafeDequeue.cpp b/src/misc/SafeDequeue.cpp
index aca8c11..b158c05 100644
--- a/src/misc/SafeDequeue.cpp
+++ b/src/misc/SafeDequeue.cpp
@@ -107,5 +107,5 @@ template class SafeDequeue<couple_th>;
 
 template class SafeDequeue<coupleSuccessor>;
 template class SafeDequeue<spot::formula>;
-//typedef pair<struct myState*, int> coupleSuccessor;
-template class SafeDequeue<struct myState*>;
+//typedef pair<struct myState_t*, int> coupleSuccessor;
+template class SafeDequeue<struct myState_t*>;
diff --git a/src/misc/SafeDequeue.h b/src/misc/SafeDequeue.h
index b4ddbb2..749d563 100644
--- a/src/misc/SafeDequeue.h
+++ b/src/misc/SafeDequeue.h
@@ -31,7 +31,7 @@ typedef pair<LDDState*, MDD> couple;
 typedef pair<couple, Set> Pair;
 typedef pair<LDDState*, int> couple_th;
 
-typedef pair<struct myState*, int> coupleSuccessor;
+typedef pair<struct myState_t*, int> coupleSuccessor;
 
 struct empty_queue: std::exception {
     ~empty_queue() {};
-- 
GitLab