#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 (*)(const Value&, const 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 (*)(const std::string&, const std::string&, const 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