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 <map>
9 
10 namespace mbgl {
11 namespace style {
12 namespace expression {
13 
14 class Coalesce : public Expression {
15 public:
16     using Args = std::vector<std::unique_ptr<Expression>>;
Coalesce(const type::Type & type_,Args args_)17     Coalesce(const type::Type& type_, Args args_) :
18         Expression(Kind::Coalesce, type_),
19         args(std::move(args_))
20     {}
21 
22     static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx);
23 
24 
25     EvaluationResult evaluate(const EvaluationContext& params) const override;
26 
27     void eachChild(const std::function<void(const Expression&)>& visit) const override;
28 
29     bool operator==(const Expression& e) const override;
30 
31     std::vector<optional<Value>> possibleOutputs() const override;
32 
getLength() const33     std::size_t getLength() const {
34         return args.size();
35     }
36 
getChild(std::size_t i) const37     Expression* getChild(std::size_t i) const {
38         return args.at(i).get();
39     }
40 
getOperator() const41     std::string getOperator() const override { return "coalesce"; }
42 private:
43     Args args;
44 };
45 
46 } // namespace expression
47 } // namespace style
48 } // namespace mbgl
49