summaryrefslogtreecommitdiff
path: root/src/mbgl/style/layers/layer.cpp.ejs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/style/layers/layer.cpp.ejs')
-rw-r--r--src/mbgl/style/layers/layer.cpp.ejs125
1 files changed, 108 insertions, 17 deletions
diff --git a/src/mbgl/style/layers/layer.cpp.ejs b/src/mbgl/style/layers/layer.cpp.ejs
index 7555054bdb..8a6db749cf 100644
--- a/src/mbgl/style/layers/layer.cpp.ejs
+++ b/src/mbgl/style/layers/layer.cpp.ejs
@@ -14,6 +14,7 @@
#include <mbgl/style/conversion/property_value.hpp>
#include <mbgl/style/conversion/transition_options.hpp>
#include <mbgl/style/conversion/json.hpp>
+#include <mbgl/util/fnv_hash.hpp>
namespace mbgl {
namespace style {
@@ -178,28 +179,78 @@ TransitionOptions <%- camelize(type) %>Layer::get<%- camelize(property.name) %>T
using namespace conversion;
optional<Error> <%- camelize(type) %>Layer::setPaintProperty(const std::string& name, const Convertible& value) {
- <% for (const property of paintProperties) { %>
- if (name == "<%- property.name %>") {
- Error error;
- optional<<%- propertyValueType(property) %>> typedValue = convert<<%- propertyValueType(property) %>>(value, error, <%- property['property-type'] === 'data-driven' || property['property-type'] === 'cross-faded-data-driven' %>, <%- property.name === 'icon-image' || property.name === 'text-field' %>);
- if (!typedValue) {
- return error;
+ enum class Property {
+ Unknown,
+<% for (const property of paintProperties) { -%>
+ <%- camelize(property.name) %>,
+<% } -%>
+<% for (const property of paintProperties) { -%>
+ <%- camelize(property.name) %>Transition,
+<% } -%>
+ };
+
+ Property property = Property::Unknown;
+ switch (util::hashFNV1a(name.c_str())) {
+ <% for (const property of paintProperties) { -%>
+case util::hashFNV1a("<%- property.name %>"):
+ if (name == "<%- property.name %>") {
+ property = Property::<%- camelize(property.name) %>;
}
+ break;
+ case util::hashFNV1a("<%- property.name %>-transition"):
+ if (name == "<%- property.name %>-transition") {
+ property = Property::<%- camelize(property.name) %>Transition;
+ }
+ break;
+ <% } %>
+ }
- set<%- camelize(property.name) %>(*typedValue);
- return nullopt;
+ if (property == Property::Unknown) {
+ return Error { "layer doesn't support this property" };
}
- if (name == "<%- property.name %>-transition") {
+
+ <%
+ const paintConversions = {};
+ for (const property of paintProperties) {
+ const dataDriven = property['property-type'] === 'data-driven' || property['property-type'] === 'cross-faded-data-driven';
+ const convertTokens = property.name === 'icon-image' || property.name === 'text-field';
+ const conversion = `optional<${propertyValueType(property)}> typedValue = convert<${propertyValueType(property)}>(value, error, ${dataDriven}, ${convertTokens})`;
+ paintConversions[conversion] = paintConversions[conversion] || [];
+ paintConversions[conversion].push(property);
+ }
+ -%>
+ <% for (const key in paintConversions) {
+ const properties = paintConversions[key];
+ %>
+ if (<%- properties.map(p => `property == Property::${camelize(p.name)}`).join(' || ') %>) {
Error error;
- optional<TransitionOptions> transition = convert<TransitionOptions>(value, error);
- if (!transition) {
+ <%- key %>;
+ if (!typedValue) {
return error;
}
+ <% if (properties.length == 1) { %>
+ set<%- camelize(properties[0].name) %>(*typedValue);
+ return nullopt;
+ <% } else for (const property of properties) { %>
+ if (property == Property::<%- camelize(property.name) %>) {
+ set<%- camelize(property.name) %>(*typedValue);
+ return nullopt;
+ }
+ <% } %>
+ }
+ <% } %>
+ Error error;
+ optional<TransitionOptions> transition = convert<TransitionOptions>(value, error);
+ if (!transition) {
+ return error;
+ }
+ <% for (const property of paintProperties) { %>
+ if (property == Property::<%- camelize(property.name) %>Transition) {
set<%- camelize(property.name) %>Transition(*transition);
return nullopt;
}
- <% } -%>
+ <% } %>
return Error { "layer doesn't support this property" };
}
@@ -221,18 +272,58 @@ optional<Error> <%- camelize(type) %>Layer::setLayoutProperty(const std::string&
return nullopt;
}
+ enum class Property {
+ Unknown,
+<% for (const property of layoutProperties) { -%>
+ <%- camelize(property.name) %>,
+<% } -%>
+ };
+
+ Property property = Property::Unknown;
+ switch (util::hashFNV1a(name.c_str())) {
<% for (const property of layoutProperties) { %>
- if (name == "<%- property.name %>") {
+ case util::hashFNV1a("<%- property.name %>"):
+ if (name == "<%- property.name %>") {
+ property = Property::<%- camelize(property.name) %>;
+ }
+ break;
+ <% } %>
+ }
+
+ if (property == Property::Unknown) {
+ return Error { "layer doesn't support this property" };
+ }
+
+ <%
+ const layoutConversions = {};
+ for (const property of layoutProperties) {
+ const dataDriven = property['property-type'] === 'data-driven' || property['property-type'] === 'cross-faded-data-driven';
+ const convertTokens = property.name === 'icon-image' || property.name === 'text-field';
+ const conversion = `optional<${propertyValueType(property)}> typedValue = convert<${propertyValueType(property)}>(value, error, ${dataDriven}, ${convertTokens})`;
+ layoutConversions[conversion] = layoutConversions[conversion] || [];
+ layoutConversions[conversion].push(property);
+ }
+ -%>
+ <% for (const key in layoutConversions) {
+ const properties = layoutConversions[key];
+ %>
+ if (<%- properties.map(p => `property == Property::${camelize(p.name)}`).join(' || ') %>) {
Error error;
- optional<<%- propertyValueType(property) %>> typedValue = convert<<%- propertyValueType(property) %>>(value, error, <%- property['property-type'] === 'data-driven' || property['property-type'] === 'cross-faded-data-driven' %>, <%- property.name === 'icon-image' || property.name === 'text-field' %>);
+ <%- key %>;
if (!typedValue) {
return error;
}
-
- set<%- camelize(property.name) %>(*typedValue);
+ <% if (properties.length == 1) { %>
+ set<%- camelize(properties[0].name) %>(*typedValue);
return nullopt;
+ <% } else for (const property of properties) { %>
+ if (property == Property::<%- camelize(property.name) %>) {
+ set<%- camelize(property.name) %>(*typedValue);
+ return nullopt;
+ }
+ <% } %>
}
- <% } -%>
+ <% } %>
return Error { "layer doesn't support this property" };
}