diff options
author | Vicnet <vo.publique@gmail.com> | 2013-10-07 11:04:28 (GMT) |
---|---|---|
committer | Vicnet <vo.publique@gmail.com> | 2013-10-07 14:04:43 (GMT) |
commit | 9bc73ac106a78398b744c2cd6c997055d8d2de9d (patch) | |
tree | 98dccb0e0c2ac574cb2420779256712e94f62660 /src/control.cc | |
parent | e5484b1081c9a75a23b47491e0c6485c71bfdaea (diff) |
add range on children()
Diffstat (limited to 'src/control.cc')
-rw-r--r-- | src/control.cc | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/src/control.cc b/src/control.cc index 7293963..db12f71 100644 --- a/src/control.cc +++ b/src/control.cc @@ -78,12 +78,8 @@ void ControlModule::for_eval(AbstractNode &node, const ModuleInstantiation &inst Context c(ctx); if (it_values.type() == Value::RANGE) { Value::RangeType range = it_values.toRange(); - if (range.end < range.begin) { - double t = range.begin; - range.begin = range.end; - range.end = t; - } - if (range.step > 0 && (range.begin-range.end)/range.step < 10000) { + range.normalize(); + if ((range.step > 0) && (range.begin-range.end)/range.step < 10000) { for (double i = range.begin; i <= range.end; i += range.step) { c.set_variable(it_name, Value(i)); for_eval(node, inst, l+1, &c, evalctx); @@ -132,12 +128,12 @@ AbstractNode* ControlModule::getChild(const Value& value, const EvalContext* mod if (value.type()!=Value::NUMBER) { // Invalid parameter // (e.g. first child of difference is invalid) - PRINTB("WARNING: Bad parameter type (%s) for children, only accept: empty, number.", value.toString()); + PRINTB("WARNING: Bad parameter type (%s) for children, only accept: empty, number, vector, range.", value.toString()); return NULL; } double v; if (!value.getDouble(v)) { - PRINTB("WARNING: Bad parameter type (%s) for children, only accept: empty, number.", value.toString()); + PRINTB("WARNING: Bad parameter type (%s) for children, only accept: empty, number, vector, range.", value.toString()); return NULL; } @@ -205,6 +201,7 @@ AbstractNode *ControlModule::instantiate(const Context* /*ctx*/, const ModuleIns AbstractNode* node = new AbstractNode(inst); for (int n = 0; n < (int)modulectx->numChildren(); ++n) { AbstractNode* childnode = modulectx->getChild(n)->evaluate(modulectx); + if (childnode==NULL) continue; // error node->children.push_back(childnode); } return node; @@ -215,7 +212,7 @@ AbstractNode *ControlModule::instantiate(const Context* /*ctx*/, const ModuleIns if (value.type() == Value::NUMBER) { return getChild(value,modulectx); } - if (value.type() == Value::VECTOR) { + else if (value.type() == Value::VECTOR) { AbstractNode* node = new AbstractNode(inst); const Value::VectorType& vect = value.toVector(); foreach (const Value::VectorType::value_type& vectvalue, vect) { @@ -225,10 +222,25 @@ AbstractNode *ControlModule::instantiate(const Context* /*ctx*/, const ModuleIns } return node; } + else if (value.type() == Value::RANGE) { + AbstractNode* node = new AbstractNode(inst); + Value::RangeType range = value.toRange(); + range.normalize(); + if ((range.step>0) && ((range.begin-range.end)/range.step>=10000)) { + PRINTB("WARNING: Bad range parameter for children: too many elements (%d).", (int)((range.begin-range.end)/range.step)); + return NULL; + } + for (double i = range.begin; i <= range.end; i += range.step) { + AbstractNode* childnode = getChild(Value(i),modulectx); // with error cases + if (childnode==NULL) continue; // error + node->children.push_back(childnode); + } + return node; + } else { // Invalid parameter // (e.g. first child of difference is invalid) - PRINTB("WARNING: Bad parameter type (%s) for children, only accept: empty, number.", value.toString()); + PRINTB("WARNING: Bad parameter type (%s) for children, only accept: empty, number, vector, range.", value.toString()); return NULL; } } |