• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_STATEMENT
9 #define SKSL_DSL_STATEMENT
10 
11 #include "include/core/SkTypes.h"
12 #include "include/private/SkSLStatement.h"
13 #include "include/sksl/SkSLPosition.h"
14 
15 #include <memory>
16 #include <utility>
17 
18 namespace SkSL {
19 
20 class Expression;
21 
22 namespace dsl {
23 
24 class DSLBlock;
25 class DSLExpression;
26 
27 class DSLStatement {
28 public:
29     DSLStatement();
30 
31     DSLStatement(DSLExpression expr);
32 
33     DSLStatement(DSLBlock block);
34 
35     DSLStatement(DSLStatement&&) = default;
36 
37     DSLStatement(std::unique_ptr<SkSL::Expression> expr);
38 
39     DSLStatement(std::unique_ptr<SkSL::Statement> stmt, Position pos);
40 
41     DSLStatement(std::unique_ptr<SkSL::Statement> stmt);
42 
43     ~DSLStatement();
44 
45     DSLStatement& operator=(DSLStatement&& other) = default;
46 
position()47     Position position() {
48         SkASSERT(this->hasValue());
49         return fStatement->fPosition;
50     }
51 
setPosition(Position pos)52     void setPosition(Position pos) {
53         SkASSERT(this->hasValue());
54         fStatement->fPosition = pos;
55     }
56 
hasValue()57     bool hasValue() { return fStatement != nullptr; }
58 
release()59     std::unique_ptr<SkSL::Statement> release() {
60         SkASSERT(this->hasValue());
61         return std::move(fStatement);
62     }
63 
64 private:
releaseIfPossible()65     std::unique_ptr<SkSL::Statement> releaseIfPossible() {
66         return std::move(fStatement);
67     }
68 
69     std::unique_ptr<SkSL::Statement> fStatement;
70 
71     friend class DSLCore;
72     friend class DSLWriter;
73     friend DSLStatement operator,(DSLStatement left, DSLStatement right);
74 };
75 
76 DSLStatement operator,(DSLStatement left, DSLStatement right);
77 
78 } // namespace dsl
79 
80 } // namespace SkSL
81 
82 #endif
83