16cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/*
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Copyright 2016 Google Inc.
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
46cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * Use of this source code is governed by a BSD-style license that can be
56cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * found in the LICENSE file.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
86cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#ifndef SKSL_BLOCK
96cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define SKSL_BLOCK
106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "SkSLStatement.h"
126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "SkSLSymbolTable.h"
136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKnamespace SkSL {
156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/**
176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * A block of multiple statements functioning as a single statement.
186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */
196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstruct Block : public Statement {
206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    Block(int offset, std::vector<std::unique_ptr<Statement>> statements,
216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          const std::shared_ptr<SymbolTable> symbols = nullptr)
226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    : INHERITED(offset, kBlock_Kind)
236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    , fSymbols(std::move(symbols))
246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    , fStatements(std::move(statements)) {}
256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    bool isEmpty() const override {
276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        for (const auto& s : fStatements) {
286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            if (!s->isEmpty()) {
296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                return false;
306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            }
316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        }
326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        return true;
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    String description() const override {
366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        String result("{");
376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        for (size_t i = 0; i < fStatements.size(); i++) {
386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            result += "\n";
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            result += fStatements[i]->description();
406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        }
416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        result += "\n}\n";
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return result;
436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    }
446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    // it's important to keep fStatements defined after (and thus destroyed before) fSymbols,
466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    // because destroying statements can modify reference counts in symbols
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const std::shared_ptr<SymbolTable> fSymbols;
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    std::vector<std::unique_ptr<Statement>> fStatements;
496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    typedef Statement INHERITED;
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} // namespace
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#endif
566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK