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_DSL_STATEMENT 9 #define SKSL_DSL_STATEMENT 10 11 #include "include/core/SkTypes.h" 12 #include "include/private/SkSLStatement.h" 13 #include "include/sksl/SkSLPosition.h" 14 15 #include <memory> 16 #include <utility> 17 18 namespace SkSL { 19 20 class Expression; 21 22 namespace dsl { 23 24 class DSLBlock; 25 class DSLExpression; 26 27 class DSLStatement { 28 public: 29 DSLStatement(); 30 31 DSLStatement(DSLExpression expr); 32 33 DSLStatement(DSLBlock block); 34 35 DSLStatement(DSLStatement&&) = default; 36 37 DSLStatement(std::unique_ptr<SkSL::Expression> expr); 38 39 DSLStatement(std::unique_ptr<SkSL::Statement> stmt, Position pos); 40 41 DSLStatement(std::unique_ptr<SkSL::Statement> stmt); 42 43 ~DSLStatement(); 44 45 DSLStatement& operator=(DSLStatement&& other) = default; 46 position()47 Position position() { 48 SkASSERT(this->hasValue()); 49 return fStatement->fPosition; 50 } 51 setPosition(Position pos)52 void setPosition(Position pos) { 53 SkASSERT(this->hasValue()); 54 fStatement->fPosition = pos; 55 } 56 hasValue()57 bool hasValue() { return fStatement != nullptr; } 58 release()59 std::unique_ptr<SkSL::Statement> release() { 60 SkASSERT(this->hasValue()); 61 return std::move(fStatement); 62 } 63 64 private: releaseIfPossible()65 std::unique_ptr<SkSL::Statement> releaseIfPossible() { 66 return std::move(fStatement); 67 } 68 69 std::unique_ptr<SkSL::Statement> fStatement; 70 71 friend class DSLCore; 72 friend class DSLWriter; 73 friend DSLStatement operator,(DSLStatement left, DSLStatement right); 74 }; 75 76 DSLStatement operator,(DSLStatement left, DSLStatement right); 77 78 } // namespace dsl 79 80 } // namespace SkSL 81 82 #endif 83