Home | History | Annotate | Download | only in ir
      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 "SkSLExpression.h"
     12 #include "SkSLStatement.h"
     13 #include "SkSLSymbolTable.h"
     14 
     15 namespace SkSL {
     16 
     17 /**
     18  * A 'for' statement.
     19  */
     20 struct ForStatement : public Statement {
     21     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 
     31     String description() const override {
     32         String result("for (");
     33         if (fInitializer) {
     34             result += fInitializer->description();
     35         }
     36         result += " ";
     37         if (fTest) {
     38             result += fTest->description();
     39         }
     40         result += "; ";
     41         if (fNext) {
     42             result += fNext->description();
     43         }
     44         result += ") " + fStatement->description();
     45         return result;
     46     }
     47 
     48     // it's important to keep fSymbols defined first (and thus destroyed last) because destroying
     49     // the other fields can update symbol reference counts
     50     const std::shared_ptr<SymbolTable> fSymbols;
     51     std::unique_ptr<Statement> fInitializer;
     52     std::unique_ptr<Expression> fTest;
     53     std::unique_ptr<Expression> fNext;
     54     std::unique_ptr<Statement> fStatement;
     55 
     56     typedef Statement INHERITED;
     57 };
     58 
     59 } // namespace
     60 
     61 #endif
     62