MapLibre Native Core
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
expression.hpp
Go to the documentation of this file.
1 #pragma once
2 
6 #include <mbgl/tile/tile_id.hpp>
7 #include <mbgl/util/color.hpp>
8 #include <mbgl/util/variant.hpp>
9 
10 #include <array>
11 #include <vector>
12 #include <memory>
13 #include <optional>
14 
15 namespace mbgl {
16 
17 class GeometryTileFeature;
18 
19 namespace style {
20 namespace expression {
21 
23 public:
25 };
26 
28 public:
29  EvaluationContext() = default;
30  explicit EvaluationContext(float zoom_) : zoom(zoom_) {}
31  explicit EvaluationContext(GeometryTileFeature const * feature_) : feature(feature_) {}
32  EvaluationContext(float zoom_, GeometryTileFeature const* feature_) : zoom(zoom_), feature(feature_) {}
33  EvaluationContext(std::optional<mbgl::Value> accumulated_, GeometryTileFeature const * feature_) :
34  accumulated(std::move(accumulated_)), feature(feature_)
35  {}
36  EvaluationContext(float zoom_, GeometryTileFeature const* feature_, const FeatureState* state_)
37  : zoom(zoom_), feature(feature_), featureState(state_) {}
38  EvaluationContext(std::optional<float> zoom_, GeometryTileFeature const * feature_, std::optional<double> colorRampParameter_) :
39  zoom(std::move(zoom_)), feature(feature_), colorRampParameter(std::move(colorRampParameter_))
40  {}
41 
42  EvaluationContext& withFormattedSection(const Value* formattedSection_) noexcept {
43  formattedSection = formattedSection_;
44  return *this;
45  };
46 
47  EvaluationContext& withFeatureState(const FeatureState* featureState_) noexcept {
48  featureState = featureState_;
49  return *this;
50  };
51 
52  EvaluationContext& withAvailableImages(const std::set<std::string>* availableImages_) noexcept {
53  availableImages = availableImages_;
54  return *this;
55  };
56 
58  canonical = canonical_;
59  return *this;
60  };
61 
62  std::optional<float> zoom;
63  std::optional<mbgl::Value> accumulated;
64  GeometryTileFeature const* feature = nullptr;
65  std::optional<double> colorRampParameter;
66  // Contains formatted section object, std::unordered_map<std::string, Value>.
67  const Value* formattedSection = nullptr;
68  const FeatureState* featureState = nullptr;
69  const std::set<std::string>* availableImages = nullptr;
70  const mbgl::CanonicalTileID* canonical = nullptr;
71 };
72 
73 template <typename T>
74 class Result : private variant<EvaluationError, T> {
75 public:
77  using Value = T;
78 
79  Result() = default;
80 
81  template <typename U>
82  VARIANT_INLINE Result(U&& val) : variant<EvaluationError, T>(val) {}
83 
84  explicit operator bool () const {
85  return this->template is<T>();
86  }
87 
88  // optional does some type trait magic for this one, so this might
89  // be problematic as is.
90  const T* operator->() const {
91  assert(this->template is<T>());
92  return std::addressof(this->template get<T>());
93  }
94 
95  T* operator->() {
96  assert(this->template is<T>());
97  return std::addressof(this->template get<T>());
98  }
99 
100  T& operator*() {
101  assert(this->template is<T>());
102  return this->template get<T>();
103  }
104 
105  const T& operator*() const {
106  assert(this->template is<T>());
107  return this->template get<T>();
108  }
109 
110  const EvaluationError& error() const {
111  assert(this->template is<EvaluationError>());
112  return this->template get<EvaluationError>();
113  }
114 };
115 
117 public:
118  using Result::Result; // NOLINT
119 
120  EvaluationResult() = default;
121 
122  EvaluationResult(const std::array<double, 4>& arr) :
124  {}
125 
126  // used only for the special (private) "error" expression
128  assert(false);
129  }
130 };
131 
151 enum class Kind : int32_t {
152  Coalesce,
154  Literal,
155  At,
156  Interpolate,
157  Assertion,
158  Length,
159  Step,
160  Let,
161  Var,
163  Coercion,
164  Match,
165  Error,
166  Case,
167  Any,
168  All,
169  Comparison,
172  NumberFormat,
174  In,
175  Within,
176  Distance
177 };
178 
179 class Expression {
180 public:
181  Expression(Kind kind_, type::Type type_) : kind(kind_), type(std::move(type_)) {}
182  virtual ~Expression() = default;
183 
184  virtual EvaluationResult evaluate(const EvaluationContext& params) const = 0;
185  virtual void eachChild(const std::function<void(const Expression&)>&) const = 0;
186  virtual bool operator==(const Expression&) const = 0;
187  bool operator!=(const Expression& rhs) const {
188  return !operator==(rhs);
189  }
190 
191  Kind getKind() const { return kind; };
192  type::Type getType() const { return type; };
193 
194  EvaluationResult evaluate(std::optional<float> zoom, const Feature& feature, std::optional<double> colorRampParameter) const;
195  EvaluationResult evaluate(std::optional<float> zoom,
196  const Feature& feature,
197  std::optional<double> colorRampParameter,
198  const std::set<std::string>& availableImages) const;
199  EvaluationResult evaluate(std::optional<float> zoom,
200  const Feature& feature,
201  std::optional<double> colorRampParameter,
202  const std::set<std::string>& availableImages,
203  const CanonicalTileID& canonical) const;
204  EvaluationResult evaluate(std::optional<mbgl::Value> accumulated, const Feature& feature) const;
205 
211  virtual std::vector<std::optional<Value>> possibleOutputs() const = 0;
212 
213  virtual mbgl::Value serialize() const {
214  std::vector<mbgl::Value> serialized;
215  serialized.emplace_back(getOperator());
216  eachChild([&](const Expression &child) {
217  serialized.emplace_back(child.serialize());
218  });
219  return serialized;
220  };
221 
222  virtual std::string getOperator() const = 0;
223 
224 protected:
225  template <typename T>
226  static bool childrenEqual(const T& lhs, const T& rhs) {
227  if (lhs.size() != rhs.size()) return false;
228  for (auto leftChild = lhs.begin(), rightChild = rhs.begin();
229  leftChild != lhs.end();
230  leftChild++, rightChild++)
231  {
232  if (!Expression::childEqual(*leftChild, *rightChild)) return false;
233  }
234  return true;
235  }
236 
237  static bool childEqual(const std::unique_ptr<Expression>& lhs, const std::unique_ptr<Expression>& rhs) {
238  return *lhs == *rhs;
239  }
240 
241  template <typename T>
242  static bool childEqual(const std::pair<T, std::unique_ptr<Expression>>& lhs,
243  const std::pair<T, std::unique_ptr<Expression>>& rhs) {
244  return lhs.first == rhs.first && *(lhs.second) == *(rhs.second);
245  }
246 
247  template <typename T>
248  static bool childEqual(const std::pair<T, std::shared_ptr<Expression>>& lhs,
249  const std::pair<T, std::shared_ptr<Expression>>& rhs) {
250  return lhs.first == rhs.first && *(lhs.second) == *(rhs.second);
251  }
252 
253  static bool childEqual(const std::pair<std::unique_ptr<Expression>, std::unique_ptr<Expression>>& lhs,
254  const std::pair<std::unique_ptr<Expression>, std::unique_ptr<Expression>>& rhs) {
255  return *(lhs.first) == *(rhs.first) && *(lhs.second) == *(rhs.second);
256  }
257 
258 private:
259  Kind kind;
260  type::Type type;
261 };
262 
263 } // namespace expression
264 } // namespace style
265 } // namespace mbgl
const std::set< std::string > * availableImages
Definition: expression.hpp:69
EvaluationContext(float zoom_, GeometryTileFeature const *feature_)
Definition: expression.hpp:32
std::optional< double > colorRampParameter
Definition: expression.hpp:65
const mbgl::CanonicalTileID * canonical
Definition: expression.hpp:70
EvaluationContext(float zoom_, GeometryTileFeature const *feature_, const FeatureState *state_)
Definition: expression.hpp:36
EvaluationContext & withCanonicalTileID(const mbgl::CanonicalTileID *canonical_) noexcept
Definition: expression.hpp:57
EvaluationContext(std::optional< mbgl::Value > accumulated_, GeometryTileFeature const *feature_)
Definition: expression.hpp:33
EvaluationContext(std::optional< float > zoom_, GeometryTileFeature const *feature_, std::optional< double > colorRampParameter_)
Definition: expression.hpp:38
EvaluationContext(GeometryTileFeature const *feature_)
Definition: expression.hpp:31
GeometryTileFeature const * feature
Definition: expression.hpp:64
std::optional< mbgl::Value > accumulated
Definition: expression.hpp:63
EvaluationContext & withFeatureState(const FeatureState *featureState_) noexcept
Definition: expression.hpp:47
EvaluationContext & withAvailableImages(const std::set< std::string > *availableImages_) noexcept
Definition: expression.hpp:52
EvaluationContext & withFormattedSection(const Value *formattedSection_) noexcept
Definition: expression.hpp:42
EvaluationResult(const std::array< double, 4 > &arr)
Definition: expression.hpp:122
EvaluationResult(const type::ErrorType &)
Definition: expression.hpp:127
bool operator!=(const Expression &rhs) const
Definition: expression.hpp:187
virtual std::vector< std::optional< Value > > possibleOutputs() const =0
static bool childEqual(const std::pair< T, std::unique_ptr< Expression >> &lhs, const std::pair< T, std::unique_ptr< Expression >> &rhs)
Definition: expression.hpp:242
EvaluationResult evaluate(std::optional< float > zoom, const Feature &feature, std::optional< double > colorRampParameter, const std::set< std::string > &availableImages, const CanonicalTileID &canonical) const
EvaluationResult evaluate(std::optional< float > zoom, const Feature &feature, std::optional< double > colorRampParameter, const std::set< std::string > &availableImages) const
Expression(Kind kind_, type::Type type_)
Definition: expression.hpp:181
virtual EvaluationResult evaluate(const EvaluationContext &params) const =0
static bool childEqual(const std::pair< T, std::shared_ptr< Expression >> &lhs, const std::pair< T, std::shared_ptr< Expression >> &rhs)
Definition: expression.hpp:248
EvaluationResult evaluate(std::optional< mbgl::Value > accumulated, const Feature &feature) const
static bool childrenEqual(const T &lhs, const T &rhs)
Definition: expression.hpp:226
virtual std::string getOperator() const =0
virtual void eachChild(const std::function< void(const Expression &)> &) const =0
EvaluationResult evaluate(std::optional< float > zoom, const Feature &feature, std::optional< double > colorRampParameter) const
static bool childEqual(const std::pair< std::unique_ptr< Expression >, std::unique_ptr< Expression >> &lhs, const std::pair< std::unique_ptr< Expression >, std::unique_ptr< Expression >> &rhs)
Definition: expression.hpp:253
static bool childEqual(const std::unique_ptr< Expression > &lhs, const std::unique_ptr< Expression > &rhs)
Definition: expression.hpp:237
virtual mbgl::Value serialize() const
Definition: expression.hpp:213
virtual bool operator==(const Expression &) const =0
VARIANT_INLINE Result(U &&val)
Definition: expression.hpp:82
const T * operator->() const
Definition: expression.hpp:90
const EvaluationError & error() const
Definition: expression.hpp:110
std::unique_ptr< Expression > string(std::unique_ptr< Expression >, std::unique_ptr< Expression > def=nullptr)
std::unique_ptr< Expression > zoom()
variant< NullType, NumberType, BooleanType, StringType, ColorType, ObjectType, ValueType, mapbox::util::recursive_wrapper< Array >, CollatorType, FormattedType, ErrorType, ImageType > Type
Definition: type.hpp:108
Value toExpressionValue(const T &value)
Definition: value.hpp:139
bool operator==(const Undefined &, const Undefined &)
Definition: undefined.hpp:8
Definition: actor.hpp:15
mapbox::base::Value Value
Definition: feature.hpp:11
mapbox::base::ValueObject FeatureState
Definition: feature.hpp:16
mapbox::util::variant< T... > variant
Definition: variant.hpp:17
Definition: tile_id.hpp:256