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 
9 namespace mbgl {
10 namespace style {
11 namespace expression {
12 
13 template <typename T>
14 class Match : public Expression {
15 public:
16     using Branches = std::unordered_map<T, std::shared_ptr<Expression>>;
17 
Match(type::Type type_,std::unique_ptr<Expression> input_,Branches branches_,std::unique_ptr<Expression> otherwise_)18     Match(type::Type type_,
19           std::unique_ptr<Expression> input_,
20           Branches branches_,
21           std::unique_ptr<Expression> otherwise_
22     ) : Expression(Kind::Match, type_),
23         input(std::move(input_)),
24         branches(std::move(branches_)),
25         otherwise(std::move(otherwise_))
26     {}
27 
28     EvaluationResult evaluate(const EvaluationContext& params) const override;
29 
30     void eachChild(const std::function<void(const Expression&)>& visit) const override;
31 
32     bool operator==(const Expression& e) const override;
33 
34     std::vector<optional<Value>> possibleOutputs() const override;
35 
36     mbgl::Value serialize() const override;
getOperator() const37     std::string getOperator() const override { return "match"; }
38 private:
39     std::unique_ptr<Expression> input;
40     Branches branches;
41     std::unique_ptr<Expression> otherwise;
42 };
43 
44 ParseResult parseMatch(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx);
45 
46 } // namespace expression
47 } // namespace style
48 } // namespace mbgl
49