Relax typing for comparison operators (#12537)
* Relax typing for comparison operators Ports https://github.com/mapbox/mapbox-gl-js/pull/6961 * Review comments * Lint fixes
This commit is contained in:
68
include/mbgl/style/expression/comparison.hpp
Normal file
68
include/mbgl/style/expression/comparison.hpp
Normal file
@@ -0,0 +1,68 @@
|
||||
#pragma once
|
||||
|
||||
#include <mbgl/style/expression/collator_expression.hpp>
|
||||
#include <mbgl/style/expression/expression.hpp>
|
||||
#include <mbgl/style/expression/parsing_context.hpp>
|
||||
#include <mbgl/style/conversion.hpp>
|
||||
|
||||
#include <memory>
|
||||
|
||||
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<Expression> lhs,
|
||||
std::unique_ptr<Expression> rhs);
|
||||
|
||||
void eachChild(const std::function<void(const Expression&)>& visit) const override;
|
||||
bool operator==(const Expression&) const override;
|
||||
EvaluationResult evaluate(const EvaluationContext&) const override;
|
||||
std::vector<optional<Value>> possibleOutputs() const override;
|
||||
std::string getOperator() const override;
|
||||
|
||||
private:
|
||||
std::string op;
|
||||
CompareFunctionType compare;
|
||||
std::unique_ptr<Expression> lhs;
|
||||
std::unique_ptr<Expression> rhs;
|
||||
bool needsRuntimeTypeCheck;
|
||||
};
|
||||
|
||||
class CollatorComparison : public Expression {
|
||||
public:
|
||||
using CompareFunctionType = bool (*) (std::string, std::string, Collator);
|
||||
|
||||
CollatorComparison(
|
||||
std::string op,
|
||||
std::unique_ptr<Expression> lhs,
|
||||
std::unique_ptr<Expression> rhs,
|
||||
std::unique_ptr<Expression> collator);
|
||||
|
||||
void eachChild(const std::function<void(const Expression&)>& visit) const override;
|
||||
bool operator==(const Expression&) const override;
|
||||
EvaluationResult evaluate(const EvaluationContext&) const override;
|
||||
std::vector<optional<Value>> possibleOutputs() const override;
|
||||
std::string getOperator() const override;
|
||||
|
||||
private:
|
||||
std::string op;
|
||||
CompareFunctionType compare;
|
||||
std::unique_ptr<Expression> lhs;
|
||||
std::unique_ptr<Expression> rhs;
|
||||
std::unique_ptr<Expression> collator;
|
||||
bool needsRuntimeTypeCheck;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} // namespace expression
|
||||
} // namespace style
|
||||
} // namespace mbgl
|
||||
@@ -31,6 +31,7 @@ std::unique_ptr<Expression> literal(Value value);
|
||||
std::unique_ptr<Expression> literal(std::initializer_list<double> value);
|
||||
std::unique_ptr<Expression> literal(std::initializer_list<const char *> value);
|
||||
|
||||
std::unique_ptr<Expression> assertion(type::Type, std::unique_ptr<Expression>);
|
||||
std::unique_ptr<Expression> number(std::unique_ptr<Expression>);
|
||||
std::unique_ptr<Expression> string(std::unique_ptr<Expression>);
|
||||
std::unique_ptr<Expression> boolean(std::unique_ptr<Expression>);
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <mbgl/style/expression/collator_expression.hpp>
|
||||
#include <mbgl/style/expression/expression.hpp>
|
||||
#include <mbgl/style/expression/parsing_context.hpp>
|
||||
#include <mbgl/style/conversion.hpp>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace mbgl {
|
||||
namespace style {
|
||||
namespace expression {
|
||||
|
||||
class Equals : public Expression {
|
||||
public:
|
||||
Equals(std::unique_ptr<Expression> lhs, std::unique_ptr<Expression> rhs, optional<std::unique_ptr<Expression>> collator, bool negate);
|
||||
|
||||
static ParseResult parse(const mbgl::style::conversion::Convertible&, ParsingContext&);
|
||||
|
||||
void eachChild(const std::function<void(const Expression&)>& visit) const override;
|
||||
bool operator==(const Expression&) const override;
|
||||
EvaluationResult evaluate(const EvaluationContext&) const override;
|
||||
std::vector<optional<Value>> possibleOutputs() const override;
|
||||
|
||||
std::string getOperator() const override { return negate ? "!=" : "=="; }
|
||||
private:
|
||||
std::unique_ptr<Expression> lhs;
|
||||
std::unique_ptr<Expression> rhs;
|
||||
optional<std::unique_ptr<Expression>> collator;
|
||||
bool negate;
|
||||
};
|
||||
|
||||
} // namespace expression
|
||||
} // namespace style
|
||||
} // namespace mbgl
|
||||
@@ -133,7 +133,7 @@ enum class Kind : int32_t {
|
||||
Case,
|
||||
Any,
|
||||
All,
|
||||
Equals,
|
||||
Comparison,
|
||||
};
|
||||
|
||||
class Expression {
|
||||
|
||||
Reference in New Issue
Block a user