xref: /third_party/skia/include/sksl/DSLBlock.h (revision cb93a386)
1/*
2 * Copyright 2021 Google LLC.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SKSL_DSL_BLOCK
9#define SKSL_DSL_BLOCK
10
11#include "include/private/SkSLDefines.h"
12#include "include/sksl/DSLExpression.h"
13#include "include/sksl/DSLStatement.h"
14
15#include <memory>
16
17namespace SkSL {
18
19class Block;
20class SymbolTable;
21
22namespace dsl {
23
24class DSLBlock {
25public:
26    template<class... Statements>
27    DSLBlock(Statements... statements) {
28        fStatements.reserve_back(sizeof...(statements));
29        // in C++17, we could just do:
30        // (fStatements.push_back(DSLStatement(statements.release()).release()), ...);
31        int unused[] =
32            {0,
33            (static_cast<void>(fStatements.push_back(DSLStatement(statements.release()).release())),
34             0)...};
35        static_cast<void>(unused);
36    }
37
38    DSLBlock(DSLBlock&& other) = default;
39
40    DSLBlock(SkSL::StatementArray statements, std::shared_ptr<SymbolTable> symbols = nullptr);
41
42    DSLBlock(SkTArray<DSLStatement> statements, std::shared_ptr<SymbolTable> symbols = nullptr);
43
44    ~DSLBlock();
45
46    DSLBlock& operator=(DSLBlock&& other) {
47        fStatements = std::move(other.fStatements);
48        return *this;
49    }
50
51    void append(DSLStatement stmt);
52
53    std::unique_ptr<SkSL::Block> release();
54
55private:
56    SkSL::StatementArray fStatements;
57    std::shared_ptr<SkSL::SymbolTable> fSymbols;
58
59    friend class DSLStatement;
60    friend class DSLFunction;
61};
62
63} // namespace dsl
64
65} // namespace SkSL
66
67#endif
68