diff options
author | Anand Thakker <github@anandthakker.net> | 2017-07-21 15:37:40 -0400 |
---|---|---|
committer | Anand Thakker <github@anandthakker.net> | 2017-08-11 21:54:51 -0400 |
commit | 52edbeb1a0a1dd1ba0d7e3e651dcf4d5ea5abe89 (patch) | |
tree | 8e921ea34d8f4c0fe27b9f974baecdb134fde7bc | |
parent | 09cf58068498e81a9771243db53ab98ba1c9faa2 (diff) | |
download | qtlocation-mapboxgl-52edbeb1a0a1dd1ba0d7e3e651dcf4d5ea5abe89.tar.gz |
Implement to_{type} coercion expressions
-rw-r--r-- | include/mbgl/style/expression/expression.hpp | 9 | ||||
-rw-r--r-- | src/mbgl/style/expression/compound_expression.cpp | 41 |
2 files changed, 49 insertions, 1 deletions
diff --git a/include/mbgl/style/expression/expression.hpp b/include/mbgl/style/expression/expression.hpp index ef94ad9cbd..8b2c5c7e98 100644 --- a/include/mbgl/style/expression/expression.hpp +++ b/include/mbgl/style/expression/expression.hpp @@ -66,7 +66,13 @@ public: } }; -using EvaluationResult = Result<Value>; +struct EvaluationResult : public Result<Value> { + using Result::Result; + + EvaluationResult(const std::array<float, 4>& arr) : + Result(std::vector<Value>(arr.begin(), arr.end())) + {} +}; struct CompileError { std::string message; @@ -80,6 +86,7 @@ public: virtual bool isFeatureConstant() const { return true; } virtual bool isZoomConstant() const { return true; } + virtual EvaluationResult evaluate(const EvaluationParameters& params) const = 0; /* diff --git a/src/mbgl/style/expression/compound_expression.cpp b/src/mbgl/style/expression/compound_expression.cpp index 99f0270c1d..189cb0f6a1 100644 --- a/src/mbgl/style/expression/compound_expression.cpp +++ b/src/mbgl/style/expression/compound_expression.cpp @@ -119,6 +119,47 @@ std::unordered_map<std::string, CompoundExpression::Definition> CompoundExpressi define("boolean", assertion<bool>), define("array", assertion<std::vector<Value>>), // TODO: [array, type, value], [array, type, length, value] + define("to_string", [](const Value& v) -> Result<std::string> { return stringify(v); }), + define("to_number", [](const Value& v) -> Result<float> { + optional<float> result = v.match( + [](const float f) -> optional<float> { return f; }, + [](const std::string& s) -> optional<float> { + try { + return std::stof(s); + } catch(std::exception) { + return optional<float>(); + } + }, + [](const auto&) { return optional<float>(); } + ); + if (!result) { + return EvaluationError { + "Could not convert " + stringify(v) + " to number." + }; + } + return *result; + }), + define("to_boolean", [](const Value& v) -> Result<bool> { + return v.match( + [&] (float f) { return (bool)f; }, + [&] (const std::string& s) { return s.length() > 0; }, + [&] (bool b) { return b; }, + [&] (const NullValue&) { return false; }, + [&] (const auto&) { return true; } + ); + }), + define("to_rgba", [](const mbgl::Color& color) -> Result<std::array<float, 4>> { + return std::array<float, 4> {{ color.r, color.g, color.b, color.a }}; + }), + + define("parse_color", [](const std::string& colorString) -> Result<mbgl::Color> { + const auto& result = mbgl::Color::parse(colorString); + if (result) return *result; + return EvaluationError { + "Could not parse color from value '" + colorString + "'" + }; + }), + std::pair<std::string, Definition>("get", defineGet()), define("+", [](const Varargs<float>& args) -> Result<float> { |