6
6
#include < algorithm>
7
7
#include < numeric>
8
8
#include < sstream>
9
+ #include < string>
10
+
11
+ using namespace std ::string_literals;
9
12
10
13
namespace jinja2
11
14
{
@@ -26,6 +29,7 @@ struct FilterFactory
26
29
};
27
30
28
31
std::unordered_map<std::string, ExpressionFilter::FilterFactoryFn> s_filters = {
32
+ {" abs" , FilterFactory<filters::ValueConverter>::MakeCreator (filters::ValueConverter::AbsMode)},
29
33
{" attr" , &FilterFactory<filters::Attribute>::Create},
30
34
{" batch" , FilterFactory<filters::Slice>::MakeCreator (filters::Slice::BatchMode)},
31
35
{" camelize" , FilterFactory<filters::StringConverter>::MakeCreator (filters::StringConverter::CamelMode)},
@@ -177,7 +181,7 @@ InternalValue Attribute::Filter(const InternalValue& baseVal, RenderContext& con
177
181
178
182
Default::Default (FilterParams params)
179
183
{
180
- ParseParams ({{" default_value" , false , InternalValue (std::string ( " " ) )}, {" boolean" , false , InternalValue (false )}}, params);
184
+ ParseParams ({{" default_value" , false , InternalValue (" " s )}, {" boolean" , false , InternalValue (false )}}, params);
181
185
}
182
186
183
187
InternalValue Default::Filter (const InternalValue& baseVal, Re
10000
nderContext& context)
@@ -196,7 +200,7 @@ InternalValue Default::Filter(const InternalValue& baseVal, RenderContext& conte
196
200
197
201
DictSort::DictSort (FilterParams params)
198
202
{
199
- ParseParams ({{" case_sensitive" , false }, {" by" , false , std::string ( " key" ) }, {" reverse" , false }}, params);
203
+ ParseParams ({{" case_sensitive" , false }, {" by" , false , " key" s }, {" reverse" , false }}, params);
200
204
}
201
205
202
206
InternalValue DictSort::Filter (const InternalValue& baseVal, RenderContext& context)
@@ -205,9 +209,9 @@ InternalValue DictSort::Filter(const InternalValue& baseVal, RenderContext& cont
205
209
if (map == nullptr )
206
210
return InternalValue ();
207
211
208
- InternalValue isReverseVal = GetArgumentValue (" reverse" , context, InternalValue ( false ) );
209
- InternalValue isCsVal = GetArgumentValue (" case_sensitive" , context, InternalValue ( false ) );
210
- InternalValue byVal = GetArgumentValue (" by" , context, InternalValue ( std::string ( " key " )) );
212
+ InternalValue isReverseVal = GetArgumentValue (" reverse" , context);
213
+ InternalValue isCsVal = GetArgumentValue (" case_sensitive" , context);
214
+ InternalValue byVal = GetArgumentValue (" by" , context);
211
215
212
216
bool (*comparator)(const KeyValuePair& left, const KeyValuePair& right);
213
217
@@ -284,7 +288,7 @@ Map::Map(FilterParams params)
284
288
if (params.kwParams .size () == 1 && params.posParams .empty () && params.kwParams .count (" attribute" ) == 1 )
285
289
{
286
290
newParams.kwParams [" name" ] = params.kwParams [" attribute" ];
287
- newParams.kwParams [" filter" ] = std::make_shared<ConstantExpression>(std::string ( " attr" ) );
291
+ newParams.kwParams [" filter" ] = std::make_shared<ConstantExpression>(" attr" s );
288
292
}
289
293
else
290
294
{
@@ -382,22 +386,22 @@ struct PrettyPrinter : visitors::BaseVisitor<InternalValue>
382
386
383
387
InternalValue operator ()(const std::string& str) const
384
388
{
385
- return " '" + str + " '" ;
389
+ return " '" s + str + " '" s ;
386
390
}
387
391
388
392
InternalValue operator ()(const std::wstring& str) const
389
393
{
390
- return std::string ( " '<wchar_string>'" ) ;
394
+ return " '<wchar_string>'" s;
391
395
}
392
396
393
397
InternalValue operator ()(bool val) const
394
398
{
395
- return std::string ( val ? " true" : " false" ) ;
399
+ return val ? " true" s : " false" s ;
396
400
}
397
401
398
402
InternalValue operator ()(EmptyValue val) const
399
403
{
400
- return std::string ( " none" ) ;
404
+ return " none" s ;
401
405
}
402
406
403
407
InternalValue operator ()(double val) const
@@ -703,10 +707,94 @@ InternalValue Tester::Filter(const InternalValue& baseVal, RenderContext& contex
703
707
}
704
708
705
709
ValueConverter::ValueConverter (FilterParams params, ValueConverter::Mode mode)
710
+ : m_mode(mode)
706
711
{
712
+ switch (mode)
713
+ {
714
+ case ToFloatMode:
715
+ ParseParams ({{" default" , false }}, params);
716
+ break ;
717
+ case ToIntMode:
718
+ ParseParams ({{" default" , false }, {" base" , false , 10ll }}, params);
719
+ break ;
720
+ case ToListMode:
721
+ case AbsMode:
722
+ break ;
723
+ case RoundMode:
724
+ ParseParams ({{" precision" , false }, {" method" , false , " common" s}}, params);
725
+ break ;
707
726
727
+ }
708
728
}
709
729
730
+ struct ConverterParams
731
+ {
732
+ ValueConverter::Mode mode;
733
+ InternalValue defValule;
734
+ InternalValue base;
735
+ InternalValue prec;
736
+ InternalValue roundMethod;
737
+ };
738
+
739
+ struct ValueConverterImpl : visitors::BaseVisitor<>
740
+ {
741
+ using BaseVisitor::operator ();
742
+
743
+ ValueConverterImpl (ConverterParams params)
744
+ : m_params(std::move(params))
745
+ {
746
+ }
747
+
748
+ InternalValue operator ()(int64_t val) const
749
+ {
750
+ InternalValue result;
751
+ switch (m_params.mode )
752
+ {
753
+ case ValueConverter::ToFloatMode:
754
+ result = InternalValue (static_cast <double >(val));
755
+ break ;
756
+ case ValueConverter::AbsMode:
757
+ result = InternalValue (abs (val));
758
+ break ;
759
+ case ValueConverter::ToIntMode:
760
+ case ValueConverter::RoundMode:
761
+ result = val;
762
+ break ;
763
+ default :
764
+ break ;
765
+ }
766
+
767
+ return result;
768
+ }
769
+
770
+ InternalValue operator ()(double val) const
771
+ {
772
+ InternalValue result;
773
+ switch (m_params.mode )
774
+ {
775
+ case ValueConverter::ToFloatMode:
776
+ result = val;
777
+ break ;
778
+ case ValueConverter::ToIntMode:
779
+ result = static_cast <int64_t >(val);
780
+ break ;
781
+ case ValueConverter::AbsMode:
782
+ result = InternalValue (fabs (val));
783
+ break ;
784
+ case ValueConverter::RoundMode:
785
+ {
786
+ auto method = AsString (m_params.roundMethod );
787
+ // if (method == 'ceil')
788
+ break ;
789
+ }
790
+ default :
791
+ break ;
792
+ }
793
+ }
794
+
795
+ ConverterParams m_params;
796
+ };
797
+
710
798
InternalValue ValueConverter::Filter (const InternalValue& baseVal, RenderContext& context)
711
799
{
712
800
return InternalValue ();
0 commit comments