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