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
156157ExpressionFilter::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
188189bool 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