Blender V5.0
BLI_index_mask_expression.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_index_mask.hh"
12#include "BLI_resource_scope.hh"
13
14namespace blender::index_mask {
15
16struct AtomicExpr;
17struct UnionExpr;
18struct IntersectionExpr;
19struct DifferenceExpr;
20
21struct Expr {
28
30 int index;
32
33 int expression_array_size() const;
34
35 const AtomicExpr &as_atomic() const;
36 const UnionExpr &as_union() const;
37 const IntersectionExpr &as_intersection() const;
38 const DifferenceExpr &as_difference() const;
39};
40
41struct AtomicExpr : public Expr {
43};
44
45struct UnionExpr : public Expr {};
46
47struct IntersectionExpr : public Expr {};
48
49struct DifferenceExpr : public Expr {};
50
52 private:
53 ResourceScope scope_;
54 int expr_count_ = 0;
55
56 public:
57 using Term = std::variant<const Expr *, const IndexMask *, IndexRange>;
58
59 const UnionExpr &merge(const Span<Term> terms);
60 const DifferenceExpr &subtract(const Term &main_term, const Span<Term> subtract_terms);
61 const IntersectionExpr &intersect(const Span<Term> terms);
62
63 private:
64 const Expr &term_to_expr(const Term &term);
65};
66
67IndexMask evaluate_expression(const Expr &expression, IndexMaskMemory &memory);
68
70{
71 return this->index + 1;
72}
73
74inline const AtomicExpr &Expr::as_atomic() const
75{
77 return static_cast<const AtomicExpr &>(*this);
78}
79
80inline const UnionExpr &Expr::as_union() const
81{
82 BLI_assert(this->type == Type::Union);
83 return static_cast<const UnionExpr &>(*this);
84}
85
87{
89 return static_cast<const IntersectionExpr &>(*this);
90}
91
93{
95 return static_cast<const DifferenceExpr &>(*this);
96}
97
98} // namespace blender::index_mask
#define BLI_assert(a)
Definition BLI_assert.h:46
std::variant< const Expr *, const IndexMask *, IndexRange > Term
const IntersectionExpr & intersect(const Span< Term > terms)
const UnionExpr & merge(const Span< Term > terms)
const DifferenceExpr & subtract(const Term &main_term, const Span< Term > subtract_terms)
IndexMask evaluate_expression(const Expr &expression, IndexMaskMemory &memory)
const DifferenceExpr & as_difference() const
const IntersectionExpr & as_intersection() const
const AtomicExpr & as_atomic() const
const UnionExpr & as_union() const