/* * 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 "include/core/SkTypes.h" #include "src/sksl/SkSLPosition.h" #include "src/sksl/ir/SkSLExpression.h" #include "src/sksl/ir/SkSLIRNode.h" #include "src/sksl/ir/SkSLType.h" #include #include #include #include namespace SkSL { class Context; enum class OperatorPrecedence : uint8_t; /** * A ternary expression (test ? ifTrue : ifFalse). */ class TernaryExpression final : public Expression { public: inline static constexpr Kind kIRNodeKind = Kind::kTernary; TernaryExpression(Position pos, std::unique_ptr test, std::unique_ptr ifTrue, std::unique_ptr ifFalse) : INHERITED(pos, kIRNodeKind, &ifTrue->type()) , fTest(std::move(test)) , fIfTrue(std::move(ifTrue)) , fIfFalse(std::move(ifFalse)) { SkASSERT(this->ifTrue()->type().matches(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, Position pos, 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, Position pos, 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; } std::unique_ptr clone(Position pos) const override { return std::make_unique(pos, this->test()->clone(), this->ifTrue()->clone(), this->ifFalse()->clone()); } std::string description(OperatorPrecedence parentPrecedence) const override; private: std::unique_ptr fTest; std::unique_ptr fIfTrue; std::unique_ptr fIfFalse; using INHERITED = Expression; }; } // namespace SkSL #endif