1 #include <mbgl/style/expression/dsl.hpp>
2 #include <mbgl/style/expression/error.hpp>
3 #include <mbgl/style/expression/literal.hpp>
4 #include <mbgl/style/expression/assertion.hpp>
5 #include <mbgl/style/expression/coercion.hpp>
6 #include <mbgl/style/expression/equals.hpp>
7 #include <mbgl/style/expression/step.hpp>
8 #include <mbgl/style/expression/interpolate.hpp>
9 #include <mbgl/style/expression/compound_expression.hpp>
10 
11 namespace mbgl {
12 namespace style {
13 namespace expression {
14 namespace dsl {
15 
compound(const char * op,std::vector<std::unique_ptr<Expression>> args)16 static std::unique_ptr<Expression> compound(const char* op, std::vector<std::unique_ptr<Expression>> args) {
17     ParsingContext ctx;
18     ParseResult result =  createCompoundExpression(op, std::move(args), ctx);
19     assert(result);
20     return std::move(*result);
21 }
22 
23 template <class... Args>
compound(const char * op,Args...args)24 static std::unique_ptr<Expression> compound(const char* op, Args... args) {
25     return compound(op, vec(std::move(args)...));
26 }
27 
error(std::string message)28 std::unique_ptr<Expression> error(std::string message) {
29     return std::make_unique<Error>(std::move(message));
30 }
31 
literal(const char * value)32 std::unique_ptr<Expression> literal(const char* value) {
33     return literal(std::string(value));
34 }
35 
literal(Value value)36 std::unique_ptr<Expression> literal(Value value) {
37     return std::make_unique<Literal>(value);
38 }
39 
literal(std::initializer_list<double> value)40 std::unique_ptr<Expression> literal(std::initializer_list<double> value) {
41     std::vector<Value> values;
42     for (auto i : value) {
43         values.push_back(i);
44     }
45     return literal(values);
46 }
47 
literal(std::initializer_list<const char * > value)48 std::unique_ptr<Expression> literal(std::initializer_list<const char *> value) {
49     std::vector<Value> values;
50     for (auto i : value) {
51         values.push_back(std::string(i));
52     }
53     return literal(values);
54 }
55 
number(std::unique_ptr<Expression> value)56 std::unique_ptr<Expression> number(std::unique_ptr<Expression> value) {
57     return std::make_unique<Assertion>(type::Number, vec(std::move(value)));
58 }
59 
string(std::unique_ptr<Expression> value)60 std::unique_ptr<Expression> string(std::unique_ptr<Expression> value) {
61     return std::make_unique<Assertion>(type::String, vec(std::move(value)));
62 }
63 
boolean(std::unique_ptr<Expression> value)64 std::unique_ptr<Expression> boolean(std::unique_ptr<Expression> value) {
65     return std::make_unique<Assertion>(type::Boolean, vec(std::move(value)));
66 }
67 
toColor(std::unique_ptr<Expression> value)68 std::unique_ptr<Expression> toColor(std::unique_ptr<Expression> value) {
69     return std::make_unique<Coercion>(type::Color, vec(std::move(value)));
70 }
71 
toString(std::unique_ptr<Expression> value)72 std::unique_ptr<Expression> toString(std::unique_ptr<Expression> value) {
73     return compound("to-string", std::move(value));
74 }
75 
get(const char * value)76 std::unique_ptr<Expression> get(const char* value) {
77     return get(literal(value));
78 }
79 
get(std::unique_ptr<Expression> property)80 std::unique_ptr<Expression> get(std::unique_ptr<Expression> property) {
81     return compound("get", std::move(property));
82 }
83 
id()84 std::unique_ptr<Expression> id() {
85     return compound("id");
86 }
87 
zoom()88 std::unique_ptr<Expression> zoom() {
89     return compound("zoom");
90 }
91 
eq(std::unique_ptr<Expression> lhs,std::unique_ptr<Expression> rhs)92 std::unique_ptr<Expression> eq(std::unique_ptr<Expression> lhs,
93                                std::unique_ptr<Expression> rhs) {
94     return std::make_unique<Equals>(std::move(lhs), std::move(rhs), nullopt, false);
95 }
96 
ne(std::unique_ptr<Expression> lhs,std::unique_ptr<Expression> rhs)97 std::unique_ptr<Expression> ne(std::unique_ptr<Expression> lhs,
98                                std::unique_ptr<Expression> rhs) {
99     return std::make_unique<Equals>(std::move(lhs), std::move(rhs), nullopt, true);
100 }
101 
gt(std::unique_ptr<Expression> lhs,std::unique_ptr<Expression> rhs)102 std::unique_ptr<Expression> gt(std::unique_ptr<Expression> lhs,
103                                std::unique_ptr<Expression> rhs) {
104     return compound(">", std::move(lhs), std::move(rhs));
105 }
106 
lt(std::unique_ptr<Expression> lhs,std::unique_ptr<Expression> rhs)107 std::unique_ptr<Expression> lt(std::unique_ptr<Expression> lhs,
108                                std::unique_ptr<Expression> rhs) {
109     return compound("<", std::move(lhs), std::move(rhs));
110 }
111 
step(std::unique_ptr<Expression> input,std::unique_ptr<Expression> output0,double input1,std::unique_ptr<Expression> output1)112 std::unique_ptr<Expression> step(std::unique_ptr<Expression> input,
113                                  std::unique_ptr<Expression> output0,
114                                  double input1, std::unique_ptr<Expression> output1) {
115     type::Type type = output0->getType();
116     std::map<double, std::unique_ptr<Expression>> stops;
117     stops[-std::numeric_limits<double>::infinity()] = std::move(output0);
118     stops[input1] = std::move(output1);
119     return std::make_unique<Step>(type, std::move(input), std::move(stops));
120 }
121 
linear()122 Interpolator linear() {
123     return ExponentialInterpolator(1.0);
124 }
125 
exponential(double base)126 Interpolator exponential(double base) {
127     return ExponentialInterpolator(base);
128 }
129 
cubicBezier(double x1,double y1,double x2,double y2)130 Interpolator cubicBezier(double x1, double y1, double x2, double y2) {
131     return CubicBezierInterpolator(x1, y1, x2, y2);
132 }
133 
interpolate(Interpolator interpolator,std::unique_ptr<Expression> input,double input1,std::unique_ptr<Expression> output1)134 std::unique_ptr<Expression> interpolate(Interpolator interpolator,
135                                         std::unique_ptr<Expression> input,
136                                         double input1, std::unique_ptr<Expression> output1) {
137     type::Type type = output1->getType();
138     std::map<double, std::unique_ptr<Expression>> stops;
139     stops[input1] = std::move(output1);
140     ParsingContext ctx;
141     ParseResult result = createInterpolate(type, interpolator, std::move(input), std::move(stops), ctx);
142     assert(result);
143     return std::move(*result);
144 }
145 
interpolate(Interpolator interpolator,std::unique_ptr<Expression> input,double input1,std::unique_ptr<Expression> output1,double input2,std::unique_ptr<Expression> output2)146 std::unique_ptr<Expression> interpolate(Interpolator interpolator,
147                                         std::unique_ptr<Expression> input,
148                                         double input1, std::unique_ptr<Expression> output1,
149                                         double input2, std::unique_ptr<Expression> output2) {
150     type::Type type = output1->getType();
151     std::map<double, std::unique_ptr<Expression>> stops;
152     stops[input1] = std::move(output1);
153     stops[input2] = std::move(output2);
154     ParsingContext ctx;
155     ParseResult result = createInterpolate(type, interpolator, std::move(input), std::move(stops), ctx);
156     assert(result);
157     return std::move(*result);
158 }
159 
interpolate(Interpolator interpolator,std::unique_ptr<Expression> input,double input1,std::unique_ptr<Expression> output1,double input2,std::unique_ptr<Expression> output2,double input3,std::unique_ptr<Expression> output3)160 std::unique_ptr<Expression> interpolate(Interpolator interpolator,
161                                         std::unique_ptr<Expression> input,
162                                         double input1, std::unique_ptr<Expression> output1,
163                                         double input2, std::unique_ptr<Expression> output2,
164                                         double input3, std::unique_ptr<Expression> output3) {
165     type::Type type = output1->getType();
166     std::map<double, std::unique_ptr<Expression>> stops;
167     stops[input1] = std::move(output1);
168     stops[input2] = std::move(output2);
169     stops[input3] = std::move(output3);
170     ParsingContext ctx;
171     ParseResult result = createInterpolate(type, interpolator, std::move(input), std::move(stops), ctx);
172     assert(result);
173     return std::move(*result);
174 }
175 
concat(std::vector<std::unique_ptr<Expression>> inputs)176 std::unique_ptr<Expression> concat(std::vector<std::unique_ptr<Expression>> inputs) {
177     return compound("concat", std::move(inputs));
178 }
179 
180 } // namespace dsl
181 } // namespace expression
182 } // namespace style
183 } // namespace mbgl
184