1b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/* 2b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Copyright 2016 Google Inc. 3b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * 4b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Use of this source code is governed by a BSD-style license that can be 5b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * found in the LICENSE file. 6b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 70df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas 8b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#ifndef SKSL_FORSTATEMENT 9b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#define SKSL_FORSTATEMENT 10b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 11b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "SkSLExpression.h" 12b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "SkSLStatement.h" 13d598f7981f34811e6f2a949207dc13638852f3f7ethannicholas#include "SkSLSymbolTable.h" 14b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 15b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasnamespace SkSL { 16b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 17b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/** 18b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * A 'for' statement. 19b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 20b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ForStatement : public Statement { 210df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas ForStatement(Position position, std::unique_ptr<Statement> initializer, 220df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas std::unique_ptr<Expression> test, std::unique_ptr<Expression> next, 23d598f7981f34811e6f2a949207dc13638852f3f7ethannicholas std::unique_ptr<Statement> statement, std::shared_ptr<SymbolTable> symbols) 24b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas : INHERITED(position, kFor_Kind) 2586a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas , fSymbols(symbols) 26b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas , fInitializer(std::move(initializer)) 27b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas , fTest(std::move(test)) 28b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas , fNext(std::move(next)) 2986a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas , fStatement(std::move(statement)) {} 30b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 310df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas String description() const override { 320df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas String result("for ("); 33b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas if (fInitializer) { 34b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas result += fInitializer->description(); 350df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas } 36b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas result += " "; 37b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas if (fTest) { 38b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas result += fTest->description(); 390df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas } 40b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas result += "; "; 41b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas if (fNext) { 42b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas result += fNext->description(); 43b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas } 44b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas result += ") " + fStatement->description(); 45b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas return result; 46b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas } 47b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 4886a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas // it's important to keep fSymbols defined first (and thus destroyed last) because destroying 4986a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas // the other fields can update symbol reference counts 5086a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas const std::shared_ptr<SymbolTable> fSymbols; 51cb67096b61f699b047fe8635984db1ac708a7b99Ethan Nicholas std::unique_ptr<Statement> fInitializer; 5286a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas std::unique_ptr<Expression> fTest; 5386a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas std::unique_ptr<Expression> fNext; 54cb67096b61f699b047fe8635984db1ac708a7b99Ethan Nicholas std::unique_ptr<Statement> fStatement; 55b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 56b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas typedef Statement INHERITED; 57b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas}; 58b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 59b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas} // namespace 60b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 61b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#endif 62