c_length_func = _c_accessor_get_expr(field.type.expr, field_mapping)
# create explicit code for computing the sum.
# This works for all C-types which can be added to int64_t with +=
+ member_type = field.type.member
+ needs_iterator = not member_type.fixed_size()
_c_pre.start()
lengthvar = _c_pre.get_tempvarname()
loopvar = _c_pre.get_tempvarname()
sumvar = _c_pre.get_tempvarname()
- listvar = _c_pre.get_tempvarname()
+ if needs_iterator:
+ iteratorvar = _c_pre.get_tempvarname()
+ else:
+ listvar = _c_pre.get_tempvarname()
_c_pre.tempvar("int %s; /* sumof length */", lengthvar)
_c_pre.tempvar("int %s; /* sumof loop counter */", loopvar)
_c_pre.tempvar("int64_t %s; /* sumof sum */", sumvar)
- _c_pre.tempvar(
- "const %s* %s; /* sumof list ptr */", field.c_field_type, listvar)
+ if needs_iterator:
+ _c_pre.tempvar(
+ "%s %s; /* sumof list iterator */",
+ field.c_iterator_type, iteratorvar)
+ else:
+ _c_pre.tempvar(
+ "const %s* %s; /* sumof list ptr */", field.c_field_type, listvar)
_c_pre.code("/* sumof start */")
_c_pre.code("%s = %s;", lengthvar, c_length_func)
_c_pre.code("%s = 0;", sumvar)
- _c_pre.code("%s = %s;", listvar, list_name)
+ if needs_iterator:
+ _c_pre.code("%s = %s;", iteratorvar, list_name)
+ else:
+ _c_pre.code("%s = %s;", listvar, list_name)
_c_pre.code(
"for (%s = 0; %s < %s; %s++) {",
loopvar, loopvar, lengthvar, loopvar)
_c_pre.indent()
if expr.rhs == None:
- _c_pre.code("%s += *%s;", sumvar, listvar)
+ if needs_iterator:
+ _c_pre.code("TODO")
+ else:
+ _c_pre.code("%s += *%s;", sumvar, listvar)
else:
# sumof has a nested expression which
# has to be evaluated in the context of this list element
# field mapping for the subexpression needs to include
# the fields of the list-member type
scoped_field_mapping = field_mapping.copy()
- scoped_field_mapping.update(
- _c_helper_field_mapping(
- field.type.member,
- [(listvar, '', field.type.member)]))
+ if needs_iterator:
+ scoped_field_mapping.update(
+ _c_helper_field_mapping(
+ field.type.member,
+ [(iteratorvar + ".data", '', field.type.member)]))
+ else:
+ scoped_field_mapping.update(
+ _c_helper_field_mapping(
+ field.type.member,
+ [(listvar, '', field.type.member)]))
# cause pre-code of the subexpression be added right here
_c_pre.end()
# output the summation expression
_c_pre.code("%s += %s;", sumvar, rhs_expr_str)
- _c_pre.code("%s++;", listvar);
+ if needs_iterator:
+ _c_pre.code("%s(&%s);", field.type.c_next_name, iteratorvar)
+ else:
+ _c_pre.code("%s++;", listvar);
_c_pre.pop_indent()
_c_pre.code("}")
_c_pre.code("/* sumof end. Result is in %s */", sumvar)