[core] Add feature state support to expression

This commit is contained in:
Juha Alanen
2019-08-21 16:21:46 +03:00
committed by Juha Alanen
parent e51fafd4eb
commit 75d18e32fc
4 changed files with 40 additions and 0 deletions

View File

@@ -34,6 +34,9 @@ public:
EvaluationContext(optional<mbgl::Value> accumulated_, GeometryTileFeature const * feature_) :
accumulated(std::move(accumulated_)), feature(feature_)
{}
EvaluationContext(float zoom_, GeometryTileFeature const * feature_, const FeatureState* state_) :
zoom(zoom_), feature(feature_), featureState(state_)
{}
EvaluationContext(optional<float> zoom_, GeometryTileFeature const * feature_, optional<double> colorRampParameter_) :
zoom(std::move(zoom_)), feature(feature_), colorRampParameter(std::move(colorRampParameter_))
{}
@@ -43,12 +46,18 @@ public:
return *this;
};
EvaluationContext& withFeatureState(const FeatureState* featureState_) noexcept {
featureState = featureState_;
return *this;
};
optional<float> zoom;
optional<mbgl::Value> accumulated;
GeometryTileFeature const * feature = nullptr;
optional<double> colorRampParameter;
// Contains formatted section object, std::unordered_map<std::string, Value>.
const Value* formattedSection = nullptr;
const FeatureState* featureState = nullptr;
};
template <typename T>

View File

@@ -61,6 +61,10 @@ public:
return evaluate(expression::EvaluationContext(zoom, &feature), finalDefaultValue);
}
T evaluate(float zoom, const GeometryTileFeature& feature, const FeatureState& state, T finalDefaultValue) const {
return evaluate(expression::EvaluationContext(zoom, &feature, &state), finalDefaultValue);
}
std::vector<optional<T>> possibleOutputs() const {
return expression::fromExpressionValues<T>(expression->possibleOutputs());
}

View File

@@ -49,6 +49,16 @@ public:
}
);
}
template <class Feature>
T evaluate(const Feature& feature, float zoom, const FeatureState& featureState, T defaultValue) const {
return this->match(
[&] (const T& constant_) { return constant_; },
[&] (const style::PropertyExpression<T>& expression) {
return expression.evaluate(zoom, feature, featureState, defaultValue);
}
);
}
};
template <class T>

View File

@@ -180,11 +180,28 @@ public:
});
}
template <class T>
static T evaluate(float z, const GeometryTileFeature& feature, const FeatureState& state,
const PossiblyEvaluatedPropertyValue<T>& v, const T& defaultValue) {
return v.match(
[&] (const T& t) {
return t;
},
[&] (const PropertyExpression<T>& t) {
return t.evaluate(z, feature, state, defaultValue);
});
}
template <class P>
auto evaluate(float z, const GeometryTileFeature& feature) const {
return evaluate(z, feature, this->template get<P>(), P::defaultValue());
}
template <class P>
auto evaluate(float z, const GeometryTileFeature& feature, const FeatureState& state) const {
return evaluate(z, feature, state, this->template get<P>(), P::defaultValue());
}
Evaluated evaluate(float z, const GeometryTileFeature& feature) const {
return Evaluated {
evaluate<Ps>(z, feature)...