From ebe60b9ad5e0ecd32ec506f44d1fef286fd310e8 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Fri, 1 Nov 2024 18:17:42 -0700 Subject: [PATCH] Add const to mjsDefault when used as function argument. Fixes #2197. PiperOrigin-RevId: 692346264 Change-Id: Iddb9be1377a7d59c86911802d8c5563f6bf6b043 --- doc/includes/references.h | 28 +++++++-------- include/mujoco/mujoco.h | 28 +++++++-------- introspect/functions.py | 28 +++++++-------- python/mujoco/specs.cc | 2 +- src/user/user_api.cc | 28 +++++++-------- src/user/user_api.h | 28 +++++++-------- src/xml/xml_native_reader.cc | 67 ++++++++++++++++-------------------- src/xml/xml_native_reader.h | 4 +-- 8 files changed, 102 insertions(+), 111 deletions(-) diff --git a/doc/includes/references.h b/doc/includes/references.h index 546299d7..0f8d869a 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -3567,22 +3567,22 @@ mjsFrame* mjs_attachFrame(mjsBody* parent, const mjsFrame* child, mjsBody* mjs_attachToSite(mjsSite* parent, const mjsBody* child, const char* prefix, const char* suffix); int mjs_detachBody(mjSpec* s, mjsBody* b); -mjsBody* mjs_addBody(mjsBody* body, mjsDefault* def); -mjsSite* mjs_addSite(mjsBody* body, mjsDefault* def); -mjsJoint* mjs_addJoint(mjsBody* body, mjsDefault* def); +mjsBody* mjs_addBody(mjsBody* body, const mjsDefault* def); +mjsSite* mjs_addSite(mjsBody* body, const mjsDefault* def); +mjsJoint* mjs_addJoint(mjsBody* body, const mjsDefault* def); mjsJoint* mjs_addFreeJoint(mjsBody* body); -mjsGeom* mjs_addGeom(mjsBody* body, mjsDefault* def); -mjsCamera* mjs_addCamera(mjsBody* body, mjsDefault* def); -mjsLight* mjs_addLight(mjsBody* body, mjsDefault* def); +mjsGeom* mjs_addGeom(mjsBody* body, const mjsDefault* def); +mjsCamera* mjs_addCamera(mjsBody* body, const mjsDefault* def); +mjsLight* mjs_addLight(mjsBody* body, const mjsDefault* def); mjsFrame* mjs_addFrame(mjsBody* body, mjsFrame* parentframe); void mjs_delete(mjsElement* element); -mjsActuator* mjs_addActuator(mjSpec* s, mjsDefault* def); +mjsActuator* mjs_addActuator(mjSpec* s, const mjsDefault* def); mjsSensor* mjs_addSensor(mjSpec* s); mjsFlex* mjs_addFlex(mjSpec* s); -mjsPair* mjs_addPair(mjSpec* s, mjsDefault* def); +mjsPair* mjs_addPair(mjSpec* s, const mjsDefault* def); mjsExclude* mjs_addExclude(mjSpec* s); -mjsEquality* mjs_addEquality(mjSpec* s, mjsDefault* def); -mjsTendon* mjs_addTendon(mjSpec* s, mjsDefault* def); +mjsEquality* mjs_addEquality(mjSpec* s, const mjsDefault* def); +mjsTendon* mjs_addTendon(mjSpec* s, const mjsDefault* def); mjsWrap* mjs_wrapSite(mjsTendon* tendon, const char* name); mjsWrap* mjs_wrapGeom(mjsTendon* tendon, const char* name, const char* sidesite); mjsWrap* mjs_wrapJoint(mjsTendon* tendon, const char* name, double coef); @@ -3593,11 +3593,11 @@ mjsTuple* mjs_addTuple(mjSpec* s); mjsKey* mjs_addKey(mjSpec* s); mjsPlugin* mjs_addPlugin(mjSpec* s); mjsDefault* mjs_addDefault(mjSpec* s, const char* classname, const mjsDefault* parent); -mjsMesh* mjs_addMesh(mjSpec* s, mjsDefault* def); +mjsMesh* mjs_addMesh(mjSpec* s, const mjsDefault* def); mjsHField* mjs_addHField(mjSpec* s); mjsSkin* mjs_addSkin(mjSpec* s); mjsTexture* mjs_addTexture(mjSpec* s); -mjsMaterial* mjs_addMaterial(mjSpec* s, mjsDefault* def); +mjsMaterial* mjs_addMaterial(mjSpec* s, const mjsDefault* def); mjSpec* mjs_getSpec(mjsElement* element); mjSpec* mjs_findSpec(mjSpec* spec, const char* name); mjsBody* mjs_findBody(mjSpec* s, const char* name); @@ -3605,7 +3605,7 @@ mjsElement* mjs_findElement(mjSpec* s, mjtObj type, const char* name); mjsBody* mjs_findChild(mjsBody* body, const char* name); mjsFrame* mjs_findFrame(mjSpec* s, const char* name); mjsDefault* mjs_getDefault(mjsElement* element); -mjsDefault* mjs_findDefault(mjSpec* s, const char* classname); +const mjsDefault* mjs_findDefault(mjSpec* s, const char* classname); mjsDefault* mjs_getSpecDefault(mjSpec* s); int mjs_getId(mjsElement* element); mjsElement* mjs_firstChild(mjsBody* body, mjtObj type, int recurse); @@ -3625,7 +3625,7 @@ void mjs_setDouble(mjDoubleVec* dest, const double* array, int size); void mjs_setPluginAttributes(mjsPlugin* plugin, void* attributes); const char* mjs_getString(const mjString* source); const double* mjs_getDouble(const mjDoubleVec* source, int* size); -void mjs_setDefault(mjsElement* element, mjsDefault* def); +void mjs_setDefault(mjsElement* element, const mjsDefault* def); void mjs_setFrame(mjsElement* dest, mjsFrame* frame); const char* mjs_resolveOrientation(double quat[4], mjtByte degree, const char* sequence, const mjsOrientation* orientation); diff --git a/include/mujoco/mujoco.h b/include/mujoco/mujoco.h index 54b807e9..2fedda8f 100644 --- a/include/mujoco/mujoco.h +++ b/include/mujoco/mujoco.h @@ -1421,25 +1421,25 @@ MJAPI int mjs_detachBody(mjSpec* s, mjsBody* b); //---------------------------------- Tree elements ------------------------------------------------- // Add child body to body, return child. -MJAPI mjsBody* mjs_addBody(mjsBody* body, mjsDefault* def); +MJAPI mjsBody* mjs_addBody(mjsBody* body, const mjsDefault* def); // Add site to body, return site spec. -MJAPI mjsSite* mjs_addSite(mjsBody* body, mjsDefault* def); +MJAPI mjsSite* mjs_addSite(mjsBody* body, const mjsDefault* def); // Add joint to body. -MJAPI mjsJoint* mjs_addJoint(mjsBody* body, mjsDefault* def); +MJAPI mjsJoint* mjs_addJoint(mjsBody* body, const mjsDefault* def); // Add freejoint to body. MJAPI mjsJoint* mjs_addFreeJoint(mjsBody* body); // Add geom to body. -MJAPI mjsGeom* mjs_addGeom(mjsBody* body, mjsDefault* def); +MJAPI mjsGeom* mjs_addGeom(mjsBody* body, const mjsDefault* def); // Add camera to body. -MJAPI mjsCamera* mjs_addCamera(mjsBody* body, mjsDefault* def); +MJAPI mjsCamera* mjs_addCamera(mjsBody* body, const mjsDefault* def); // Add light to body. -MJAPI mjsLight* mjs_addLight(mjsBody* body, mjsDefault* def); +MJAPI mjsLight* mjs_addLight(mjsBody* body, const mjsDefault* def); // Add frame to body. MJAPI mjsFrame* mjs_addFrame(mjsBody* body, mjsFrame* parentframe); @@ -1451,7 +1451,7 @@ MJAPI void mjs_delete(mjsElement* element); //---------------------------------- Non-tree elements --------------------------------------------- // Add actuator. -MJAPI mjsActuator* mjs_addActuator(mjSpec* s, mjsDefault* def); +MJAPI mjsActuator* mjs_addActuator(mjSpec* s, const mjsDefault* def); // Add sensor. MJAPI mjsSensor* mjs_addSensor(mjSpec* s); @@ -1460,16 +1460,16 @@ MJAPI mjsSensor* mjs_addSensor(mjSpec* s); MJAPI mjsFlex* mjs_addFlex(mjSpec* s); // Add contact pair. -MJAPI mjsPair* mjs_addPair(mjSpec* s, mjsDefault* def); +MJAPI mjsPair* mjs_addPair(mjSpec* s, const mjsDefault* def); // Add excluded body pair. MJAPI mjsExclude* mjs_addExclude(mjSpec* s); // Add equality. -MJAPI mjsEquality* mjs_addEquality(mjSpec* s, mjsDefault* def); +MJAPI mjsEquality* mjs_addEquality(mjSpec* s, const mjsDefault* def); // Add tendon. -MJAPI mjsTendon* mjs_addTendon(mjSpec* s, mjsDefault* def); +MJAPI mjsTendon* mjs_addTendon(mjSpec* s, const mjsDefault* def); // Wrap site using tendon. MJAPI mjsWrap* mjs_wrapSite(mjsTendon* tendon, const char* name); @@ -1505,7 +1505,7 @@ MJAPI mjsDefault* mjs_addDefault(mjSpec* s, const char* classname, const mjsDefa //---------------------------------- Assets -------------------------------------------------------- // Add mesh. -MJAPI mjsMesh* mjs_addMesh(mjSpec* s, mjsDefault* def); +MJAPI mjsMesh* mjs_addMesh(mjSpec* s, const mjsDefault* def); // Add height field. MJAPI mjsHField* mjs_addHField(mjSpec* s); @@ -1517,7 +1517,7 @@ MJAPI mjsSkin* mjs_addSkin(mjSpec* s); MJAPI mjsTexture* mjs_addTexture(mjSpec* s); // Add material. -MJAPI mjsMaterial* mjs_addMaterial(mjSpec* s, mjsDefault* def); +MJAPI mjsMaterial* mjs_addMaterial(mjSpec* s, const mjsDefault* def); //---------------------------------- Find and get utilities ---------------------------------------- @@ -1544,7 +1544,7 @@ MJAPI mjsFrame* mjs_findFrame(mjSpec* s, const char* name); MJAPI mjsDefault* mjs_getDefault(mjsElement* element); // Find default in model by class name. -MJAPI mjsDefault* mjs_findDefault(mjSpec* s, const char* classname); +MJAPI const mjsDefault* mjs_findDefault(mjSpec* s, const char* classname); // Get global default from model. MJAPI mjsDefault* mjs_getSpecDefault(mjSpec* s); @@ -1614,7 +1614,7 @@ MJAPI const double* mjs_getDouble(const mjDoubleVec* source, int* size); //---------------------------------- Spec utilities ------------------------------------------------ // Set element's default. -MJAPI void mjs_setDefault(mjsElement* element, mjsDefault* def); +MJAPI void mjs_setDefault(mjsElement* element, const mjsDefault* def); // Set element's enclosing frame. MJAPI void mjs_setFrame(mjsElement* dest, mjsFrame* frame); diff --git a/introspect/functions.py b/introspect/functions.py index 6c3a5b9e..89b28e4a 100644 --- a/introspect/functions.py +++ b/introspect/functions.py @@ -9072,7 +9072,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9094,7 +9094,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9116,7 +9116,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9154,7 +9154,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9176,7 +9176,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9198,7 +9198,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9256,7 +9256,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9310,7 +9310,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9348,7 +9348,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9370,7 +9370,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9596,7 +9596,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9666,7 +9666,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), @@ -9822,7 +9822,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionDecl( name='mjs_findDefault', return_type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), parameters=( FunctionParameterDecl( @@ -10262,7 +10262,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ FunctionParameterDecl( name='def', type=PointerType( - inner_type=ValueType(name='mjsDefault'), + inner_type=ValueType(name='mjsDefault', is_const=True), ), ), ), diff --git a/python/mujoco/specs.cc b/python/mujoco/specs.cc index b2beaa3f..d88a0544 100644 --- a/python/mujoco/specs.cc +++ b/python/mujoco/specs.cc @@ -346,7 +346,7 @@ PYBIND11_MODULE(_specs, m) { py::return_value_policy::reference_internal); mjSpec.def( "find_default", - [](MjSpec& self, std::string& classname) -> raw::MjsDefault* { + [](MjSpec& self, std::string& classname) -> const raw::MjsDefault* { return mjs_findDefault(self.ptr, classname.c_str()); }, py::return_value_policy::reference_internal); diff --git a/src/user/user_api.cc b/src/user/user_api.cc index 62dd2717..af465e75 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -263,7 +263,7 @@ void mjs_delete(mjsElement* element) { // add child body to body, return child spec -mjsBody* mjs_addBody(mjsBody* bodyspec, mjsDefault* defspec) { +mjsBody* mjs_addBody(mjsBody* bodyspec, const mjsDefault* defspec) { mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCBody* body = static_cast(bodyspec->element)->AddBody(def); return &body->spec; @@ -272,7 +272,7 @@ mjsBody* mjs_addBody(mjsBody* bodyspec, mjsDefault* defspec) { // add site to body, return site spec -mjsSite* mjs_addSite(mjsBody* bodyspec, mjsDefault* defspec) { +mjsSite* mjs_addSite(mjsBody* bodyspec, const mjsDefault* defspec) { mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCBody* body = static_cast(bodyspec->element); mjCSite* site = body->AddSite(def); @@ -282,7 +282,7 @@ mjsSite* mjs_addSite(mjsBody* bodyspec, mjsDefault* defspec) { // add joint to body -mjsJoint* mjs_addJoint(mjsBody* bodyspec, mjsDefault* defspec) { +mjsJoint* mjs_addJoint(mjsBody* bodyspec, const mjsDefault* defspec) { mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCBody* body = static_cast(bodyspec->element); mjCJoint* joint = body->AddJoint(def); @@ -301,7 +301,7 @@ mjsJoint* mjs_addFreeJoint(mjsBody* bodyspec) { // add geom to body -mjsGeom* mjs_addGeom(mjsBody* bodyspec, mjsDefault* defspec) { +mjsGeom* mjs_addGeom(mjsBody* bodyspec, const mjsDefault* defspec) { mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCBody* body = static_cast(bodyspec->element); mjCGeom* geom = body->AddGeom(def); @@ -311,7 +311,7 @@ mjsGeom* mjs_addGeom(mjsBody* bodyspec, mjsDefault* defspec) { // add camera to body -mjsCamera* mjs_addCamera(mjsBody* bodyspec, mjsDefault* defspec) { +mjsCamera* mjs_addCamera(mjsBody* bodyspec, const mjsDefault* defspec) { mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCBody* body = static_cast(bodyspec->element); mjCCamera* camera = body->AddCamera(def); @@ -321,7 +321,7 @@ mjsCamera* mjs_addCamera(mjsBody* bodyspec, mjsDefault* defspec) { // add light to body -mjsLight* mjs_addLight(mjsBody* bodyspec, mjsDefault* defspec) { +mjsLight* mjs_addLight(mjsBody* bodyspec, const mjsDefault* defspec) { mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCBody* body = static_cast(bodyspec->element); mjCLight* light = body->AddLight(def); @@ -354,7 +354,7 @@ mjsFrame* mjs_addFrame(mjsBody* bodyspec, mjsFrame* parentframe) { // add mesh to model -mjsMesh* mjs_addMesh(mjSpec* s, mjsDefault* defspec) { +mjsMesh* mjs_addMesh(mjSpec* s, const mjsDefault* defspec) { mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCModel* modelC = static_cast(s->element); mjCMesh* mesh = modelC->AddMesh(def); @@ -391,7 +391,7 @@ mjsTexture* mjs_addTexture(mjSpec* s) { // add material to model -mjsMaterial* mjs_addMaterial(mjSpec* s, mjsDefault* defspec) { +mjsMaterial* mjs_addMaterial(mjSpec* s, const mjsDefault* defspec) { mjCModel* modelC = static_cast(s->element); mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCMaterial* material = modelC->AddMaterial(def); @@ -401,7 +401,7 @@ mjsMaterial* mjs_addMaterial(mjSpec* s, mjsDefault* defspec) { // add pair to model -mjsPair* mjs_addPair(mjSpec* s, mjsDefault* defspec) { +mjsPair* mjs_addPair(mjSpec* s, const mjsDefault* defspec) { mjCModel* modelC = static_cast(s->element); mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCPair* pair = modelC->AddPair(def); @@ -420,7 +420,7 @@ mjsExclude* mjs_addExclude(mjSpec* s) { // add equality to model -mjsEquality* mjs_addEquality(mjSpec* s, mjsDefault* defspec) { +mjsEquality* mjs_addEquality(mjSpec* s, const mjsDefault* defspec) { mjCModel* modelC = static_cast(s->element); mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCEquality* equality = modelC->AddEquality(def); @@ -430,7 +430,7 @@ mjsEquality* mjs_addEquality(mjSpec* s, mjsDefault* defspec) { // add tendon to model -mjsTendon* mjs_addTendon(mjSpec* s, mjsDefault* defspec) { +mjsTendon* mjs_addTendon(mjSpec* s, const mjsDefault* defspec) { mjCModel* modelC = static_cast(s->element); mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCTendon* tendon = modelC->AddTendon(def); @@ -476,7 +476,7 @@ mjsWrap* mjs_wrapPulley(mjsTendon* tendonspec, double divisor) { // add actuator to model -mjsActuator* mjs_addActuator(mjSpec* s, mjsDefault* defspec) { +mjsActuator* mjs_addActuator(mjSpec* s, const mjsDefault* defspec) { mjCModel* modelC = static_cast(s->element); mjCDef* def = defspec ? static_cast(defspec->element) : 0; mjCActuator* actuator = modelC->AddActuator(def); @@ -580,7 +580,7 @@ mjsDefault* mjs_getDefault(mjsElement* element) { // Find default with given name in model. -mjsDefault* mjs_findDefault(mjSpec* s, const char* classname) { +const mjsDefault* mjs_findDefault(mjSpec* s, const char* classname) { mjCModel* modelC = static_cast(s->element); mjCDef* cdef = modelC->FindDefault(classname); if (!cdef) { @@ -692,7 +692,7 @@ int mjs_getId(mjsElement* element) { // set default -void mjs_setDefault(mjsElement* element, mjsDefault* defspec) { +void mjs_setDefault(mjsElement* element, const mjsDefault* defspec) { mjCBase* baseC = static_cast(element); baseC->classname = static_cast(defspec->element)->name; } diff --git a/src/user/user_api.h b/src/user/user_api.h index 25d6106c..70eb6af2 100644 --- a/src/user/user_api.h +++ b/src/user/user_api.h @@ -85,25 +85,25 @@ MJAPI int mjs_detachBody(mjSpec* s, mjsBody* b); //---------------------------------- Add tree elements --------------------------------------------- // Add child body to body, return child. -MJAPI mjsBody* mjs_addBody(mjsBody* body, mjsDefault* def); +MJAPI mjsBody* mjs_addBody(mjsBody* body, const mjsDefault* def); // Add site to body, return site spec. -MJAPI mjsSite* mjs_addSite(mjsBody* body, mjsDefault* def); +MJAPI mjsSite* mjs_addSite(mjsBody* body, const mjsDefault* def); // Add joint to body. -MJAPI mjsJoint* mjs_addJoint(mjsBody* body, mjsDefault* def); +MJAPI mjsJoint* mjs_addJoint(mjsBody* body, const mjsDefault* def); // Add freejoint to body. MJAPI mjsJoint* mjs_addFreeJoint(mjsBody* body); // Add geom to body. -MJAPI mjsGeom* mjs_addGeom(mjsBody* body, mjsDefault* def); +MJAPI mjsGeom* mjs_addGeom(mjsBody* body, const mjsDefault* def); // Add camera to body. -MJAPI mjsCamera* mjs_addCamera(mjsBody* body, mjsDefault* def); +MJAPI mjsCamera* mjs_addCamera(mjsBody* body, const mjsDefault* def); // Add light to body. -MJAPI mjsLight* mjs_addLight(mjsBody* body, mjsDefault* def); +MJAPI mjsLight* mjs_addLight(mjsBody* body, const mjsDefault* def); // Add frame to body. MJAPI mjsFrame* mjs_addFrame(mjsBody* body, mjsFrame* parentframe); @@ -115,7 +115,7 @@ MJAPI void mjs_delete(mjsElement* element); //---------------------------------- Add non-tree elements ----------------------------------------- // Add actuator. -MJAPI mjsActuator* mjs_addActuator(mjSpec* s, mjsDefault* def); +MJAPI mjsActuator* mjs_addActuator(mjSpec* s, const mjsDefault* def); // Add sensor. MJAPI mjsSensor* mjs_addSensor(mjSpec* s); @@ -124,16 +124,16 @@ MJAPI mjsSensor* mjs_addSensor(mjSpec* s); MJAPI mjsFlex* mjs_addFlex(mjSpec* s); // Add contact pair. -MJAPI mjsPair* mjs_addPair(mjSpec* s, mjsDefault* def); +MJAPI mjsPair* mjs_addPair(mjSpec* s, const mjsDefault* def); // Add excluded body pair. MJAPI mjsExclude* mjs_addExclude(mjSpec* s); // Add equality. -MJAPI mjsEquality* mjs_addEquality(mjSpec* s, mjsDefault* def); +MJAPI mjsEquality* mjs_addEquality(mjSpec* s, const mjsDefault* def); // Add tendon. -MJAPI mjsTendon* mjs_addTendon(mjSpec* s, mjsDefault* def); +MJAPI mjsTendon* mjs_addTendon(mjSpec* s, const mjsDefault* def); // Wrap site using tendon. MJAPI mjsWrap* mjs_wrapSite(mjsTendon* tendon, const char* name); @@ -169,7 +169,7 @@ MJAPI mjsDefault* mjs_addDefault(mjSpec* s, const char* classname, const mjsDefa //---------------------------------- Add assets ---------------------------------------------------- // Add mesh. -MJAPI mjsMesh* mjs_addMesh(mjSpec* s, mjsDefault* def); +MJAPI mjsMesh* mjs_addMesh(mjSpec* s, const mjsDefault* def); // Add height field. MJAPI mjsHField* mjs_addHField(mjSpec* s); @@ -181,7 +181,7 @@ MJAPI mjsSkin* mjs_addSkin(mjSpec* s); MJAPI mjsTexture* mjs_addTexture(mjSpec* s); // Add material. -MJAPI mjsMaterial* mjs_addMaterial(mjSpec* s, mjsDefault* def); +MJAPI mjsMaterial* mjs_addMaterial(mjSpec* s, const mjsDefault* def); //---------------------------------- Find/get utilities -------------------------------------------- @@ -208,7 +208,7 @@ MJAPI mjsFrame* mjs_findFrame(mjSpec* s, const char* name); MJAPI mjsDefault* mjs_getDefault(mjsElement* element); // Find default in model by class name. -MJAPI mjsDefault* mjs_findDefault(mjSpec* s, const char* classname); +MJAPI const mjsDefault* mjs_findDefault(mjSpec* s, const char* classname); // Get global default from model. MJAPI mjsDefault* mjs_getSpecDefault(mjSpec* s); @@ -353,7 +353,7 @@ MJAPI const double* mjs_getDouble(const mjDoubleVec* source, int* size); //---------------------------------- Other utilities ----------------------------------------------- // Set element's default. -MJAPI void mjs_setDefault(mjsElement* element, mjsDefault* def); +MJAPI void mjs_setDefault(mjsElement* element, const mjsDefault* def); // Set element's enlcosing frame. MJAPI void mjs_setFrame(mjsElement* dest, mjsFrame* frame); diff --git a/src/xml/xml_native_reader.cc b/src/xml/xml_native_reader.cc index 6a70d13e..0037a77a 100644 --- a/src/xml/xml_native_reader.cc +++ b/src/xml/xml_native_reader.cc @@ -2383,7 +2383,7 @@ void mjXReader::OneActuator(XMLElement* elem, mjsActuator* actuator) { // make composite -void mjXReader::OneComposite(XMLElement* elem, mjsBody* body, mjsDefault* def) { +void mjXReader::OneComposite(XMLElement* elem, mjsBody* body, const mjsDefault* def) { string text; int n; @@ -3188,7 +3188,7 @@ void mjXReader::Asset(XMLElement* section, const mjVFS* vfs) { name = elem->Value(); // get class if specified, otherwise use default0 - mjsDefault* def = GetClass(elem); + const mjsDefault* def = GetClass(elem); if (!def) { def = mjs_getSpecDefault(spec); } @@ -3408,7 +3408,7 @@ void mjXReader::Body(XMLElement* section, mjsBody* body, mjsFrame* frame, name = elem->Value(); // get class if specified, otherwise use body - mjsDefault* def = GetClass(elem); + const mjsDefault* def = GetClass(elem); if (!def) { def = mjs_getDefault(frame ? frame->element : body->element); } @@ -3519,13 +3519,10 @@ void mjXReader::Body(XMLElement* section, mjsBody* body, mjsFrame* frame, // frame sub-element else if (name=="frame") { // read childdef - mjsDefault* childdef = 0; - if (ReadAttrTxt(elem, "childclass", text)) { - childdef = mjs_findDefault(spec, text.c_str()); - mjs_findDefault(spec, text.c_str()); - if (!childdef) { - throw mjXError(elem, "unknown default childclass"); - } + bool has_childclass = ReadAttrTxt(elem, "childclass", text); + const mjsDefault* childdef = has_childclass ? mjs_findDefault(spec, text.c_str()) : nullptr; + if (has_childclass && !childdef) { + throw mjXError(elem, "unknown default childclass"); } // create frame @@ -3568,13 +3565,10 @@ void mjXReader::Body(XMLElement* section, mjsBody* body, mjsFrame* frame, mjs_resolveOrientation(rotation, spec->compiler.degree, spec->compiler.eulerseq, &alt); // read childdef - mjsDefault* childdef = 0; - if (ReadAttrTxt(elem, "childclass", text)) { - childdef = mjs_findDefault(spec, text.c_str()); - mjs_findDefault(spec, text.c_str()); - if (!childdef) { - throw mjXError(elem, "unknown default childclass"); - } + bool has_childclass = ReadAttrTxt(elem, "childclass", text); + const mjsDefault* childdef = has_childclass ? mjs_findDefault(spec, text.c_str()) : nullptr; + if (has_childclass && !childdef) { + throw mjXError(elem, "unknown default childclass"); } // create subtree @@ -3622,13 +3616,10 @@ void mjXReader::Body(XMLElement* section, mjsBody* body, mjsFrame* frame, // body sub-element else if (name=="body") { // read childdef - mjsDefault* childdef = 0; - if (ReadAttrTxt(elem, "childclass", text)) { - childdef = mjs_findDefault(spec, text.c_str()); - mjs_findDefault(spec, text.c_str()); - if (!childdef) { - throw mjXError(elem, "unknown default childclass"); - } + bool has_childclass = ReadAttrTxt(elem, "childclass", text); + const mjsDefault* childdef = has_childclass ? mjs_findDefault(spec, text.c_str()) : nullptr; + if (has_childclass && !childdef) { + throw mjXError(elem, "unknown default childclass"); } // create child body @@ -3720,7 +3711,7 @@ void mjXReader::Contact(XMLElement* section) { name = elem->Value(); // get class if specified, otherwise use default0 - mjsDefault* def = GetClass(elem); + const mjsDefault* def = GetClass(elem); if (!def) { def = mjs_getSpecDefault(spec); } @@ -3765,7 +3756,7 @@ void mjXReader::Equality(XMLElement* section) { elem = FirstChildElement(section); while (elem) { // get class if specified, otherwise use default0 - mjsDefault* def = GetClass(elem); + const mjsDefault* def = GetClass(elem); if (!def) { def = mjs_getSpecDefault(spec); } @@ -3793,7 +3784,7 @@ void mjXReader::Deformable(XMLElement* section, const mjVFS* vfs) { name = elem->Value(); // get class if specified, otherwise use default0 - mjsDefault* def = GetClass(elem); + const mjsDefault* def = GetClass(elem); if (!def) { def = mjs_getSpecDefault(spec); } @@ -3829,7 +3820,7 @@ void mjXReader::Tendon(XMLElement* section) { elem = FirstChildElement(section); while (elem) { // get class if specified, otherwise use default0 - mjsDefault* def = GetClass(elem); + const mjsDefault* def = GetClass(elem); if (!def) { def = mjs_getSpecDefault(spec); } @@ -3895,7 +3886,7 @@ void mjXReader::Actuator(XMLElement* section) { elem = FirstChildElement(section); while (elem) { // get class if specified, otherwise use default0 - mjsDefault* def = GetClass(elem); + const mjsDefault* def = GetClass(elem); if (!def) { def = mjs_getSpecDefault(spec); } @@ -4306,19 +4297,19 @@ void mjXReader::Keyframe(XMLElement* section) { // get defaults class -mjsDefault* mjXReader::GetClass(XMLElement* section) { +const mjsDefault* mjXReader::GetClass(XMLElement* section) { string text; - mjsDefault* def = nullptr; - if (ReadAttrTxt(section, "class", text)) { - def = mjs_findDefault(spec, text.c_str()); - if (!def) { - throw mjXError( - section, - string("unknown default class name '" + text + "'").c_str()); - } + if (!ReadAttrTxt(section, "class", text)) { + return nullptr; } + const mjsDefault* def = mjs_findDefault(spec, text.c_str()); + if (!def) { + throw mjXError( + section, + string("unknown default class name '" + text + "'").c_str()); + } return def; } diff --git a/src/xml/xml_native_reader.h b/src/xml/xml_native_reader.h index 62488b97..41aacbbb 100644 --- a/src/xml/xml_native_reader.h +++ b/src/xml/xml_native_reader.h @@ -80,12 +80,12 @@ class mjXReader : public mjXBase { void OneEquality(tinyxml2::XMLElement* elem, mjsEquality* pequality); void OneTendon(tinyxml2::XMLElement* elem, mjsTendon* ptendon); void OneActuator(tinyxml2::XMLElement* elem, mjsActuator* pactuator); - void OneComposite(tinyxml2::XMLElement* elem, mjsBody* pbody, mjsDefault* def); + void OneComposite(tinyxml2::XMLElement* elem, mjsBody* pbody, const mjsDefault* def); void OneFlexcomp(tinyxml2::XMLElement* elem, mjsBody* pbody, const mjVFS* vfs); void OnePlugin(tinyxml2::XMLElement* elem, mjsPlugin* plugin); mjXSchema schema; // schema used for validation - mjsDefault* GetClass(tinyxml2::XMLElement* section); // get default class name + const mjsDefault* GetClass(tinyxml2::XMLElement* section); // get default class name bool readingdefaults; // true while reading defaults