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 <memory> 8 #include <map> 9 10 namespace mbgl { 11 namespace style { 12 namespace expression { 13 14 class Let : public Expression { 15 public: 16 using Bindings = std::map<std::string, std::shared_ptr<Expression>>; 17 Let(Bindings bindings_,std::unique_ptr<Expression> result_)18 Let(Bindings bindings_, std::unique_ptr<Expression> result_) : 19 Expression(Kind::Let, result_->getType()), 20 bindings(std::move(bindings_)), 21 result(std::move(result_)) 22 {} 23 24 static ParseResult parse(const mbgl::style::conversion::Convertible&, ParsingContext&); 25 26 EvaluationResult evaluate(const EvaluationContext& params) const override; 27 void eachChild(const std::function<void(const Expression&)>&) const override; 28 operator ==(const Expression & e) const29 bool operator==(const Expression& e) const override { 30 if (e.getKind() == Kind::Let) { 31 auto rhs = static_cast<const Let*>(&e); 32 return *result == *(rhs->result); 33 } 34 return false; 35 } 36 37 std::vector<optional<Value>> possibleOutputs() const override; 38 getResult() const39 Expression* getResult() const { 40 return result.get(); 41 } 42 43 mbgl::Value serialize() const override; getOperator() const44 std::string getOperator() const override { return "let"; } 45 private: 46 Bindings bindings; 47 std::unique_ptr<Expression> result; 48 }; 49 50 class Var : public Expression { 51 public: Var(std::string name_,std::shared_ptr<Expression> value_)52 Var(std::string name_, std::shared_ptr<Expression> value_) : 53 Expression(Kind::Var, value_->getType()), 54 name(std::move(name_)), 55 value(value_) 56 {} 57 58 static ParseResult parse(const mbgl::style::conversion::Convertible&, ParsingContext&); 59 60 EvaluationResult evaluate(const EvaluationContext& params) const override; 61 void eachChild(const std::function<void(const Expression&)>&) const override; 62 operator ==(const Expression & e) const63 bool operator==(const Expression& e) const override { 64 if (e.getKind() == Kind::Var) { 65 auto rhs = static_cast<const Var*>(&e); 66 return *value == *(rhs->value); 67 } 68 return false; 69 } 70 71 std::vector<optional<Value>> possibleOutputs() const override; 72 73 mbgl::Value serialize() const override; getOperator() const74 std::string getOperator() const override { return "var"; } 75 getBoundExpression() const76 const std::shared_ptr<Expression>& getBoundExpression() const { return value; } 77 78 private: 79 std::string name; 80 std::shared_ptr<Expression> value; 81 }; 82 83 } // namespace expression 84 } // namespace style 85 } // namespace mbgl 86