1 /* 2 * Copyright 2021 Google LLC 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_CONSTRUCTOR_COMPOUND_CAST 9 #define SKSL_CONSTRUCTOR_COMPOUND_CAST 10 11 #include "src/sksl/SkSLPosition.h" 12 #include "src/sksl/ir/SkSLConstructor.h" 13 #include "src/sksl/ir/SkSLExpression.h" 14 #include "src/sksl/ir/SkSLIRNode.h" 15 16 #include <memory> 17 #include <utility> 18 19 namespace SkSL { 20 21 class Context; 22 class Type; 23 24 /** 25 * Represents the construction of a vector/matrix typecast, such as `half3(myInt3)` or 26 * `float4x4(myHalf4x4)`. Matrix resizes are done in ConstructorMatrixResize, not here. 27 * 28 * These always contain exactly 1 vector or matrix of matching size, and are never constant. 29 */ 30 class ConstructorCompoundCast final : public SingleArgumentConstructor { 31 public: 32 inline static constexpr Kind kIRNodeKind = Kind::kConstructorCompoundCast; 33 ConstructorCompoundCast(Position pos,const Type & type,std::unique_ptr<Expression> arg)34 ConstructorCompoundCast(Position pos, const Type& type, std::unique_ptr<Expression> arg) 35 : INHERITED(pos, kIRNodeKind, &type, std::move(arg)) {} 36 37 static std::unique_ptr<Expression> Make(const Context& context, 38 Position pos, 39 const Type& type, 40 std::unique_ptr<Expression> arg); 41 clone(Position pos)42 std::unique_ptr<Expression> clone(Position pos) const override { 43 return std::make_unique<ConstructorCompoundCast>(pos, this->type(), argument()->clone()); 44 } 45 46 private: 47 using INHERITED = SingleArgumentConstructor; 48 }; 49 50 } // namespace SkSL 51 52 #endif 53