Refactor Default class to use pointers instead of indices.
This in order to make it easier to append the default tree to another tree. PiperOrigin-RevId: 649812975 Change-Id: I2915ac7e37957e45eadc24d6caaf7beea236bf29
This commit is contained in:
committed by
Copybara-Service
parent
9d0812911c
commit
f57dc90669
@@ -440,7 +440,7 @@ mjsPlugin* mjs_addPlugin(mjSpec* s) {
|
|||||||
mjsDefault* mjs_addDefault(mjSpec* s, const char* classname, const mjsDefault* parent) {
|
mjsDefault* mjs_addDefault(mjSpec* s, const char* classname, const mjsDefault* parent) {
|
||||||
mjCModel* modelC = static_cast<mjCModel*>(s->element);
|
mjCModel* modelC = static_cast<mjCModel*>(s->element);
|
||||||
mjCDef* parentC = parent ? static_cast<mjCDef*>(parent->element) :
|
mjCDef* parentC = parent ? static_cast<mjCDef*>(parent->element) :
|
||||||
static_cast<mjCModel*>(s->element)->Defaults(0);
|
static_cast<mjCModel*>(s->element)->Default();
|
||||||
mjCDef* def = modelC->AddDefault(classname, parentC);
|
mjCDef* def = modelC->AddDefault(classname, parentC);
|
||||||
if (def) {
|
if (def) {
|
||||||
return &def->spec;
|
return &def->spec;
|
||||||
@@ -480,7 +480,7 @@ mjsDefault* mjs_findDefault(mjSpec* s, const char* classname) {
|
|||||||
// get default[0] from model
|
// get default[0] from model
|
||||||
mjsDefault* mjs_getSpecDefault(mjSpec* s) {
|
mjsDefault* mjs_getSpecDefault(mjSpec* s) {
|
||||||
mjCModel* modelC = static_cast<mjCModel*>(s->element);
|
mjCModel* modelC = static_cast<mjCModel*>(s->element);
|
||||||
mjCDef* def = modelC->Defaults(0);
|
mjCDef* def = modelC->Default();
|
||||||
if (!def) {
|
if (!def) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-11
@@ -560,7 +560,7 @@ bool mjCComposite::MakeParticle(mjCModel* model, mjsBody* body, char* error, int
|
|||||||
|
|
||||||
// create tendon
|
// create tendon
|
||||||
mjsTendon* ten = mjs_addTendon(&model->spec, &def[mjCOMPKIND_TENDON].spec);
|
mjsTendon* ten = mjs_addTendon(&model->spec, &def[mjCOMPKIND_TENDON].spec);
|
||||||
mjs_setDefault(ten->element, &model->Defaults(0)->spec);
|
mjs_setDefault(ten->element, &model->Default()->spec);
|
||||||
mjs_setString(ten->name, txt0);
|
mjs_setString(ten->name, txt0);
|
||||||
ten->group = 4;
|
ten->group = 4;
|
||||||
mjs_wrapSite(ten, txt1);
|
mjs_wrapSite(ten, txt1);
|
||||||
@@ -568,7 +568,7 @@ bool mjCComposite::MakeParticle(mjCModel* model, mjsBody* body, char* error, int
|
|||||||
|
|
||||||
// add equality constraint
|
// add equality constraint
|
||||||
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TENDON].spec);
|
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TENDON].spec);
|
||||||
mjs_setDefault(eq->element, &model->Defaults(0)->spec);
|
mjs_setDefault(eq->element, &model->Default()->spec);
|
||||||
eq->type = mjEQ_TENDON;
|
eq->type = mjEQ_TENDON;
|
||||||
mjs_setString(eq->name1, mjs_getString(ten->name));
|
mjs_setString(eq->name1, mjs_getString(ten->name));
|
||||||
}
|
}
|
||||||
@@ -674,7 +674,7 @@ bool mjCComposite::MakeGrid(mjCModel* model, mjsBody* body, char* error, int err
|
|||||||
|
|
||||||
// create tendon
|
// create tendon
|
||||||
mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_TENDON);
|
mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_TENDON);
|
||||||
ten->def = model->Defaults(0);
|
ten->def = model->Default();
|
||||||
mju::sprintf_arr(txt, "%sT%d_%d_%d", prefix.c_str(), i, ix, iy);
|
mju::sprintf_arr(txt, "%sT%d_%d_%d", prefix.c_str(), i, ix, iy);
|
||||||
ten->name = txt;
|
ten->name = txt;
|
||||||
ten->WrapSite(txt1);
|
ten->WrapSite(txt1);
|
||||||
@@ -682,7 +682,7 @@ bool mjCComposite::MakeGrid(mjCModel* model, mjsBody* body, char* error, int err
|
|||||||
|
|
||||||
// add equality constraint
|
// add equality constraint
|
||||||
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TENDON].spec);
|
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TENDON].spec);
|
||||||
mjs_setDefault(eq->element, &model->Defaults(0)->spec);
|
mjs_setDefault(eq->element, &model->Default()->spec);
|
||||||
eq->type = mjEQ_TENDON;
|
eq->type = mjEQ_TENDON;
|
||||||
mjs_setString(eq->name1, ten->name.c_str());
|
mjs_setString(eq->name1, ten->name.c_str());
|
||||||
}
|
}
|
||||||
@@ -1045,7 +1045,7 @@ mjsBody* mjCComposite::AddRopeBody(mjCModel* model, mjsBody* body, int ix, int i
|
|||||||
|
|
||||||
// add constraint
|
// add constraint
|
||||||
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TWIST].spec);
|
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TWIST].spec);
|
||||||
mjs_setDefault(eq->element, &model->Defaults(0)->spec);
|
mjs_setDefault(eq->element, &model->Default()->spec);
|
||||||
eq->type = mjEQ_JOINT;
|
eq->type = mjEQ_JOINT;
|
||||||
mjs_setString(eq->name1, mjs_getString(jnt->name));
|
mjs_setString(eq->name1, mjs_getString(jnt->name));
|
||||||
}
|
}
|
||||||
@@ -1063,7 +1063,7 @@ mjsBody* mjCComposite::AddRopeBody(mjCModel* model, mjsBody* body, int ix, int i
|
|||||||
|
|
||||||
// add constraint
|
// add constraint
|
||||||
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_STRETCH].spec);
|
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_STRETCH].spec);
|
||||||
mjs_setDefault(eq->element, &model->Defaults(0)->spec);
|
mjs_setDefault(eq->element, &model->Default()->spec);
|
||||||
eq->type = mjEQ_JOINT;
|
eq->type = mjEQ_JOINT;
|
||||||
mjs_setString(eq->name1, mjs_getString(jnt->name));
|
mjs_setString(eq->name1, mjs_getString(jnt->name));
|
||||||
}
|
}
|
||||||
@@ -1131,7 +1131,7 @@ bool mjCComposite::MakeBox(mjCModel* model, mjsBody* body, char* error, int erro
|
|||||||
|
|
||||||
// fixed tendon for all joints
|
// fixed tendon for all joints
|
||||||
mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_TENDON);
|
mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_TENDON);
|
||||||
ten->def = model->Defaults(0);
|
ten->def = model->Default();
|
||||||
mju::sprintf_arr(txt, "%sT", prefix.c_str());
|
mju::sprintf_arr(txt, "%sT", prefix.c_str());
|
||||||
ten->name = txt;
|
ten->name = txt;
|
||||||
|
|
||||||
@@ -1185,7 +1185,7 @@ bool mjCComposite::MakeBox(mjCModel* model, mjsBody* body, char* error, int erro
|
|||||||
|
|
||||||
// add fix constraint
|
// add fix constraint
|
||||||
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_JOINT].spec);
|
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_JOINT].spec);
|
||||||
mjs_setDefault(eq->element, &model->Defaults(0)->spec);
|
mjs_setDefault(eq->element, &model->Default()->spec);
|
||||||
eq->type = mjEQ_JOINT;
|
eq->type = mjEQ_JOINT;
|
||||||
mjs_setString(eq->name1, mjs_getString(jnt->name));
|
mjs_setString(eq->name1, mjs_getString(jnt->name));
|
||||||
|
|
||||||
@@ -1219,7 +1219,7 @@ bool mjCComposite::MakeBox(mjCModel* model, mjsBody* body, char* error, int erro
|
|||||||
|
|
||||||
// finalize fixed tendon
|
// finalize fixed tendon
|
||||||
mjsEquality* eqt = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TENDON].spec);
|
mjsEquality* eqt = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TENDON].spec);
|
||||||
mjs_setDefault(eqt->element, &model->Defaults(0)->spec);
|
mjs_setDefault(eqt->element, &model->Default()->spec);
|
||||||
eqt->type = mjEQ_TENDON;
|
eqt->type = mjEQ_TENDON;
|
||||||
mjs_setString(eqt->name1, ten->name.c_str());
|
mjs_setString(eqt->name1, ten->name.c_str());
|
||||||
|
|
||||||
@@ -1245,7 +1245,7 @@ void mjCComposite::MakeShear(mjCModel* model) {
|
|||||||
|
|
||||||
// create tendon
|
// create tendon
|
||||||
mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_SHEAR);
|
mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_SHEAR);
|
||||||
ten->def = model->Defaults(0);
|
ten->def = model->Default();
|
||||||
ten->WrapSite(txt1);
|
ten->WrapSite(txt1);
|
||||||
ten->WrapSite(txt2);
|
ten->WrapSite(txt2);
|
||||||
|
|
||||||
@@ -1255,7 +1255,7 @@ void mjCComposite::MakeShear(mjCModel* model) {
|
|||||||
|
|
||||||
// equality constraint
|
// equality constraint
|
||||||
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_SHEAR].spec);
|
mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_SHEAR].spec);
|
||||||
mjs_setDefault(eq->element, &model->Defaults(0)->spec);
|
mjs_setDefault(eq->element, &model->Default()->spec);
|
||||||
eq->type = mjEQ_TENDON;
|
eq->type = mjEQ_TENDON;
|
||||||
mjs_setString(eq->name1, txt);
|
mjs_setString(eq->name1, txt);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -517,7 +517,7 @@ bool mjCFlexcomp::Make(mjSpec* spec, mjsBody* body, char* error, int error_sz) {
|
|||||||
// create edge equality constraint
|
// create edge equality constraint
|
||||||
if (equality) {
|
if (equality) {
|
||||||
mjsEquality* pe = mjs_addEquality(&model->spec, &def.spec);
|
mjsEquality* pe = mjs_addEquality(&model->spec, &def.spec);
|
||||||
mjs_setDefault(pe->element, &model->Defaults(0)->spec);
|
mjs_setDefault(pe->element, &model->Default()->spec);
|
||||||
pe->type = mjEQ_FLEX;
|
pe->type = mjEQ_FLEX;
|
||||||
pe->active = true;
|
pe->active = true;
|
||||||
mjs_setString(pe->name1, name.c_str());
|
mjs_setString(pe->name1, name.c_str());
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ mjCMesh::mjCMesh(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
|
|
||||||
// in case this body is not compiled
|
// in case this body is not compiled
|
||||||
CopyFromSpec();
|
CopyFromSpec();
|
||||||
|
|||||||
@@ -807,8 +807,6 @@ mjCDef* mjCModel::FindDefault(string name) {
|
|||||||
|
|
||||||
// add default class to array
|
// add default class to array
|
||||||
mjCDef* mjCModel::AddDefault(string name, mjCDef* parent) {
|
mjCDef* mjCModel::AddDefault(string name, mjCDef* parent) {
|
||||||
int parentid = parent ? parent->id : 0;
|
|
||||||
|
|
||||||
// check for repeated name
|
// check for repeated name
|
||||||
int thisid = (int)defaults_.size();
|
int thisid = (int)defaults_.size();
|
||||||
for (int i=0; i<thisid; i++) {
|
for (int i=0; i<thisid; i++) {
|
||||||
@@ -823,14 +821,14 @@ mjCDef* mjCModel::AddDefault(string name, mjCDef* parent) {
|
|||||||
def->id = thisid;
|
def->id = thisid;
|
||||||
|
|
||||||
// initialize contents
|
// initialize contents
|
||||||
if (parentid>=0 && parentid<thisid) {
|
if (parent && parent->id<thisid) {
|
||||||
defaults_[parentid]->CopyFromSpec();
|
parent->CopyFromSpec();
|
||||||
*def = *defaults_[parentid];
|
*def = *parent;
|
||||||
defaults_[parentid]->childid.push_back(thisid);
|
parent->child.push_back(def);
|
||||||
}
|
}
|
||||||
def->parentid = parentid;
|
def->parent = parent;
|
||||||
def->name = name;
|
def->name = name;
|
||||||
def->childid.clear();
|
def->child.clear();
|
||||||
|
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ class mjCModel : public mjCModel_, private mjSpec {
|
|||||||
std::string get_meshdir() const { return meshdir_; }
|
std::string get_meshdir() const { return meshdir_; }
|
||||||
std::string get_texturedir() const { return texturedir_; }
|
std::string get_texturedir() const { return texturedir_; }
|
||||||
|
|
||||||
mjCDef* Defaults(int i) const { return defaults_[i]; }
|
mjCDef* Default() const { return defaults_[0]; }
|
||||||
int NumDefaults() const { return defaults_.size(); }
|
int NumDefaults() const { return defaults_.size(); }
|
||||||
|
|
||||||
const std::vector<std::pair<const mjpPlugin*, int>>& ActivePlugins() const {
|
const std::vector<std::pair<const mjpPlugin*, int>>& ActivePlugins() const {
|
||||||
|
|||||||
+14
-14
@@ -518,8 +518,8 @@ int mjCBoundingVolumeHierarchy::MakeBVH(
|
|||||||
mjCDef::mjCDef() {
|
mjCDef::mjCDef() {
|
||||||
name.clear();
|
name.clear();
|
||||||
id = 0;
|
id = 0;
|
||||||
parentid = -1;
|
parent = nullptr;
|
||||||
childid.clear();
|
child.clear();
|
||||||
mjs_defaultJoint(&joint_.spec);
|
mjs_defaultJoint(&joint_.spec);
|
||||||
mjs_defaultGeom(&geom_.spec);
|
mjs_defaultGeom(&geom_.spec);
|
||||||
mjs_defaultSite(&site_.spec);
|
mjs_defaultSite(&site_.spec);
|
||||||
@@ -565,8 +565,8 @@ void mjCDef::Compile(const mjCModel* model) {
|
|||||||
mjCDef& mjCDef::operator=(const mjCDef& other) {
|
mjCDef& mjCDef::operator=(const mjCDef& other) {
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
name = other.name;
|
name = other.name;
|
||||||
parentid = other.parentid;
|
parent = other.parent;
|
||||||
childid = other.childid;
|
child = other.child;
|
||||||
joint_ = other.joint_;
|
joint_ = other.joint_;
|
||||||
geom_ = other.geom_;
|
geom_ = other.geom_;
|
||||||
site_ = other.site_;
|
site_ = other.site_;
|
||||||
@@ -1691,7 +1691,7 @@ mjCJoint::mjCJoint(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
|
|
||||||
// point to local
|
// point to local
|
||||||
@@ -1899,7 +1899,7 @@ mjCGeom::mjCGeom(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
|
|
||||||
// point to local
|
// point to local
|
||||||
@@ -2542,7 +2542,7 @@ mjCSite::mjCSite(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2688,7 +2688,7 @@ mjCCamera::mjCCamera(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
|
|
||||||
// point to local
|
// point to local
|
||||||
@@ -2842,7 +2842,7 @@ mjCLight::mjCLight(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
|
|
||||||
PointToLocal();
|
PointToLocal();
|
||||||
@@ -3887,7 +3887,7 @@ mjCMaterial::mjCMaterial(mjCModel* _model, mjCDef* _def) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
|
|
||||||
PointToLocal();
|
PointToLocal();
|
||||||
@@ -3974,7 +3974,7 @@ mjCPair::mjCPair(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
|
|
||||||
// point to local
|
// point to local
|
||||||
@@ -4335,7 +4335,7 @@ mjCEquality::mjCEquality(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
|
|
||||||
// point to local
|
// point to local
|
||||||
@@ -4497,7 +4497,7 @@ mjCTendon::mjCTendon(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
|
|
||||||
// point to local
|
// point to local
|
||||||
@@ -4975,7 +4975,7 @@ mjCActuator::mjCActuator(mjCModel* _model, mjCDef* _def) {
|
|||||||
|
|
||||||
// set model, def
|
// set model, def
|
||||||
model = _model;
|
model = _model;
|
||||||
def = (_def ? _def : (_model ? _model->Defaults(0) : 0));
|
def = (_def ? _def : (_model ? _model->Default() : 0));
|
||||||
classname = def ? def->name : "";
|
classname = def ? def->name : "";
|
||||||
|
|
||||||
// in case this actuator is not compiled
|
// in case this actuator is not compiled
|
||||||
|
|||||||
@@ -1635,8 +1635,8 @@ class mjCDef : public mjsElement {
|
|||||||
// identifiers
|
// identifiers
|
||||||
std::string name; // class name
|
std::string name; // class name
|
||||||
int id; // id of this default
|
int id; // id of this default
|
||||||
int parentid; // id of parent class
|
mjCDef* parent; // id of parent class
|
||||||
std::vector<int> childid; // ids of child classes
|
std::vector<mjCDef*> child; // child classes
|
||||||
|
|
||||||
mjsDefault spec;
|
mjsDefault spec;
|
||||||
|
|
||||||
|
|||||||
@@ -862,7 +862,7 @@ string mjXWriter::Write(char *error, size_t error_sz) {
|
|||||||
Visual(root);
|
Visual(root);
|
||||||
Statistic(root);
|
Statistic(root);
|
||||||
writingdefaults = true;
|
writingdefaults = true;
|
||||||
Default(root, model->Defaults(0));
|
Default(root, model->Default());
|
||||||
writingdefaults = false;
|
writingdefaults = false;
|
||||||
Extension(root);
|
Extension(root);
|
||||||
Custom(root);
|
Custom(root);
|
||||||
@@ -1192,8 +1192,8 @@ void mjXWriter::Default(XMLElement* root, mjCDef* def) {
|
|||||||
|
|
||||||
// pointer to parent defaults
|
// pointer to parent defaults
|
||||||
mjCDef* par;
|
mjCDef* par;
|
||||||
if (def->parentid>=0) {
|
if (def->parent) {
|
||||||
par = model->Defaults(def->parentid);
|
par = def->parent;
|
||||||
} else {
|
} else {
|
||||||
par = new mjCDef;
|
par = new mjCDef;
|
||||||
}
|
}
|
||||||
@@ -1260,19 +1260,19 @@ void mjXWriter::Default(XMLElement* root, mjCDef* def) {
|
|||||||
if (!elem->FirstAttribute()) section->DeleteChild(elem);
|
if (!elem->FirstAttribute()) section->DeleteChild(elem);
|
||||||
|
|
||||||
// if top-level class has no members or children, delete it and return
|
// if top-level class has no members or children, delete it and return
|
||||||
if (def->parentid<0 && section->NoChildren() && def->childid.empty()) {
|
if (!def->parent && section->NoChildren() && def->child.empty()) {
|
||||||
root->DeleteChild(section);
|
root->DeleteChild(section);
|
||||||
delete par;
|
delete par;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// add children recursively
|
// add children recursively
|
||||||
for (int i=0; i<(int)def->childid.size(); i++) {
|
for (int i=0; i<(int)def->child.size(); i++) {
|
||||||
Default(section, model->Defaults(def->childid[i]));
|
Default(section, def->child[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete parent defaults if allocated here
|
// delete parent defaults if allocated here
|
||||||
if (def->parentid<0) {
|
if (!def->parent) {
|
||||||
delete par;
|
delete par;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user