/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SKSL_TERNARYEXPRESSION #define SKSL_TERNARYEXPRESSION #include "src/sksl/ir/SkSLExpression.h" namespace SkSL { /** * A ternary expression (test ? ifTrue : ifFalse). */ class TernaryExpression final : public Expression { public: inline static constexpr Kind kExpressionKind = Kind::kTernary; TernaryExpression(int line, std::unique_ptr test, std::unique_ptr ifTrue, std::unique_ptr ifFalse) : INHERITED(line, kExpressionKind, &ifTrue->type()) , fTest(std::move(test)) , fIfTrue(std::move(ifTrue)) , fIfFalse(std::move(ifFalse)) { SkASSERT(this->ifTrue()->type() == this->ifFalse()->type()); } // Creates a potentially-simplified form of the ternary. Typechecks and coerces input // expressions; reports errors via ErrorReporter. static std::unique_ptr Convert(const Context& context, std::unique_ptr test, std::unique_ptr ifTrue, std::unique_ptr ifFalse); // Creates a potentially-simplified form of the ternary; reports errors via ASSERT. static std::unique_ptr Make(const Context& context, std::unique_ptr test, std::unique_ptr ifTrue, std::unique_ptr ifFalse); std::unique_ptr& test() { return fTest; } const std::unique_ptr& test() const { return fTest; } std::unique_ptr& ifTrue() { return fIfTrue; } const std::unique_ptr& ifTrue() const { return fIfTrue; } std::unique_ptr& ifFalse() { return fIfFalse; } const std::unique_ptr& ifFalse() const { return fIfFalse; } bool hasProperty(Property property) const override { return this->test()->hasProperty(property) || this->ifTrue()->hasProperty(property) || this->ifFalse()->hasProperty(property); } bool isConstantOrUniform() const override { return this->test()->isConstantOrUniform() && this->ifTrue()->isConstantOrUniform() && this->ifFalse()->isConstantOrUniform(); } std::unique_ptr clone() const override { return std::make_unique(fLine, this->test()->clone(), this->ifTrue()->clone(), this->ifFalse()->clone()); } String description() const override { return "(" + this->test()->description() + " ? " + this->ifTrue()->description() + " : " + this->ifFalse()->description() + ")"; } private: std::unique_ptr fTest; std::unique_ptr fIfTrue; std::unique_ptr fIfFalse; using INHERITED = Expression; }; } // namespace SkSL #endif