1 #pragma once
2 
3 #include <mbgl/style/expression/expression.hpp>
4 #include <mbgl/style/expression/parsing_context.hpp>
5 #include <mbgl/style/conversion.hpp>
6 
7 #include <mbgl/util/range.hpp>
8 
9 #include <memory>
10 #include <map>
11 
12 namespace mbgl {
13 namespace style {
14 namespace expression {
15 
16 class Step : public Expression {
17 public:
18     Step(const type::Type& type_,
19          std::unique_ptr<Expression> input_,
20          std::map<double, std::unique_ptr<Expression>> stops_);
21 
22     EvaluationResult evaluate(const EvaluationContext& params) const override;
23     void eachChild(const std::function<void(const Expression&)>& visit) const override;
24     void eachStop(const std::function<void(double, const Expression&)>& visit) const;
25 
getInput() const26     const std::unique_ptr<Expression>& getInput() const { return input; }
27     Range<float> getCoveringStops(const double lower, const double upper) const;
28 
29     bool operator==(const Expression& e) const override;
30 
31     std::vector<optional<Value>> possibleOutputs() const override;
32 
33     static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx);
34 
35     mbgl::Value serialize() const override;
getOperator() const36     std::string getOperator() const override { return "step"; }
37 
38 private:
39     const std::unique_ptr<Expression> input;
40     const std::map<double, std::unique_ptr<Expression>> stops;
41 };
42 
43 } // namespace expression
44 } // namespace style
45 } // namespace mbgl
46