From 992253643c93a4c1d2196b94949a61f68ee2133d Mon Sep 17 00:00:00 2001
From: Benjamin Halimi <benjamin.halimi@cea.fr>
Date: Mon, 16 Sep 2024 08:26:39 +0000
Subject: [PATCH] Enhance createUniqueName

---
 python_binding/graph/pybind_Node.cpp | 10 ++++++++++
 src/graph/Node.cpp                   | 21 ++++++++++++++++-----
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/python_binding/graph/pybind_Node.cpp b/python_binding/graph/pybind_Node.cpp
index 1fa552ce1..d8e77bb25 100644
--- a/python_binding/graph/pybind_Node.cpp
+++ b/python_binding/graph/pybind_Node.cpp
@@ -48,6 +48,16 @@ void init_Node(py::module& m) {
     :rtype: str
     )mydelimiter")
 
+    .def("create_unique_name", &Node::createUniqueName, py::arg("base_name"), 
+    R"mydelimiter(
+    Given a base name, generate a new name which is unique in all the GraphViews containing this node.
+
+    :param base_name: proposed name for the node.
+    :type base_name: str
+    :rtype: str
+    )mydelimiter")
+
+
     .def("__repr__", &Node::repr)
 
     .def("add_child",
diff --git a/src/graph/Node.cpp b/src/graph/Node.cpp
index 382052535..12080f590 100644
--- a/src/graph/Node.cpp
+++ b/src/graph/Node.cpp
@@ -73,13 +73,24 @@ void Aidge::Node::setName(const std::string& name) {
     mName = name;
 }
 
-std::string Aidge::Node::createUniqueName(std::string name){
-    for (auto graphView : views()){
-        if (graphView->inView(name)){
-            return createUniqueName(name.append("_"));
+std::string Aidge::Node::createUniqueName(std::string baseName)
+{
+    int index = 0;
+    bool nameAlreadyUsed = true;
+    std::string newName;
+    while (nameAlreadyUsed) {
+        std::string suffix = "_" + std::to_string(index);
+        newName = (index == 0) ? baseName : baseName + suffix;
+        nameAlreadyUsed = false;
+        for (auto graphView : views()) {
+            if (graphView->inView(newName)) {
+                nameAlreadyUsed = true;
+                break;
+            }
         }
+        index++;
     }
-    return name;
+    return newName;
 }
 
 ///////////////////////////////////////////////////////
-- 
GitLab