From 49dd6b41933a78da46f54504edba2e0c5e8c7d41 Mon Sep 17 00:00:00 2001 From: Kyle Bayes Date: Mon, 6 Mar 2023 01:58:51 -0800 Subject: [PATCH] Clean up mj_id2name and mj_name2id. PiperOrigin-RevId: 514340647 Change-Id: Idf895b2d7a4a8833725afbe5c71c777081b42d9e --- doc/APIreference/functions.rst | 4 ++-- include/mujoco/mujoco.h | 4 ++-- introspect/functions.py | 4 ++-- src/engine/engine_support.c | 29 +++++++++++++++-------------- src/engine/engine_support.h | 4 ++-- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/doc/APIreference/functions.rst b/doc/APIreference/functions.rst index 59fd8b4e..28040c82 100644 --- a/doc/APIreference/functions.rst +++ b/doc/APIreference/functions.rst @@ -960,7 +960,7 @@ mj_name2id .. mujoco-include:: mj_name2id -Get id of object with specified name, return -1 if not found; type is mjtObj. +Get id of object with the specified mjtObj type and name, returns -1 if id not found. .. _mj_id2name: @@ -969,7 +969,7 @@ mj_id2name .. mujoco-include:: mj_id2name -Get name of object with specified id, return 0 if invalid type or id; type is mjtObj. +Get name of object with the specified mjtObj type and id, returns ``NULL`` if name not found. .. _mj_fullM: diff --git a/include/mujoco/mujoco.h b/include/mujoco/mujoco.h index 8151e363..3e392a80 100644 --- a/include/mujoco/mujoco.h +++ b/include/mujoco/mujoco.h @@ -400,10 +400,10 @@ MJAPI void mj_jacSite(const mjModel* m, const mjData* d, mjtNum* jacp, mjtNum* j MJAPI void mj_jacPointAxis(const mjModel* m, mjData* d, mjtNum* jacPoint, mjtNum* jacAxis, const mjtNum point[3], const mjtNum axis[3], int body); -// Get id of object with specified name, return -1 if not found; type is mjtObj. +// Get id of object with the specified mjtObj type and name, returns -1 if id not found. MJAPI int mj_name2id(const mjModel* m, int type, const char* name); -// Get name of object with specified id, return 0 if invalid type or id; type is mjtObj. +// Get name of object with the specified mjtObj type and id, returns NULL if name not found. MJAPI const char* mj_id2name(const mjModel* m, int type, int id); // Convert sparse inertia matrix M into full (i.e. dense) matrix. diff --git a/introspect/functions.py b/introspect/functions.py index 8aeb0c90..9ef1f67a 100644 --- a/introspect/functions.py +++ b/introspect/functions.py @@ -2184,7 +2184,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ ), ), ), - doc='Get id of object with specified name, return -1 if not found; type is mjtObj.', # pylint: disable=line-too-long + doc='Get id of object with the specified mjtObj type and name, returns -1 if id not found.', # pylint: disable=line-too-long )), ('mj_id2name', FunctionDecl( @@ -2208,7 +2208,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ type=ValueType(name='int'), ), ), - doc='Get name of object with specified id, return 0 if invalid type or id; type is mjtObj.', # pylint: disable=line-too-long + doc='Get name of object with the specified mjtObj type and id, returns NULL if name not found.', # pylint: disable=line-too-long )), ('mj_fullM', FunctionDecl( diff --git a/src/engine/engine_support.c b/src/engine/engine_support.c index 89289e0c..7860e45e 100644 --- a/src/engine/engine_support.c +++ b/src/engine/engine_support.c @@ -636,8 +636,8 @@ uint64_t mj_hashdjb2(const char* s, uint64_t n) { return h % n; } - -// get id of object with specified name; -1: not found +// get id of object with the specified mjtObj type and name, +// returns -1 if id not found int mj_name2id(const mjModel* m, int type, const char* name) { int mapadr; int* adr = 0; @@ -652,19 +652,23 @@ int mj_name2id(const mjModel* m, int type, const char* name) { do { int j = m->names_map[mapadr + i]; - if (j < 0) return -1; + if (j<0) { + return -1; + } + if (!strncmp(name, m->names+adr[j], m->nnames-adr[j])) { return j; } - if (++i == num) i = 0; - } while(i != hash); + if ((++i)==num) i = 0; + } while (i!=hash); } return -1; } -// get name of object with specified id; 0: invalid type or id, or null name +// get name of object with the specified mjtObj type and id, +// returns NULL if name not found const char* mj_id2name(const mjModel* m, int type, int id) { int mapadr; int* adr = 0; @@ -672,15 +676,12 @@ const char* mj_id2name(const mjModel* m, int type, int id) { // get number of objects and name addresses int num = _getnumadr(m, type, &adr, &mapadr); - if (id>=0 && idnames[adr[id]]) { - return m->names+adr[id]; - } else { - return 0; - } - } else { - return 0; + // id is in [0, num) and the found name is not the empty string "\0" + if (id>=0 && idnames[adr[id]]) { + return m->names+adr[id]; } + + return NULL; } diff --git a/src/engine/engine_support.h b/src/engine/engine_support.h index 18fbaf33..cab2f4bc 100644 --- a/src/engine/engine_support.h +++ b/src/engine/engine_support.h @@ -81,10 +81,10 @@ MJAPI int mj_jacDifPair(const mjModel* m, const mjData* d, int* chain, // get string hash, see http://www.cse.yorku.ca/~oz/hash.html uint64_t mj_hashdjb2(const char* s, uint64_t n); -// get id of object with specified name; -1: not found; type is mjtObj +// get id of object with the specified mjtObj type and name, returns -1 if id not found MJAPI int mj_name2id(const mjModel* m, int type, const char* name); -// get name of object with specified id; 0: invalid type or id; type is mjtObj +// get name of object with the specified mjtObj type and id, returns NULL if name not found MJAPI const char* mj_id2name(const mjModel* m, int type, int id);