1 #pragma once
2 
3 #include <mbgl/style/expression/expression.hpp>
4 #include <mbgl/style/conversion.hpp>
5 #include <mbgl/style/expression/parsing_context.hpp>
6 
7 #include <memory>
8 #include <vector>
9 
10 namespace mbgl {
11 namespace style {
12 namespace expression {
13 
14 class Case : public Expression {
15 public:
16     using Branch = std::pair<std::unique_ptr<Expression>, std::unique_ptr<Expression>>;
17 
Case(type::Type type_,std::vector<Branch> branches_,std::unique_ptr<Expression> otherwise_)18     Case(type::Type type_, std::vector<Branch> branches_, std::unique_ptr<Expression> otherwise_)
19         : Expression(Kind::Case, type_), branches(std::move(branches_)), otherwise(std::move(otherwise_)) {
20     }
21 
22     static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx);
23 
24     EvaluationResult evaluate(const EvaluationContext& params) const override;
25     void eachChild(const std::function<void(const Expression&)>& visit) const override;
26 
27     bool operator==(const Expression& e) const override;
28 
29     std::vector<optional<Value>> possibleOutputs() const override;
30 
getOperator() const31     std::string getOperator() const override { return "case"; }
32 private:
33     std::vector<Branch> branches;
34     std::unique_ptr<Expression> otherwise;
35 };
36 
37 } // namespace expression
38 } // namespace style
39 } // namespace mbgl
40