summaryrefslogtreecommitdiff
path: root/src/control.cc
diff options
context:
space:
mode:
authorVicnet <vo.publique@gmail.com>2013-10-07 11:04:28 (GMT)
committerVicnet <vo.publique@gmail.com>2013-10-07 14:04:43 (GMT)
commit9bc73ac106a78398b744c2cd6c997055d8d2de9d (patch)
tree98dccb0e0c2ac574cb2420779256712e94f62660 /src/control.cc
parente5484b1081c9a75a23b47491e0c6485c71bfdaea (diff)
add range on children()
Diffstat (limited to 'src/control.cc')
-rw-r--r--src/control.cc32
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;
}
}
contact: Jan Huwald // Impressum