From 206c23cd027e330a79bdf25a992b8e9db5178613 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Wed, 14 Jul 2021 22:08:11 +0200
Subject: [PATCH] RAII paradigm

---
 .../libraries/client/ComponentPlugin.cpp      |  4 +-
 .../Navigation/libraries/client/Navigator.cpp | 80 +++++++------------
 .../Navigation/libraries/client/Navigator.h   | 12 ++-
 3 files changed, 39 insertions(+), 57 deletions(-)

diff --git a/source/Navigation/libraries/client/ComponentPlugin.cpp b/source/Navigation/libraries/client/ComponentPlugin.cpp
index 8993da44..0f51b607 100644
--- a/source/Navigation/libraries/client/ComponentPlugin.cpp
+++ b/source/Navigation/libraries/client/ComponentPlugin.cpp
@@ -4,6 +4,7 @@
 #include "ArmarXCore/core/Component.h"
 #include "ArmarXCore/core/application/properties/PropertyDefinitionContainer.h"
 #include "ArmarXCore/util/CPPUtility/trace.h"
+#include "Navigation/libraries/client/Navigator.h"
 
 
 // ComponentPlugin
@@ -37,7 +38,8 @@ void armarx::nav::client::ComponentPlugin::preOnConnectComponent()
 
     ARMARX_TRACE;
     const std::string componentName = parent().getName();
-    parent<armarx::nav::client::ComponentPluginUser>().navigator.setConfigId(componentName);
+    parent<armarx::nav::client::ComponentPluginUser>().navigator = Navigator(navigatorPrx, componentName);
+    // parent<armarx::nav::client::ComponentPluginUser>().navigator.setConfigId(componentName);
 }
 
 
diff --git a/source/Navigation/libraries/client/Navigator.cpp b/source/Navigation/libraries/client/Navigator.cpp
index 32a55902..4909ffbb 100644
--- a/source/Navigation/libraries/client/Navigator.cpp
+++ b/source/Navigation/libraries/client/Navigator.cpp
@@ -1,5 +1,6 @@
-#include <Navigation/libraries/client/Navigator.h>
+#include "Navigation/libraries/client/Navigator.h"
 
+#include "ArmarXCore/core/exceptions/local/ExpressionException.h"
 
 std::vector<Eigen::Matrix4f> convert(const std::vector<armarx::nav::core::Pose>& ps)
 {
@@ -14,113 +15,86 @@ std::vector<Eigen::Matrix4f> convert(const std::vector<armarx::nav::core::Pose>&
     return ms;
 }
 
-
-//armarx::nav::client::Navigator::Navigator(const armarx::nav::components::NavigatorInterfacePrx& navigator)
-//    : navigator(navigator)
-//{
-//    // pass
-//}
-
-
-void
-armarx::nav::client::Navigator::setConfigId(const std::string& configId)
+armarx::nav::client::Navigator::Navigator(const armarx::nav::components::NavigatorInterfacePrx& navigator, const std::string& configId)
+    : navigator(navigator), configId(configId)
 {
-    this->configId = configId;
+    // pass
 }
 
+// void armarx::nav::client::Navigator::setConfigId(const std::string& configId)
+// {
+//     this->configId = configId;
+// }
 
-void
-armarx::nav::client::Navigator::configure(const NavigationStackConfig& cfg)
+void armarx::nav::client::Navigator::configure(const NavigationStackConfig& cfg)
 {
+    ARMARX_CHECK_NOT_NULL(navigator);
     navigator->createConfig(cfg.toAron(), configId);
 }
 
-
-void
-armarx::nav::client::Navigator::moveTo(const core::Pose& pose, core::NavigationFrame frame)
+void armarx::nav::client::Navigator::moveTo(const core::Pose& pose, core::NavigationFrame frame)
 {
     moveTo(std::vector<core::Pose> {pose}, frame);
 }
 
-
-void
-armarx::nav::client::Navigator::moveTo(const std::vector<core::Pose>& waypoints,
-                                       core::NavigationFrame frame)
+void armarx::nav::client::Navigator::moveTo(const std::vector<core::Pose>& waypoints,
+        core::NavigationFrame frame)
 {
-    navigator->moveTo(convert(waypoints),
-                      core::NavigationFrameNames.to_name(frame),
-                      configId);
+    ARMARX_CHECK_NOT_NULL(navigator);
+    navigator->moveTo(convert(waypoints), core::NavigationFrameNames.to_name(frame), configId);
 }
 
-
-void
-armarx::nav::client::Navigator::moveTowards(const core::Direction& direction,
+void armarx::nav::client::Navigator::moveTowards(const core::Direction& direction,
         core::NavigationFrame frame)
 {
+    ARMARX_CHECK_NOT_NULL(navigator);
     navigator->moveTowards(direction, core::NavigationFrameNames.to_name(frame), configId);
 }
 
-
-void
-armarx::nav::client::Navigator::pauseMovement()
+void armarx::nav::client::Navigator::pauseMovement()
 {
+    ARMARX_CHECK_NOT_NULL(navigator);
     navigator->pauseMovement();
 }
 
-
-void
-armarx::nav::client::Navigator::resumeMovement()
+void armarx::nav::client::Navigator::resumeMovement()
 {
+    ARMARX_CHECK_NOT_NULL(navigator);
     navigator->resumeMovement();
 }
 
-
-void
-armarx::nav::client::Navigator::onGoalReached(const std::function<void(void)>& callback)
+void armarx::nav::client::Navigator::onGoalReached(const std::function<void(void)>& callback)
 {
-
 }
 
-
-void
-armarx::nav::client::Navigator::onGoalNearlyReached(const std::function<void(void)>& callback)
+void armarx::nav::client::Navigator::onGoalNearlyReached(const std::function<void(void)>& callback)
 {
-
 }
 
-
-void
-armarx::nav::client::Navigator::onWaypointReached(const std::function<void(int)>& callback)
+void armarx::nav::client::Navigator::onWaypointReached(const std::function<void(int)>& callback)
 {
-
 }
 
-
-void
-armarx::nav::client::Navigator::onWaypointNearlyReached(const std::function<void(int)>& callback)
+void armarx::nav::client::Navigator::onWaypointNearlyReached(
+    const std::function<void(int)>& callback)
 {
-
 }
 
-
 auto armarx::nav::client::Navigator::waitForGoalReached() -> GoalReachedWaitResult
 {
     return {};
 }
 
-
 auto armarx::nav::client::Navigator::waitForGoalNearlyReached() -> GoalReachedWaitResult
 {
     return {};
 }
 
-
 auto armarx::nav::client::Navigator::waitForWaypointReached() -> WaypointReachedWaitResult
 {
     return {};
 }
 
-
 auto armarx::nav::client::Navigator::waitForWaypointNearlyReached() -> WaypointReachedWaitResult
 {
     return {};
diff --git a/source/Navigation/libraries/client/Navigator.h b/source/Navigation/libraries/client/Navigator.h
index 3cab9da4..ee956482 100644
--- a/source/Navigation/libraries/client/Navigator.h
+++ b/source/Navigation/libraries/client/Navigator.h
@@ -20,6 +20,7 @@
  *             GNU General Public License
  */
 
+#pragma once
 
 // STD/STL
 #include <functional>
@@ -34,15 +35,17 @@
 
 namespace armarx::nav::client
 {
+    class ComponentPluginUser;
 
     class Navigator
     {
+        friend class ComponentPluginUser;
 
     public:
 
-        //Navigator(const components::NavigatorInterfacePrx& navigator);
+        Navigator(const components::NavigatorInterfacePrx& navigator, const std::string& configId);
 
-        void setConfigId(const std::string& configId);
+        // void setConfigId(const std::string& configId);
 
         void configure(const NavigationStackConfig& cfg);
 
@@ -93,9 +96,12 @@ namespace armarx::nav::client
 
     private:
 
-        std::string configId;
+        // private c'tor violating RAII. Only meant to be used by friend class ComponentPluginUser
+        Navigator() = default;
+
 
         components::NavigatorInterfacePrx navigator;
+        std::string configId;
 
     };
 
-- 
GitLab