Home | History | Annotate | Download | only in ir
      1 /*
      2  * Copyright 2016 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SKSL_TERNARYEXPRESSION
      9 #define SKSL_TERNARYEXPRESSION
     10 
     11 #include "SkSLExpression.h"
     12 #include "../SkSLPosition.h"
     13 
     14 namespace SkSL {
     15 
     16 /**
     17  * A ternary expression (test ? ifTrue : ifFalse).
     18  */
     19 struct TernaryExpression : public Expression {
     20     TernaryExpression(Position position, std::unique_ptr<Expression> test,
     21                       std::unique_ptr<Expression> ifTrue, std::unique_ptr<Expression> ifFalse)
     22     : INHERITED(position, kTernary_Kind, ifTrue->fType)
     23     , fTest(std::move(test))
     24     , fIfTrue(std::move(ifTrue))
     25     , fIfFalse(std::move(ifFalse)) {
     26         ASSERT(fIfTrue->fType == fIfFalse->fType);
     27     }
     28 
     29     bool hasSideEffects() const override {
     30         return fTest->hasSideEffects() || fIfTrue->hasSideEffects() || fIfFalse->hasSideEffects();
     31     }
     32 
     33     String description() const override {
     34         return "(" + fTest->description() + " ? " + fIfTrue->description() + " : " +
     35                fIfFalse->description() + ")";
     36     }
     37 
     38     std::unique_ptr<Expression> fTest;
     39     std::unique_ptr<Expression> fIfTrue;
     40     std::unique_ptr<Expression> fIfFalse;
     41 
     42     typedef Expression INHERITED;
     43 };
     44 
     45 } // namespace
     46 
     47 #endif
     48