[core] Add feature state support to expression
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)...
|
||||
|
||||
Reference in New Issue
Block a user