1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SKSL_SWITCHCASE 9cb93a386Sopenharmony_ci#define SKSL_SWITCHCASE 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/private/SkSLStatement.h" 12cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLExpression.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cinamespace SkSL { 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ci/** 17cb93a386Sopenharmony_ci * A single case of a 'switch' statement. 18cb93a386Sopenharmony_ci */ 19cb93a386Sopenharmony_ciclass SwitchCase final : public Statement { 20cb93a386Sopenharmony_cipublic: 21cb93a386Sopenharmony_ci inline static constexpr Kind kStatementKind = Kind::kSwitchCase; 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci // null value implies "default" case 24cb93a386Sopenharmony_ci SwitchCase(int line, std::unique_ptr<Expression> value, std::unique_ptr<Statement> statement) 25cb93a386Sopenharmony_ci : INHERITED(line, kStatementKind) 26cb93a386Sopenharmony_ci , fValue(std::move(value)) 27cb93a386Sopenharmony_ci , fStatement(std::move(statement)) {} 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci std::unique_ptr<Expression>& value() { 30cb93a386Sopenharmony_ci return fValue; 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci const std::unique_ptr<Expression>& value() const { 34cb93a386Sopenharmony_ci return fValue; 35cb93a386Sopenharmony_ci } 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci std::unique_ptr<Statement>& statement() { 38cb93a386Sopenharmony_ci return fStatement; 39cb93a386Sopenharmony_ci } 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci const std::unique_ptr<Statement>& statement() const { 42cb93a386Sopenharmony_ci return fStatement; 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci std::unique_ptr<Statement> clone() const override { 46cb93a386Sopenharmony_ci return std::make_unique<SwitchCase>(fLine, 47cb93a386Sopenharmony_ci this->value() ? this->value()->clone() : nullptr, 48cb93a386Sopenharmony_ci this->statement()->clone()); 49cb93a386Sopenharmony_ci } 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci String description() const override { 52cb93a386Sopenharmony_ci if (this->value()) { 53cb93a386Sopenharmony_ci return String::printf("case %s:\n%s", 54cb93a386Sopenharmony_ci this->value()->description().c_str(), 55cb93a386Sopenharmony_ci fStatement->description().c_str()); 56cb93a386Sopenharmony_ci } else { 57cb93a386Sopenharmony_ci return String::printf("default:\n%s", fStatement->description().c_str()); 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ciprivate: 62cb93a386Sopenharmony_ci std::unique_ptr<Expression> fValue; 63cb93a386Sopenharmony_ci std::unique_ptr<Statement> fStatement; 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci using INHERITED = Statement; 66cb93a386Sopenharmony_ci}; 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci} // namespace SkSL 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci#endif 71