Skip to content

Commit bfe5eb2

Browse files
committed
Directly call Slice constructor for slice expressions
This reduces the generated Cpp code. No temporary array is generated anymore for the index set (range expression).
1 parent 0af318b commit bfe5eb2

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

Compiler/Template/CodegenCppCommon.tpl

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ template daeExpCrefIndexSpec(list<Subscript> subs, Context context,
458458
::=
459459
let tmp_slice = tempDecl("vector<Slice>", &varDecls /*BUFD*/)
460460
let &preExp += '<%tmp_slice%>.clear();<%\n%>'
461-
let idx_str = (subs |> sub hasindex i1 =>
461+
let _ = (subs |> sub hasindex i1 =>
462462
match sub
463463
case INDEX(__) then
464464
let expPart = daeExp(exp, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
@@ -468,12 +468,23 @@ template daeExpCrefIndexSpec(list<Subscript> subs, Context context,
468468
let &preExp += '<%tmp_slice%>.push_back(Slice());<%\n%>'
469469
''
470470
case SLICE(__) then
471-
let expPart = daeExp(exp, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
472-
let &preExp += '<%tmp_slice%>.push_back(Slice(<%expPart%>));<%\n%>'
473-
''
471+
match exp
472+
case RANGE(__) then
473+
let start_exp = daeExp(start, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
474+
let stop_exp = daeExp(stop, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
475+
let step_exp = match step case SOME(stepExp) then daeExp(stepExp, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) else "1"
476+
let &preExp += '<%tmp_slice%>.push_back(Slice(<%start_exp%>, <%step_exp%>, <%stop_exp%>));<%\n%>'
477+
''
478+
else
479+
// this default branch should not be used because exp is a range
480+
let expPart = daeExp(exp, context, &preExp /*BUFC*/, &varDecls /*BUFD*/, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
481+
let &preExp += '<%tmp_slice%>.push_back(Slice(<%expPart%>));<%\n%>'
482+
''
483+
end match
474484
;separator="\n ")
475-
<<<%tmp_slice%>>>
485+
'<%tmp_slice%>'
476486
end daeExpCrefIndexSpec;
487+
477488
template daeExpCrefRhsArrayBox(ComponentRef cr,DAE.Type ty, Context context, Text &preExp /*BUFP*/,
478489
Text &varDecls /*BUFP*/,SimCode simCode, Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace)
479490
"Helper to daeExpCrefRhs."
@@ -1990,7 +2001,7 @@ template daeExpCall(Exp call, Context context, Text &preExp /*BUFP*/, Text &varD
19902001
let tvar = match ty
19912002
case T_ARRAY(ty=elty) then
19922003
// use dynamic array as static arrays are treated during translation
1993-
'DynArrayDim1<<%expTypeShort(elty)%>>(<%expVar%>.getNumElems(), <%expVar%>.getData())'
2004+
'DynArrayDim1<<%expTypeShort(elty)%>>(<%expVar%>.getNumElems(), ConstArray(<%expVar%>).getData())'
19942005
else
19952006
// this should never happen because it is eliminated during translation
19962007
'StatArrayDim1<<%expTypeShort(ty)%>, 1, true>(&<%expVar%>)'

0 commit comments

Comments
 (0)