summaryrefslogtreecommitdiff
path: root/src/mbgl/style/expression/equals.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/style/expression/equals.cpp')
-rw-r--r--src/mbgl/style/expression/equals.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/src/mbgl/style/expression/equals.cpp b/src/mbgl/style/expression/equals.cpp
index f2f59e31ef..245899f975 100644
--- a/src/mbgl/style/expression/equals.cpp
+++ b/src/mbgl/style/expression/equals.cpp
@@ -1,3 +1,4 @@
+#include <mbgl/style/expression/collator.hpp>
#include <mbgl/style/expression/equals.hpp>
namespace mbgl {
@@ -11,10 +12,11 @@ static bool isComparableType(const type::Type& type) {
type == type::Null;
}
-Equals::Equals(std::unique_ptr<Expression> lhs_, std::unique_ptr<Expression> rhs_, bool negate_)
+Equals::Equals(std::unique_ptr<Expression> lhs_, std::unique_ptr<Expression> rhs_, optional<std::unique_ptr<Expression>> collator_, bool negate_)
: Expression(type::Boolean),
lhs(std::move(lhs_)),
rhs(std::move(rhs_)),
+ collator(std::move(collator_)),
negate(negate_) {
assert(isComparableType(lhs->getType()) || isComparableType(rhs->getType()));
assert(lhs->getType() == rhs->getType() || lhs->getType() == type::Value || rhs->getType() == type::Value);
@@ -27,7 +29,15 @@ EvaluationResult Equals::evaluate(const EvaluationContext& params) const {
EvaluationResult rhsResult = rhs->evaluate(params);
if (!rhsResult) return lhsResult;
- bool result = *lhsResult == *rhsResult;
+ bool result;
+
+ if (collator) {
+ auto collatorResult = (*collator)->evaluate(params);
+ const Collator& c = collatorResult->get<Collator>();
+ result = c.compare(lhsResult->get<std::string>(), rhsResult->get<std::string>()) == 0;
+ } else {
+ result = *lhsResult == *rhsResult;
+ }
if (negate) {
result = !result;
}
@@ -37,6 +47,9 @@ EvaluationResult Equals::evaluate(const EvaluationContext& params) const {
void Equals::eachChild(const std::function<void(const Expression&)>& visit) const {
visit(*lhs);
visit(*rhs);
+ if (collator) {
+ visit(**collator);
+ }
}
bool Equals::operator==(const Expression& e) const {
@@ -54,8 +67,8 @@ using namespace mbgl::style::conversion;
ParseResult Equals::parse(const Convertible& value, ParsingContext& ctx) {
std::size_t length = arrayLength(value);
- if (length != 3) {
- ctx.error("Expected two arguments.");
+ if (length != 3 && length != 4) {
+ ctx.error("Expected two or three arguments.");
return ParseResult();
}
@@ -80,8 +93,18 @@ ParseResult Equals::parse(const Convertible& value, ParsingContext& ctx) {
ctx.error("Cannot compare " + toString(lhsType) + " and " + toString(rhsType) + ".");
return ParseResult();
}
+
+ ParseResult collatorParseResult;
+ if (length == 4) {
+ if (lhsType != type::String && rhsType != type::String) {
+ ctx.error("Cannot use collator to compare non-string types.");
+ return ParseResult();
+ }
+ collatorParseResult = ctx.parse(arrayMember(value, 3), 3, {type::Collator});
+ if (!collatorParseResult) return ParseResult();
+ }
- return ParseResult(std::make_unique<Equals>(std::move(*lhs), std::move(*rhs), negate));
+ return ParseResult(std::make_unique<Equals>(std::move(*lhs), std::move(*rhs), std::move(collatorParseResult), negate));
}
} // namespace expression