From 2e034cb3da21b766bc1f72b5194273dbb95762b3 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 26 Jan 2023 14:53:58 +0100
Subject: [PATCH] Add explicit ObjectID::FromString() and setFromString()

---
 .../libraries/ArmarXObjects/ObjectID.cpp      | 35 +++++++++++++------
 .../libraries/ArmarXObjects/ObjectID.h        |  5 +++
 2 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectID.cpp b/source/RobotAPI/libraries/ArmarXObjects/ObjectID.cpp
index f2d76a501..8a2856b25 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/ObjectID.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectID.cpp
@@ -19,16 +19,7 @@ namespace armarx
     {
         if (nameOrID.find("/") != nameOrID.npos)
         {
-            const std::vector<std::string> split = simox::alg::split(nameOrID, "/", true);
-            ARMARX_CHECK(split.size() == 2 || split.size() == 3)
-                    << "Expected ID of format 'Dataset/ClassName' or 'Dataset/ClassName/InstanceName'"
-                    << ", but got: '" << nameOrID << "' (too many '/').";
-            _dataset = split[0];
-            _className = split[1];
-            if (split.size() == 3)
-            {
-                _instanceName = split[2];
-            }
+            setFromString(nameOrID);
         }
         else
         {
@@ -37,6 +28,30 @@ namespace armarx
         }
     }
 
+    ObjectID ObjectID::FromString(const std::string& idString)
+    {
+        ObjectID id;
+        id.setFromString(idString);
+        return id;
+    }
+
+    void ObjectID::setFromString(const std::string& idString)
+    {
+        const std::vector<std::string> split = simox::alg::split(idString, "/", true);
+        ARMARX_CHECK(split.size() == 2 || split.size() == 3)
+                << "Expected ID of format 'Dataset/ClassName' or 'Dataset/ClassName/InstanceName'"
+                << ", but got: '" << idString << "' "
+                << "(expected 2 or 3 '/'s, but found " << split.size() << ").";
+
+        _dataset = split[0];
+        _className = split[1];
+
+        if (split.size() == 3)
+        {
+            _instanceName = split[2];
+        }
+    }
+
     std::string ObjectID::str() const
     {
         std::string _str = _dataset + "/" + _className;
diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectID.h b/source/RobotAPI/libraries/ArmarXObjects/ObjectID.h
index 389b203a6..b152844b1 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/ObjectID.h
+++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectID.h
@@ -17,6 +17,9 @@ namespace armarx
         /// Construct from either a class name ("myobject") or ID ("mydataset/myobject", "mydataset/myclass/myinstance").
         ObjectID(const std::string& nameOrID);
 
+        /// Construct from a string produced by `str()`, e.g. ("mydataset/myobject", "mydataset/myclass/myinstance").
+        static ObjectID FromString(const std::string& idString);
+
 
         inline std::string dataset() const
         {
@@ -37,6 +40,8 @@ namespace armarx
 
         /// Return "dataset/className" or "dataset/className/instanceName".
         std::string str() const;
+        void setFromString(const std::string& idString);
+
 
         /// Return just the class ID without an intance name.
         ObjectID getClassID() const;
-- 
GitLab