Blender V4.3
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
5#pragma once
6
7#include "BLI_index_mask.hh"
9
10namespace blender::index_mask {
11
12struct AtomicExpr;
13struct UnionExpr;
14struct IntersectionExpr;
15struct DifferenceExpr;
16
17struct Expr {
18 enum class Type {
19 Atomic,
20 Union,
23 };
24
26 int index;
28
29 int expression_array_size() const;
30
31 const AtomicExpr &as_atomic() const;
32 const UnionExpr &as_union() const;
33 const IntersectionExpr &as_intersection() const;
34 const DifferenceExpr &as_difference() const;
35};
36
37struct AtomicExpr : public Expr {
39};
40
41struct UnionExpr : public Expr {};
42
43struct IntersectionExpr : public Expr {};
44
45struct DifferenceExpr : public Expr {};
46
48 private:
49 ResourceScope scope_;
50 int expr_count_ = 0;
51
52 public:
53 using Term = std::variant<const Expr *, const IndexMask *, IndexRange>;
54
55 const UnionExpr &merge(const Span<Term> terms);
56 const DifferenceExpr &subtract(const Term &main_term, const Span<Term> subtract_terms);
57 const IntersectionExpr &intersect(const Span<Term> terms);
58
59 private:
60 const Expr &term_to_expr(const Term &term);
61};
62
63IndexMask evaluate_expression(const Expr &expression, IndexMaskMemory &memory);
64
66{
67 return this->index + 1;
68}
69
70inline const AtomicExpr &Expr::as_atomic() const
71{
72 BLI_assert(this->type == Type::Atomic);
73 return static_cast<const AtomicExpr &>(*this);
74}
75
76inline const UnionExpr &Expr::as_union() const
77{
78 BLI_assert(this->type == Type::Union);
79 return static_cast<const UnionExpr &>(*this);
80}
81
83{
84 BLI_assert(this->type == Type::Intersection);
85 return static_cast<const IntersectionExpr &>(*this);
86}
87
89{
90 BLI_assert(this->type == Type::Difference);
91 return static_cast<const DifferenceExpr &>(*this);
92}
93
94} // namespace blender::index_mask
#define BLI_assert(a)
Definition BLI_assert.h:50
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