From 0ae9ba37f9278f394d586cf4b6b44e8e5a63a7ef Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Thu, 22 Feb 2024 08:11:46 -0800 Subject: [PATCH] Replace PointToLocal with operator overload in mjCDef. PiperOrigin-RevId: 609376948 Change-Id: Id69909d06ab48824a9cbe0d5a305e8f8b72a193d --- src/user/user_api.cc | 1 - src/user/user_composite.cc | 7 ------- src/user/user_model.cc | 1 - src/user/user_objects.cc | 35 ++++++++++++++++++++++++++++++++++- src/user/user_objects.h | 8 +++++--- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/user/user_api.cc b/src/user/user_api.cc index 87e0839e..cb735dcb 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -405,7 +405,6 @@ int mjm_getId(mjElement element) { void mjm_setDefault(mjElement element, mjmDefault* defspec) { mjCBase* baseC = reinterpret_cast(element); baseC->def = reinterpret_cast(defspec->element); - baseC->def->PointToLocal(); } diff --git a/src/user/user_composite.cc b/src/user/user_composite.cc index 55ad7bef..2aa04775 100644 --- a/src/user/user_composite.cc +++ b/src/user/user_composite.cc @@ -125,13 +125,6 @@ bool mjCComposite::AddDefaultJoint(char* error, int error_sz) { jnt.spec.joint->group = 3; defjoint[(mjtCompKind)i].push_back(jnt); } - - // TODO: push_back might invoke a copy constructor, we undo its effect on pointers here - for (int i=0; i=0 && parentidchildid.push_back(thisid); - def->PointToLocal(); } def->parentid = parentid; def->name = name; diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index a475a76d..b1cb21ba 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -483,11 +483,20 @@ mjCDef::mjCDef(void) { mjm_defaultEquality(equality.spec); mjm_defaultTendon(tendon.spec); mjm_defaultActuator(actuator.spec); + + // make sure all the pointers are local PointToLocal(); } +// copy constructor +mjCDef::mjCDef(const mjCDef& other) { + *this = other; +} + + + // compiler void mjCDef::Compile(const mjCModel* model) { // enforce length of all default userdata arrays @@ -501,7 +510,31 @@ void mjCDef::Compile(const mjCModel* model) { -// assignment operator (TODO: use overloading) +// assignment operator +mjCDef& mjCDef::operator=(const mjCDef& other) { + if (this != &other) { + name = other.name; + parentid = other.parentid; + childid = other.childid; + joint = other.joint; + geom = other.geom; + site = other.site; + camera = other.camera; + light = other.light; + flex = other.flex; + mesh = other.mesh; + material = other.material; + pair = other.pair; + equality = other.equality; + tendon = other.tendon; + actuator = other.actuator; + } + PointToLocal(); + return *this; +} + + + void mjCDef::PointToLocal() { joint.PointToLocal(); geom.PointToLocal(); diff --git a/src/user/user_objects.h b/src/user/user_objects.h index 2bafb703..d45e6968 100644 --- a/src/user/user_objects.h +++ b/src/user/user_objects.h @@ -1394,9 +1394,11 @@ class mjCDef { friend class mjXWriter; public: - mjCDef(void); // constructor - void Compile(const mjCModel* model); // compiler - void PointToLocal(); + mjCDef(void); // constructor + mjCDef(const mjCDef& other); // copy constructor + void Compile(const mjCModel* model); // compiler + mjCDef& operator=(const mjCDef& other); // copy assignment + void PointToLocal(void); // identifiers std::string name; // class name