8000 Implement 'reverse' and 'sum' · jinja2cpp/Jinja2Cpp@647b340 · GitHub
[go: up one dir, main page]

Skip to content

Commit 647b340

Browse files
committed
Implement 'reverse' and 'sum'
1 parent 17d3aaf commit 647b340

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

src/filters.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "value_helpers.h"
44

55
#include <algorithm>
6+
#include <numeric>
67

78
namespace jinja2
89
{
@@ -188,6 +189,7 @@ SequenceAccessor::SequenceAccessor(FilterParams params, SequenceAccessor::Mode m
188189
case ReverseMode:
189190
break;
190191
case SumItemsMode:
192+
ParseParams({{"attribute", false}, {"start", false}}, params);
191193
break;
192194
case UniqueItemsMode:
193195
break;
@@ -247,12 +249,40 @@ InternalValue SequenceAccessor::Filter(const InternalValue& baseVal, RenderConte
247249
auto p = std::min_element(b, e, lessComparator);
248250
result = p != e ? *p : InternalValue();
249251
break;
250-
break;
251252
}
252253
case ReverseMode:
254+
{
255+
InternalValueList resultList(list.GetSize());
256+
for (int n = 0; n < list.GetSize(); ++ n)
257+
resultList[list.GetSize() - n - 1] = list.GetValueByIndex(n);
258+
259+
result = ListAdapter::CreateAdapter(std::move(resultList));
253260
break;
261+
}
254262
case SumItemsMode:
263+
{
264+
ListAdapter l1;
265+
ListAdapter* actualList;
266+
if (IsEmpty(attrName))
267+
{
268+
actualList = &list;
269+
}
270+
else
271+
{
272+
l1 = list.ToSubscriptedList(attrName, true);
273+
actualList = &l1;
274+
}
275+
InternalValue start = GetArgumentValue("start", context);
276+
InternalValue resultVal = std::accumulate(actualList->begin(), actualList->end(), start, [](const InternalValue& cur, const InternalValue& val) {
277+
if (IsEmpty(cur))
278+
return val;
279+
280+
return Apply2<visitors::BinaryMathOperation>(cur, val, BinaryExpression::Plus);
281+
});
282+
283+
result = std::move(resultVal);
255284
break;
285+
}
256286
case UniqueItemsMode:
257287
break;
258288
}

test/filters_test.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,20 @@ INSTANTIATE_TEST_CASE_P(Max, FilterGenericTest, ::testing::Values(
118118
InputOutputPair{"('str1', 'str2', 'str3', 'str4', 'str5', 'Str6') | max(true)", "str5"},
119119
InputOutputPair{"('str1', 'str2', 'str3', 'str4', 'str5', 'Str6') | max(case_sensitive=true)", "str5"}
120120
));
121+
122+
INSTANTIATE_TEST_CASE_P(Reverse, ListIteratorTest, ::testing::Values(
123+
InputOutputPair{"['str1', 'str2', 'str3'] | reverse", "str3, str2, str1"},
124+
InputOutputPair{"[3, 1, 2] | reverse", "2, 1, 3"},
125+
InputOutputPair{"reflectedIntVector | reverse", "4, 5, 3, 6, 2, 7, 1, 8, 0, 9"}
126+
));
127+
128+
INSTANTIATE_TEST_CASE_P(Sum, FilterGenericTest, ::testing::Values(
129+
InputOutputPair{"[1, 2, 3, 4, 5] | sum", "15"},
130+
InputOutputPair{"[] | sum(start=15)", "15"},
131+
InputOutputPair{"intValue | sum", ""},
132+
InputOutputPair{"intList | sum(start=10)", "55"},
133+
InputOutputPair{"stringValue | sum", "rain"},
134+
InputOutputPair{"('str1', 'str2', 'str3', 'str4', 'str5', 'Str6') | sum", "str1str2str3str4str5Str6"},
135+
InputOutputPair{"('str1', 'str2', 'str3', 'str4', 'str5', 'Str6') | sum(start='Hello')", "Hellostr1str2str3str4str5Str6"},
136+
InputOutputPair{"reflectedList | sum(attribute='strValue')", "test string 0test string 1test string 2test string 3test string 4test string 5test string 6test string 7test string 8test string 9"}
137+
));

0 commit comments

Comments
 (0)
0