Skip to content

Commit 0b062ae

Browse files
committed
Make the distinguish between public interface 'Value' and internal value
representation
1 parent 248dec6 commit 0b062ae

20 files changed

+923
-312
lines changed

src/expression_evaluator.cpp

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "expression_evaluator.h"
22
#include "filters.h"
3+
#include "internal_value.h"
34
#include "testers.h"
45
#include "value_visitors.h"
56

@@ -62,12 +63,12 @@ std::unordered_map<std::string, IsExpression::TesterFactoryFn> IsExpression::s_t
6263
{"startsWith", &TesterFactory<testers::StartsWith>::Create},
6364
};
6465

65-
Value FullExpressionEvaluator::Evaluate(RenderContext& values)
66+
InternalValue FullExpressionEvaluator::Evaluate(RenderContext& values)
6667
{
6768
if (!m_expression)
68-
return Value();
69+
return InternalValue();
6970

70-
Value origVal = m_expression->Evaluate(values);
71+
InternalValue origVal = m_expression->Evaluate(values);
7172
if (m_filter)
7273
origVal = m_filter->Evaluate(origVal, values);
7374

@@ -77,31 +78,31 @@ Value FullExpressionEvaluator::Evaluate(RenderContext& values)
7778
return origVal;
7879
}
7980

80-
Value ValueRefExpression::Evaluate(RenderContext& values)
81+
InternalValue ValueRefExpression::Evaluate(RenderContext& values)
8182
{
8283
bool found = false;
8384
auto p = values.FindValue(m_valueName, found);
8485
if (found)
8586
return p->second;
8687

87-
return Value();
88+
return InternalValue();
8889
}
8990

90-
Value SubscriptExpression::Evaluate(RenderContext& values)
91+
InternalValue SubscriptExpression::Evaluate(RenderContext& values)
9192
{
92-
return m_value->Evaluate(values).subscript(m_subscriptExpr->Evaluate(values));
93+
return Subscript(m_value->Evaluate(values), m_subscriptExpr->Evaluate(values));
9394
}
9495

95-
Value UnaryExpression::Evaluate(RenderContext& values)
96+
InternalValue UnaryExpression::Evaluate(RenderContext& values)
9697
{
97-
return boost::apply_visitor(visitors::UnaryOperation(m_oper), m_expr->Evaluate(values).data());
98+
return Apply<visitors::UnaryOperation>(m_expr->Evaluate(values), m_oper);
9899
}
99100

100-
Value BinaryExpression::Evaluate(RenderContext& context)
101+
InternalValue BinaryExpression::Evaluate(RenderContext& context)
101102
{
102-
Value leftVal = m_leftExpr->Evaluate(context);
103-
Value rightVal = m_rightExpr->Evaluate(context);
104-
Value result;
103+
InternalValue leftVal = m_leftExpr->Evaluate(context);
104+
InternalValue rightVal = m_rightExpr->Evaluate(context);
105+
InternalValue result;
105106

106107
switch (m_oper)
107108
{
@@ -122,7 +123,7 @@ Value BinaryExpression::Evaluate(RenderContext& context)
122123
case jinja2::BinaryExpression::DivReminder:
123124
case jinja2::BinaryExpression::DivInteger:
124125
case jinja2::BinaryExpression::Pow:
125-
result = boost::apply_visitor(visitors::BinaryMathOperation(m_oper), leftVal.data(), rightVal.data());
126+
result = Apply2<visitors::BinaryMathOperation>(leftVal, rightVal, m_oper);
126127
break;
127128
case jinja2::BinaryExpression::StringConcat:
128129
default:
@@ -131,26 +132,26 @@ Value BinaryExpression::Evaluate(RenderContext& context)
131132
return result;
132133
}
133134

134-
Value TupleCreator::Evaluate(RenderContext& context)
135+
InternalValue TupleCreator::Evaluate(RenderContext& context)
135136
{
136-
ValuesList result;
137+
InternalValueList result;
137138
for (auto& e : m_exprs)
138139
{
139140
result.push_back(e->Evaluate(context));
140141
}
141142

142-
return Value(result);
143+
return ListAdapter::CreateAdapter(std::move(result));
143144
}
144145

145-
Value DictCreator::Evaluate(RenderContext& context)
146+
InternalValue DictCreator::Evaluate(RenderContext& context)
146147
{
147-
ValuesMap result;
148+
InternalValueMap result;
148149
for (auto& e : m_exprs)
149150
{
150151
result[e.first] = e.second->Evaluate(context);
151152
}
152153

153-
return Value(result);
154+
return MapAdapter::CreateAdapter(std::move(result));;
154155
}
155156

156157
ExpressionFilter::ExpressionFilter(std::string filterName, CallParams params)
@@ -162,7 +163,7 @@ ExpressionFilter::ExpressionFilter(std::string filterName, CallParams params)
162163
m_filter = p->second(std::move(params));
163164
}
164165

165-
Value ExpressionFilter::Evaluate(const Value& baseVal, RenderContext& context)
166+
InternalValue ExpressionFilter::Evaluate(const InternalValue& baseVal, RenderContext& context)
166167
{
167168
if (m_parentFilter)
168169
return m_filter->Filter(m_parentFilter->Evaluate(baseVal, context), context);
@@ -180,22 +181,23 @@ IsExpression::IsExpression(ExpressionEvaluatorPtr<> value, std::string tester, C
180181
m_tester = p->second(std::move(params));
181182
}
182183

183-
Value IsExpression::Evaluate(RenderContext& context)
184+
InternalValue IsExpression::Evaluate(RenderContext& context)
184185
{
185186
return m_tester->Test(m_value->Evaluate(context), context);
186187
}
187188

188189
bool IfExpression::Evaluate(RenderContext& context)
189190
{
190-
return boost::apply_visitor(visitors::BooleanEvaluator(), m_testExpr->Evaluate(context).data());
191+
return ConvertToBool(m_testExpr->Evaluate(context));
191192
}
192193

193-
Value IfExpression::EvaluateAltValue(RenderContext& context)
194+
InternalValue IfExpression::EvaluateAltValue(RenderContext& context)
194195
{
195-
return m_altValue ? m_altValue->Evaluate(context) : Value();
196+
return m_altValue ? m_altValue->Evaluate(context) : InternalValue();
196197
}
197198

198-
Value DictionaryCreator::Evaluate(RenderContext& context)
199+
/*
200+
InternalValue DictionaryCreator::Evaluate(RenderContext& context)
199201
{
200202
ValuesMap result;
201203
for (auto& i : m_items)
@@ -204,9 +206,9 @@ Value DictionaryCreator::Evaluate(RenderContext& context)
204206
}
205207
206208
return result;
207-
}
209+
}*/
208210

209-
Value CallExpression::Evaluate(RenderContext& values)
211+
InternalValue CallExpression::Evaluate(RenderContext& values)
210212
{
211213
std::string valueRef = boost::algorithm::join(m_valueRef, ".");
212214

@@ -215,29 +217,29 @@ Value CallExpression::Evaluate(RenderContext& values)
215217
else if (valueRef == "loop.cycle")
216218
return CallLoopCycle(values);
217219

218-
return Value();
220+
return InternalValue();
219221
}
220222

221-
Value CallExpression::CallGlobalRange(RenderContext& values)
223+
InternalValue CallExpression::CallGlobalRange(RenderContext& values)
222224
{
223225
bool isArgsParsed = true;
224226

225227
auto args = helpers::ParseCallParams({{"start"}, {"stop", true}, {"step"}}, m_params, isArgsParsed);
226228
if (!isArgsParsed)
227-
return Value();
229+
return InternalValue();
228230

229231

230232
auto startExpr = args["start"];
231233
auto stopExpr = args["stop"];
232234
auto stepExpr = args["step"];
233235

234-
Value startVal = startExpr ? startExpr->Evaluate(values) : Value();
235-
Value stopVal = stopExpr ? stopExpr->Evaluate(values) : Value();
236-
Value stepVal = stepExpr ? stepExpr->Evaluate(values) : Value();
236+
InternalValue startVal = startExpr ? startExpr->Evaluate(values) : InternalValue();
237+
InternalValue stopVal = stopExpr ? stopExpr->Evaluate(values) : InternalValue();
238+
InternalValue stepVal = stepExpr ? stepExpr->Evaluate(values) : InternalValue();
237239

238-
int64_t start = boost::apply_visitor(visitors::IntegerEvaluator(), startVal.data());
239-
int64_t stop = boost::apply_visitor(visitors::IntegerEvaluator(), stopVal.data());
240-
int64_t step = boost::apply_visitor(visitors::IntegerEvaluator(), stepVal.data());
240+
int64_t start = Apply<visitors::IntegerEvaluator>(startVal);
241+
int64_t stop = Apply<visitors::IntegerEvaluator>(stopVal);
242+
int64_t step = Apply<visitors::IntegerEvaluator>(stepVal);
241243

242244
if (!stepExpr)
243245
{
@@ -246,10 +248,10 @@ Value CallExpression::CallGlobalRange(RenderContext& values)
246248
else
247249
{
248250
if (step == 0)
249-
return Value();
251+
return InternalValue();
250252
}
251253

252-
class RangeGenerator : public ListItemAccessor
254+
class RangeGenerator : public IListAccessor
253255
{
254256
public:
255257
RangeGenerator(int64_t start, int64_t stop, int64_t step)
@@ -265,7 +267,7 @@ Value CallExpression::CallGlobalRange(RenderContext& values)
265267
auto count = distance / m_step;
266268
return count < 0 ? 0 : static_cast<size_t>(count);
267269
}
268-
Value GetValueByIndex(int64_t idx) const override
270+
InternalValue GetValueByIndex(int64_t idx) const override
269271
{
270272
return m_start + m_step * idx;
271273
}
@@ -276,18 +278,18 @@ Value CallExpression::CallGlobalRange(RenderContext& values)
276278
int64_t m_step;
277279
};
278280

279-
return GenericList([accessor = RangeGenerator(start, stop, step)]() -> const ListItemAccessor* {return &accessor;});
281+
return ListAdapter([accessor = RangeGenerator(start, stop, step)]() -> const IListAccessor* {return &accessor;});
280282
}
281283

282-
Value CallExpression::CallLoopCycle(RenderContext& values)
284+
InternalValue CallExpression::CallLoopCycle(RenderContext& values)
283285
{
284286
bool loopFound = false;
285287
auto loopValP = values.FindValue("loop", loopFound);
286288
if (!loopFound)
287-
return Value();
289+
return InternalValue();
288290

289-
const ValuesMap* loop = boost::get<ValuesMap>(&loopValP->second.data());
290-
int64_t baseIdx = boost::apply_visitor(visitors::IntegerEvaluator(), (*loop).at("index0").data());
291+
auto loop = boost::get<MapAdapter>(&loopValP->second);
292+
int64_t baseIdx = Apply<visitors::IntegerEvaluator>(loop->GetValueByName("index0"));
291293
auto idx = static_cast<size_t>(baseIdx % m_params.posParams.size());
292294
return m_params.posParams[idx]->Evaluate(values);
293295
}
@@ -422,7 +424,7 @@ ParsedArguments ParseCallParams(const std::initializer_list<ArgumentInfo>& args,
422424
continue;
423425
case NotFound:
424426
{
425-
if (!argInfo.info->defaultVal.isEmpty())
427+
if (!IsEmpty(argInfo.info->defaultVal))
426428
result.args[argInfo.info->name] = std::make_shared<ConstantExpression>(argInfo.info->defaultVal);
427429
break;
428430
}

0 commit comments

Comments
 (0)