#include #include #include #include #include #include #include #include #include #include namespace mbgl { namespace style { namespace expression { namespace dsl { static std::unique_ptr compound(const char* op, std::vector> args) { ParsingContext ctx; ParseResult result = createCompoundExpression(op, std::move(args), ctx); assert(result); return std::move(*result); } template static std::unique_ptr compound(const char* op, Args... args) { return compound(op, vec(std::move(args)...)); } std::unique_ptr error(std::string message) { return std::make_unique(std::move(message)); } std::unique_ptr literal(const char* value) { return literal(std::string(value)); } std::unique_ptr literal(Value value) { return std::make_unique(value); } std::unique_ptr literal(std::initializer_list value) { std::vector values; for (auto i : value) { values.push_back(i); } return literal(values); } std::unique_ptr literal(std::initializer_list value) { std::vector values; for (auto i : value) { values.push_back(std::string(i)); } return literal(values); } std::unique_ptr assertion(type::Type type, std::unique_ptr value) { return std::make_unique(type, vec(std::move(value))); } std::unique_ptr number(std::unique_ptr value) { return assertion(type::Number, std::move(value)); } std::unique_ptr string(std::unique_ptr value) { return assertion(type::String, std::move(value)); } std::unique_ptr boolean(std::unique_ptr value) { return assertion(type::Boolean, std::move(value)); } std::unique_ptr toColor(std::unique_ptr value) { return std::make_unique(type::Color, vec(std::move(value))); } std::unique_ptr toString(std::unique_ptr value) { return std::make_unique(type::String, vec(std::move(value))); } std::unique_ptr toFormatted(std::unique_ptr value) { return std::make_unique(type::Formatted, vec(std::move(value))); } std::unique_ptr get(const char* value) { return get(literal(value)); } std::unique_ptr get(std::unique_ptr property) { return compound("get", std::move(property)); } std::unique_ptr id() { return compound("id"); } std::unique_ptr zoom() { return compound("zoom"); } std::unique_ptr eq(std::unique_ptr lhs, std::unique_ptr rhs) { return std::make_unique("==", std::move(lhs), std::move(rhs)); } std::unique_ptr ne(std::unique_ptr lhs, std::unique_ptr rhs) { return std::make_unique("!=", std::move(lhs), std::move(rhs)); } std::unique_ptr gt(std::unique_ptr lhs, std::unique_ptr rhs) { return std::make_unique(">", std::move(lhs), std::move(rhs)); } std::unique_ptr lt(std::unique_ptr lhs, std::unique_ptr rhs) { return std::make_unique("<", std::move(lhs), std::move(rhs)); } std::unique_ptr step(std::unique_ptr input, std::unique_ptr output0, double input1, std::unique_ptr output1) { type::Type type = output0->getType(); std::map> stops; stops[-std::numeric_limits::infinity()] = std::move(output0); stops[input1] = std::move(output1); return std::make_unique(type, std::move(input), std::move(stops)); } Interpolator linear() { return ExponentialInterpolator(1.0); } Interpolator exponential(double base) { return ExponentialInterpolator(base); } Interpolator cubicBezier(double x1, double y1, double x2, double y2) { return CubicBezierInterpolator(x1, y1, x2, y2); } std::unique_ptr interpolate(Interpolator interpolator, std::unique_ptr input, double input1, std::unique_ptr output1) { type::Type type = output1->getType(); std::map> stops; stops[input1] = std::move(output1); ParsingContext ctx; ParseResult result = createInterpolate(type, interpolator, std::move(input), std::move(stops), ctx); assert(result); return std::move(*result); } std::unique_ptr interpolate(Interpolator interpolator, std::unique_ptr input, double input1, std::unique_ptr output1, double input2, std::unique_ptr output2) { type::Type type = output1->getType(); std::map> stops; stops[input1] = std::move(output1); stops[input2] = std::move(output2); ParsingContext ctx; ParseResult result = createInterpolate(type, interpolator, std::move(input), std::move(stops), ctx); assert(result); return std::move(*result); } std::unique_ptr interpolate(Interpolator interpolator, std::unique_ptr input, double input1, std::unique_ptr output1, double input2, std::unique_ptr output2, double input3, std::unique_ptr output3) { type::Type type = output1->getType(); std::map> stops; stops[input1] = std::move(output1); stops[input2] = std::move(output2); stops[input3] = std::move(output3); ParsingContext ctx; ParseResult result = createInterpolate(type, interpolator, std::move(input), std::move(stops), ctx); assert(result); return std::move(*result); } std::unique_ptr concat(std::vector> inputs) { return compound("concat", std::move(inputs)); } std::unique_ptr format(const char* value) { return std::make_unique(Formatted(value)); } std::unique_ptr format(std::unique_ptr input) { std::vector sections; sections.emplace_back(std::move(input), nullopt, nullopt, nullopt); return std::make_unique(sections); } } // namespace dsl } // namespace expression } // namespace style } // namespace mbgl