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:
Anand Thakker
2018-08-02 13:48:47 -04:00
committed by GitHub
parent 952c4131e6
commit d25e1a1e7f
11 changed files with 367 additions and 176 deletions

View 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

View File

@@ -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>);

View File

@@ -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

View File

@@ -133,7 +133,7 @@ enum class Kind : int32_t {
Case,
Any,
All,
Equals,
Comparison,
};
class Expression {