Procházet zdrojové kódy

Improved State class

- connected states are now being held in std::unordered_map
- removed "removeStateConnection" method
- state connections now have a connection key
- adjusted tests for State class
pcmattulat před 3 roky
rodič
revize
98ebd2ce79
3 změnil soubory, kde provedl 18 přidání a 57 odebrání
  1. 6 30
      source/logic/State.cpp
  2. 6 7
      source/logic/State.hpp
  3. 6 20
      test/cases/logic/StateTest.cpp

+ 6 - 30
source/logic/State.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-09-05
- * Changed:         2020-09-05
+ * Changed:         2020-09-10
  *
  * */
 
@@ -13,19 +13,19 @@ ls_std::State::State(std::string  _id) : Class("State"),
 id(std::move(_id))
 {}
 
-bool ls_std::State::addStateConnection(const std::shared_ptr<State>& _connectedState)
+bool ls_std::State::addStateConnection(const std::string& _connectionId, const std::shared_ptr<State>& _connectedState)
 {
   bool added {};
 
-  if(_connectedState != nullptr && !this->_stateIsConnected(_connectedState->getId())) {
-    this->connectedStates.emplace_back(_connectedState);
+  if(_connectedState != nullptr && !this->_stateIsConnected(_connectionId)) {
+    this->connectedStates.insert({_connectionId, _connectedState});
     added = true;
   }
 
   return added;
 }
 
-std::list<std::shared_ptr<ls_std::State>> ls_std::State::getConnectedStates()
+std::unordered_map<std::string, std::shared_ptr<ls_std::State>> ls_std::State::getConnectedStates()
 {
   return this->connectedStates;
 }
@@ -40,20 +40,6 @@ bool ls_std::State::isAccessible() const
   return this->accessCondition;
 }
 
-void ls_std::State::removeStateConnection(const std::string &_id)
-{
-  auto iterator = this->connectedStates.begin();
-
-  while(iterator != this->connectedStates.end()) {
-    if(iterator->get()->getId() == _id) {
-      this->connectedStates.erase(iterator);
-      break;
-    }
-
-    iterator++;
-  }
-}
-
 void ls_std::State::updateAccessCondition(bool _enteredCondition)
 {
   this->accessCondition = _enteredCondition;
@@ -61,15 +47,5 @@ void ls_std::State::updateAccessCondition(bool _enteredCondition)
 
 bool ls_std::State::_stateIsConnected(const std::string &_id)
 {
-  bool connected {};
-
-  for(const std::shared_ptr<State>& state : this->connectedStates) {
-    connected = state->getId() == _id;
-
-    if(connected) {
-      break;
-    }
-  }
-
-  return connected;
+  return this->connectedStates.find(_id) != this->connectedStates.end();
 }

+ 6 - 7
source/logic/State.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-09-05
- * Changed:         2020-09-05
+ * Changed:         2020-09-10
  *
  * */
 
@@ -11,27 +11,26 @@
 #define LS_STD_STATE_HPP
 
 #include <memory>
-#include <list>
+#include <unordered_map>
 #include "../base/Class.hpp"
 
 namespace ls_std {
   class State : public Class {
     public:
 
-      explicit State(std::string  _id);
+      explicit State(std::string _id);
       ~State() = default;
 
-      bool addStateConnection(const std::shared_ptr<State>& _connectedState);
-      std::list<std::shared_ptr<State>> getConnectedStates();
+      bool addStateConnection(const std::string& _connectionId, const std::shared_ptr<State>& _connectedState);
+      std::unordered_map<std::string, std::shared_ptr<State>> getConnectedStates();
       std::string getId();
       bool isAccessible() const;
-      void removeStateConnection(const std::string& _id);
       void updateAccessCondition(bool _enteredCondition);
 
     private:
 
       bool accessCondition {};
-      std::list<std::shared_ptr<State>> connectedStates {};
+      std::unordered_map<std::string, std::shared_ptr<State>> connectedStates {};
       std::string id {};
 
       bool _stateIsConnected(const std::string& _id);

+ 6 - 20
test/cases/logic/StateTest.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-09-05
- * Changed:         2020-09-05
+ * Changed:         2020-09-10
  *
  * */
 
@@ -27,7 +27,7 @@ namespace {
     ls_std::State stateA {"A"};
     ls_std::State stateB {"B"};
 
-    ASSERT_TRUE(stateA.addStateConnection(std::make_shared<ls_std::State>(stateB)));
+    ASSERT_TRUE(stateA.addStateConnection("AB", std::make_shared<ls_std::State>(stateB)));
   }
 
   TEST_F(StateTest, addStateConnectionNegative)
@@ -35,9 +35,9 @@ namespace {
     ls_std::State stateA {"A"};
     ls_std::State stateB {"B"};
 
-    ASSERT_TRUE(stateA.addStateConnection(std::make_shared<ls_std::State>(stateB)));
-    ASSERT_FALSE(stateA.addStateConnection(std::make_shared<ls_std::State>(stateB)));
-    ASSERT_FALSE(stateA.addStateConnection(nullptr));
+    ASSERT_TRUE(stateA.addStateConnection("AB", std::make_shared<ls_std::State>(stateB)));
+    ASSERT_FALSE(stateA.addStateConnection("AB", std::make_shared<ls_std::State>(stateB)));
+    ASSERT_FALSE(stateA.addStateConnection("XX", nullptr));
   }
 
   TEST_F(StateTest, getConnectedStates)
@@ -45,7 +45,7 @@ namespace {
     ls_std::State stateA {"A"};
     ls_std::State stateB {"B"};
 
-    ASSERT_TRUE(stateA.addStateConnection(std::make_shared<ls_std::State>(stateB)));
+    ASSERT_TRUE(stateA.addStateConnection("AB", std::make_shared<ls_std::State>(stateB)));
     ASSERT_FALSE(stateA.getConnectedStates().empty());
     ASSERT_EQ(1, stateA.getConnectedStates().size());
   }
@@ -70,20 +70,6 @@ namespace {
     ASSERT_FALSE(stateA.isAccessible());
   }
 
-  TEST_F(StateTest, removeStateConnection)
-  {
-    ls_std::State stateA {"A"};
-    ls_std::State stateB {"B"};
-
-    ASSERT_TRUE(stateA.addStateConnection(std::make_shared<ls_std::State>(stateB)));
-    ASSERT_FALSE(stateA.getConnectedStates().empty());
-    ASSERT_EQ(1, stateA.getConnectedStates().size());
-
-    stateA.removeStateConnection("B");
-    ASSERT_TRUE(stateA.getConnectedStates().empty());
-    ASSERT_EQ(0, stateA.getConnectedStates().size());
-  }
-
   TEST_F(StateTest, updateAccessCondition)
   {
     ls_std::State stateA {"A"};