• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc.
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_FORSTATEMENT
9 #define SKSL_FORSTATEMENT
10 
11 #include "src/sksl/ir/SkSLExpression.h"
12 #include "src/sksl/ir/SkSLStatement.h"
13 #include "src/sksl/ir/SkSLSymbolTable.h"
14 
15 namespace SkSL {
16 
17 /**
18  * A 'for' statement.
19  */
20 struct ForStatement : public Statement {
ForStatementForStatement21     ForStatement(int offset, std::unique_ptr<Statement> initializer,
22                  std::unique_ptr<Expression> test, std::unique_ptr<Expression> next,
23                  std::unique_ptr<Statement> statement, std::shared_ptr<SymbolTable> symbols)
24     : INHERITED(offset, kFor_Kind)
25     , fSymbols(symbols)
26     , fInitializer(std::move(initializer))
27     , fTest(std::move(test))
28     , fNext(std::move(next))
29     , fStatement(std::move(statement)) {}
30 
cloneForStatement31     std::unique_ptr<Statement> clone() const override {
32         return std::unique_ptr<Statement>(new ForStatement(fOffset, fInitializer->clone(),
33                                                            fTest->clone(), fNext->clone(),
34                                                            fStatement->clone(), fSymbols));
35     }
36 
37 #ifdef SK_DEBUG
descriptionForStatement38     String description() const override {
39         String result("for (");
40         if (fInitializer) {
41             result += fInitializer->description();
42         }
43         result += " ";
44         if (fTest) {
45             result += fTest->description();
46         }
47         result += "; ";
48         if (fNext) {
49             result += fNext->description();
50         }
51         result += ") " + fStatement->description();
52         return result;
53     }
54 #endif
55 
56     // it's important to keep fSymbols defined first (and thus destroyed last) because destroying
57     // the other fields can update symbol reference counts
58     const std::shared_ptr<SymbolTable> fSymbols;
59     std::unique_ptr<Statement> fInitializer;
60     std::unique_ptr<Expression> fTest;
61     std::unique_ptr<Expression> fNext;
62     std::unique_ptr<Statement> fStatement;
63 
64     typedef Statement INHERITED;
65 };
66 
67 } // namespace
68 
69 #endif
70