libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
variantquery.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <functional>
14#include <optional>
15#include <promeki/optional.h>
16#include <promeki/function.h>
17#include <promeki/namespace.h>
18#include <promeki/string.h>
19#include <promeki/error.h>
20#include <promeki/result.h>
21#include <promeki/uniqueptr.h>
22#include <promeki/variant.h>
23#include <promeki/variantspec.h>
25
26PROMEKI_NAMESPACE_BEGIN
27
28class Frame;
29
30namespace detail {
31
42 class VariantQueryNode;
43
45 using VariantQueryNodeUPtr = UniquePtr<VariantQueryNode>;
46
56 struct VariantQueryContext {
63 Function<Optional<Variant>(const String &)> resolve;
64
74 Function<const VariantSpec *(const String &)> specFor;
75 };
76
90 VariantQueryNodeUPtr parseVariantQueryExpr(const String &expr, String &errorDetail);
91
98 bool evalVariantQuery(const VariantQueryNode *root, const VariantQueryContext &ctx);
99
100} // namespace detail
101
191template <typename T> class VariantQuery {
192 public:
202 static Result<VariantQuery<T>> parse(const String &expr);
203
205 VariantQuery();
206 ~VariantQuery();
207
208 VariantQuery(const VariantQuery &) = delete;
209 VariantQuery &operator=(const VariantQuery &) = delete;
210 VariantQuery(VariantQuery &&) noexcept;
211 VariantQuery &operator=(VariantQuery &&) noexcept;
212
214 bool isValid() const;
215
224 bool match(const T &instance) const;
225
227 const String &source() const;
228
235 const String &errorDetail() const;
236
237 private:
238 VariantQuery(String source, detail::VariantQueryNodeUPtr root);
239
240 String _source;
241 String _errorDetail;
242 detail::VariantQueryNodeUPtr _root;
243};
244
245extern template class VariantQuery<Frame>;
246
247PROMEKI_NAMESPACE_END
248
249#endif // PROMEKI_ENABLE_CORE