#pragma once #include #include #include #include #include namespace mbgl { namespace style { namespace expression { ParseResult parseComparison(const mbgl::style::conversion::Convertible&, ParsingContext&); class BasicComparison : public Expression { public: using CompareFunctionType = bool (*) (Value, Value); BasicComparison( std::string op, std::unique_ptr lhs, std::unique_ptr rhs); void eachChild(const std::function& visit) const override; bool operator==(const Expression&) const override; EvaluationResult evaluate(const EvaluationContext&) const override; std::vector> possibleOutputs() const override; std::string getOperator() const override; private: std::string op; CompareFunctionType compare; std::unique_ptr lhs; std::unique_ptr rhs; bool needsRuntimeTypeCheck; }; class CollatorComparison : public Expression { public: using CompareFunctionType = bool (*) (std::string, std::string, Collator); CollatorComparison( std::string op, std::unique_ptr lhs, std::unique_ptr rhs, std::unique_ptr collator); void eachChild(const std::function& visit) const override; bool operator==(const Expression&) const override; EvaluationResult evaluate(const EvaluationContext&) const override; std::vector> possibleOutputs() const override; std::string getOperator() const override; private: std::string op; CompareFunctionType compare; std::unique_ptr lhs; std::unique_ptr rhs; std::unique_ptr collator; bool needsRuntimeTypeCheck; }; } // namespace expression } // namespace style } // namespace mbgl