Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2020 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_EXPRESSION |
| 9 | #define SKSL_DSL_EXPRESSION |
| 10 | |
| 11 | #include "include/core/SkTypes.h" |
Ethan Nicholas | daed259 | 2021-03-04 14:30:25 -0500 | [diff] [blame] | 12 | #include "include/sksl/DSLErrorHandling.h" |
Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 13 | |
| 14 | #include <cstdint> |
| 15 | #include <memory> |
| 16 | |
| 17 | namespace SkSL { |
| 18 | |
| 19 | class Expression; |
Ethan Nicholas | daed259 | 2021-03-04 14:30:25 -0500 | [diff] [blame] | 20 | class Type; |
Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 21 | |
| 22 | namespace dsl { |
| 23 | |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 24 | class DSLPossibleExpression; |
Ethan Nicholas | cfefec0 | 2021-02-09 15:22:57 -0500 | [diff] [blame] | 25 | class DSLStatement; |
Ethan Nicholas | bffe80a | 2021-01-11 15:42:44 -0500 | [diff] [blame] | 26 | class DSLVar; |
Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 27 | |
| 28 | /** |
| 29 | * Represents an expression such as 'cos(x)' or 'a + b'. |
| 30 | */ |
| 31 | class DSLExpression { |
| 32 | public: |
| 33 | DSLExpression(const DSLExpression&) = delete; |
| 34 | |
Ethan Nicholas | daed259 | 2021-03-04 14:30:25 -0500 | [diff] [blame] | 35 | DSLExpression(DSLExpression&&); |
Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 36 | |
| 37 | DSLExpression(); |
| 38 | |
| 39 | /** |
| 40 | * Creates an expression representing a literal float. |
| 41 | */ |
| 42 | DSLExpression(float value); |
| 43 | |
| 44 | /** |
| 45 | * Creates an expression representing a literal float. |
| 46 | */ |
| 47 | DSLExpression(double value) |
| 48 | : DSLExpression((float) value) {} |
| 49 | |
| 50 | /** |
| 51 | * Creates an expression representing a literal int. |
| 52 | */ |
| 53 | DSLExpression(int value); |
| 54 | |
| 55 | /** |
| 56 | * Creates an expression representing a literal bool. |
| 57 | */ |
| 58 | DSLExpression(bool value); |
| 59 | |
Ethan Nicholas | bffe80a | 2021-01-11 15:42:44 -0500 | [diff] [blame] | 60 | /** |
| 61 | * Creates an expression representing a variable reference. |
| 62 | */ |
Ethan Nicholas | 707d315 | 2021-03-25 17:49:08 -0400 | [diff] [blame] | 63 | DSLExpression(DSLVar& var); |
| 64 | |
| 65 | DSLExpression(DSLVar&& var); |
Ethan Nicholas | bffe80a | 2021-01-11 15:42:44 -0500 | [diff] [blame] | 66 | |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 67 | DSLExpression(DSLPossibleExpression expr, PositionInfo pos = PositionInfo()); |
| 68 | |
Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 69 | ~DSLExpression(); |
| 70 | |
| 71 | /** |
Ethan Nicholas | 92969f2 | 2021-01-13 10:38:59 -0500 | [diff] [blame] | 72 | * Overloads the '=' operator to create an SkSL assignment statement. |
| 73 | */ |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 74 | DSLPossibleExpression operator=(DSLExpression other); |
Ethan Nicholas | 92969f2 | 2021-01-13 10:38:59 -0500 | [diff] [blame] | 75 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 76 | DSLExpression x(PositionInfo pos = PositionInfo()); |
Ethan Nicholas | 68c77d4 | 2021-01-26 14:31:29 -0500 | [diff] [blame] | 77 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 78 | DSLExpression y(PositionInfo pos = PositionInfo()); |
Ethan Nicholas | 68c77d4 | 2021-01-26 14:31:29 -0500 | [diff] [blame] | 79 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 80 | DSLExpression z(PositionInfo pos = PositionInfo()); |
Ethan Nicholas | 68c77d4 | 2021-01-26 14:31:29 -0500 | [diff] [blame] | 81 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 82 | DSLExpression w(PositionInfo pos = PositionInfo()); |
Ethan Nicholas | 68c77d4 | 2021-01-26 14:31:29 -0500 | [diff] [blame] | 83 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 84 | DSLExpression r(PositionInfo pos = PositionInfo()); |
Ethan Nicholas | 68c77d4 | 2021-01-26 14:31:29 -0500 | [diff] [blame] | 85 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 86 | DSLExpression g(PositionInfo pos = PositionInfo()); |
Ethan Nicholas | 68c77d4 | 2021-01-26 14:31:29 -0500 | [diff] [blame] | 87 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 88 | DSLExpression b(PositionInfo pos = PositionInfo()); |
Ethan Nicholas | 68c77d4 | 2021-01-26 14:31:29 -0500 | [diff] [blame] | 89 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 90 | DSLExpression a(PositionInfo pos = PositionInfo()); |
Ethan Nicholas | 68c77d4 | 2021-01-26 14:31:29 -0500 | [diff] [blame] | 91 | |
Ethan Nicholas | 92969f2 | 2021-01-13 10:38:59 -0500 | [diff] [blame] | 92 | /** |
Ethan Nicholas | bf79dff | 2021-02-11 15:18:31 -0500 | [diff] [blame] | 93 | * Creates an SkSL struct field access expression. |
| 94 | */ |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 95 | DSLExpression field(const char* name, PositionInfo pos = PositionInfo()); |
Ethan Nicholas | bf79dff | 2021-02-11 15:18:31 -0500 | [diff] [blame] | 96 | |
| 97 | /** |
Ethan Nicholas | 04be339 | 2021-01-26 10:07:01 -0500 | [diff] [blame] | 98 | * Creates an SkSL array index expression. |
| 99 | */ |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 100 | DSLPossibleExpression operator[](DSLExpression index); |
Ethan Nicholas | 04be339 | 2021-01-26 10:07:01 -0500 | [diff] [blame] | 101 | |
| 102 | /** |
Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 103 | * Invalidates this object and returns the SkSL expression it represents. |
| 104 | */ |
| 105 | std::unique_ptr<SkSL::Expression> release(); |
| 106 | |
| 107 | private: |
| 108 | DSLExpression(std::unique_ptr<SkSL::Expression> expression); |
| 109 | |
Ethan Nicholas | 92969f2 | 2021-01-13 10:38:59 -0500 | [diff] [blame] | 110 | /** |
| 111 | * Invalidates this object and returns the SkSL expression it represents coerced to the |
| 112 | * specified type. If the expression cannot be coerced, reports an error and returns null. |
| 113 | */ |
| 114 | std::unique_ptr<SkSL::Expression> coerceAndRelease(const SkSL::Type& type); |
| 115 | |
Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 116 | std::unique_ptr<SkSL::Expression> fExpression; |
| 117 | |
Ethan Nicholas | 840f581 | 2021-02-16 13:02:57 -0500 | [diff] [blame] | 118 | friend DSLExpression SampleChild(int index, DSLExpression coords); |
| 119 | |
Ethan Nicholas | d6b6f3e | 2021-01-22 15:18:25 -0500 | [diff] [blame] | 120 | friend class DSLCore; |
Ethan Nicholas | 63f75fc | 2021-02-23 12:05:49 -0500 | [diff] [blame] | 121 | friend class DSLFunction; |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 122 | friend class DSLPossibleExpression; |
Ethan Nicholas | 92969f2 | 2021-01-13 10:38:59 -0500 | [diff] [blame] | 123 | friend class DSLVar; |
Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 124 | friend class DSLWriter; |
| 125 | }; |
| 126 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 127 | DSLPossibleExpression operator+(DSLExpression left, DSLExpression right); |
Ethan Nicholas | b14b636 | 2021-03-08 17:07:58 -0500 | [diff] [blame] | 128 | DSLPossibleExpression operator+(DSLExpression expr); |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 129 | DSLPossibleExpression operator+=(DSLExpression left, DSLExpression right); |
| 130 | DSLPossibleExpression operator-(DSLExpression left, DSLExpression right); |
Ethan Nicholas | b14b636 | 2021-03-08 17:07:58 -0500 | [diff] [blame] | 131 | DSLPossibleExpression operator-(DSLExpression expr); |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 132 | DSLPossibleExpression operator-=(DSLExpression left, DSLExpression right); |
| 133 | DSLPossibleExpression operator*(DSLExpression left, DSLExpression right); |
| 134 | DSLPossibleExpression operator*=(DSLExpression left, DSLExpression right); |
| 135 | DSLPossibleExpression operator/(DSLExpression left, DSLExpression right); |
| 136 | DSLPossibleExpression operator/=(DSLExpression left, DSLExpression right); |
| 137 | DSLPossibleExpression operator%(DSLExpression left, DSLExpression right); |
| 138 | DSLPossibleExpression operator%=(DSLExpression left, DSLExpression right); |
| 139 | DSLPossibleExpression operator<<(DSLExpression left, DSLExpression right); |
| 140 | DSLPossibleExpression operator<<=(DSLExpression left, DSLExpression right); |
| 141 | DSLPossibleExpression operator>>(DSLExpression left, DSLExpression right); |
| 142 | DSLPossibleExpression operator>>=(DSLExpression left, DSLExpression right); |
| 143 | DSLPossibleExpression operator&&(DSLExpression left, DSLExpression right); |
| 144 | DSLPossibleExpression operator||(DSLExpression left, DSLExpression right); |
| 145 | DSLPossibleExpression operator&(DSLExpression left, DSLExpression right); |
| 146 | DSLPossibleExpression operator&=(DSLExpression left, DSLExpression right); |
| 147 | DSLPossibleExpression operator|(DSLExpression left, DSLExpression right); |
| 148 | DSLPossibleExpression operator|=(DSLExpression left, DSLExpression right); |
| 149 | DSLPossibleExpression operator^(DSLExpression left, DSLExpression right); |
| 150 | DSLPossibleExpression operator^=(DSLExpression left, DSLExpression right); |
| 151 | DSLPossibleExpression operator,(DSLExpression left, DSLExpression right); |
Ethan Nicholas | db2326b | 2021-04-19 10:55:18 -0400 | [diff] [blame^] | 152 | DSLPossibleExpression operator,(DSLPossibleExpression left, DSLExpression right); |
| 153 | DSLPossibleExpression operator,(DSLExpression left, DSLPossibleExpression right); |
| 154 | DSLPossibleExpression operator,(DSLPossibleExpression left, DSLPossibleExpression right); |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 155 | DSLPossibleExpression operator==(DSLExpression left, DSLExpression right); |
| 156 | DSLPossibleExpression operator!=(DSLExpression left, DSLExpression right); |
| 157 | DSLPossibleExpression operator>(DSLExpression left, DSLExpression right); |
| 158 | DSLPossibleExpression operator<(DSLExpression left, DSLExpression right); |
| 159 | DSLPossibleExpression operator>=(DSLExpression left, DSLExpression right); |
| 160 | DSLPossibleExpression operator<=(DSLExpression left, DSLExpression right); |
| 161 | DSLPossibleExpression operator!(DSLExpression expr); |
| 162 | DSLPossibleExpression operator~(DSLExpression expr); |
| 163 | DSLPossibleExpression operator++(DSLExpression expr); |
| 164 | DSLPossibleExpression operator++(DSLExpression expr, int); |
| 165 | DSLPossibleExpression operator--(DSLExpression expr); |
| 166 | DSLPossibleExpression operator--(DSLExpression expr, int); |
Ethan Nicholas | 92969f2 | 2021-01-13 10:38:59 -0500 | [diff] [blame] | 167 | |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 168 | /** |
| 169 | * Represents an Expression which may have failed and/or have pending errors to report. Converting a |
| 170 | * PossibleExpression into an Expression requires PositionInfo so that any pending errors can be |
| 171 | * reported at the correct position. |
| 172 | * |
| 173 | * PossibleExpression is used instead of Expression in situations where it is not possible to |
| 174 | * capture the PositionInfo at the time of Expression construction (notably in operator overloads, |
| 175 | * where we cannot add default parameters). |
| 176 | */ |
| 177 | class DSLPossibleExpression { |
| 178 | public: |
| 179 | DSLPossibleExpression(std::unique_ptr<SkSL::Expression> expression); |
| 180 | |
Ethan Nicholas | daed259 | 2021-03-04 14:30:25 -0500 | [diff] [blame] | 181 | DSLPossibleExpression(DSLPossibleExpression&& other); |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 182 | |
| 183 | ~DSLPossibleExpression(); |
| 184 | |
| 185 | DSLExpression x(PositionInfo pos = PositionInfo()); |
| 186 | |
| 187 | DSLExpression y(PositionInfo pos = PositionInfo()); |
| 188 | |
| 189 | DSLExpression z(PositionInfo pos = PositionInfo()); |
| 190 | |
| 191 | DSLExpression w(PositionInfo pos = PositionInfo()); |
| 192 | |
| 193 | DSLExpression r(PositionInfo pos = PositionInfo()); |
| 194 | |
| 195 | DSLExpression g(PositionInfo pos = PositionInfo()); |
| 196 | |
| 197 | DSLExpression b(PositionInfo pos = PositionInfo()); |
| 198 | |
| 199 | DSLExpression a(PositionInfo pos = PositionInfo()); |
| 200 | |
| 201 | DSLExpression field(const char* name, PositionInfo pos = PositionInfo()); |
| 202 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 203 | DSLPossibleExpression operator=(DSLExpression expr); |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 204 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 205 | DSLPossibleExpression operator=(int expr); |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 206 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 207 | DSLPossibleExpression operator=(float expr); |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 208 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 209 | DSLPossibleExpression operator[](DSLExpression index); |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 210 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 211 | DSLPossibleExpression operator++(); |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 212 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 213 | DSLPossibleExpression operator++(int); |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 214 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 215 | DSLPossibleExpression operator--(); |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 216 | |
Ethan Nicholas | 34c7e11 | 2021-02-25 20:50:32 -0500 | [diff] [blame] | 217 | DSLPossibleExpression operator--(int); |
Ethan Nicholas | b956304 | 2021-02-25 09:45:49 -0500 | [diff] [blame] | 218 | |
| 219 | std::unique_ptr<SkSL::Expression> release(); |
| 220 | |
| 221 | private: |
| 222 | std::unique_ptr<SkSL::Expression> fExpression; |
| 223 | |
| 224 | friend class DSLExpression; |
| 225 | }; |
| 226 | |
Ethan Nicholas | 9504614 | 2021-01-07 10:57:27 -0500 | [diff] [blame] | 227 | } // namespace dsl |
| 228 | |
| 229 | } // namespace SkSL |
| 230 | |
| 231 | #endif |