blob: 4271e145577377dda3de59a6a4f658c447aac1c9 [file] [log] [blame]
Ethan Nicholas95046142021-01-07 10:57:27 -05001/*
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 Nicholasdaed2592021-03-04 14:30:25 -050012#include "include/sksl/DSLErrorHandling.h"
Ethan Nicholas95046142021-01-07 10:57:27 -050013
14#include <cstdint>
15#include <memory>
16
17namespace SkSL {
18
19class Expression;
Ethan Nicholasdaed2592021-03-04 14:30:25 -050020class Type;
Ethan Nicholas95046142021-01-07 10:57:27 -050021
22namespace dsl {
23
Ethan Nicholasb9563042021-02-25 09:45:49 -050024class DSLPossibleExpression;
Ethan Nicholascfefec02021-02-09 15:22:57 -050025class DSLStatement;
Ethan Nicholasbffe80a2021-01-11 15:42:44 -050026class DSLVar;
Ethan Nicholas95046142021-01-07 10:57:27 -050027
28/**
29 * Represents an expression such as 'cos(x)' or 'a + b'.
30 */
31class DSLExpression {
32public:
33 DSLExpression(const DSLExpression&) = delete;
34
Ethan Nicholasdaed2592021-03-04 14:30:25 -050035 DSLExpression(DSLExpression&&);
Ethan Nicholas95046142021-01-07 10:57:27 -050036
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 Nicholasbffe80a2021-01-11 15:42:44 -050060 /**
61 * Creates an expression representing a variable reference.
62 */
Ethan Nicholas707d3152021-03-25 17:49:08 -040063 DSLExpression(DSLVar& var);
64
65 DSLExpression(DSLVar&& var);
Ethan Nicholasbffe80a2021-01-11 15:42:44 -050066
Ethan Nicholasb9563042021-02-25 09:45:49 -050067 DSLExpression(DSLPossibleExpression expr, PositionInfo pos = PositionInfo());
68
Ethan Nicholas95046142021-01-07 10:57:27 -050069 ~DSLExpression();
70
71 /**
Ethan Nicholas92969f22021-01-13 10:38:59 -050072 * Overloads the '=' operator to create an SkSL assignment statement.
73 */
Ethan Nicholas34c7e112021-02-25 20:50:32 -050074 DSLPossibleExpression operator=(DSLExpression other);
Ethan Nicholas92969f22021-01-13 10:38:59 -050075
Ethan Nicholas34c7e112021-02-25 20:50:32 -050076 DSLExpression x(PositionInfo pos = PositionInfo());
Ethan Nicholas68c77d42021-01-26 14:31:29 -050077
Ethan Nicholas34c7e112021-02-25 20:50:32 -050078 DSLExpression y(PositionInfo pos = PositionInfo());
Ethan Nicholas68c77d42021-01-26 14:31:29 -050079
Ethan Nicholas34c7e112021-02-25 20:50:32 -050080 DSLExpression z(PositionInfo pos = PositionInfo());
Ethan Nicholas68c77d42021-01-26 14:31:29 -050081
Ethan Nicholas34c7e112021-02-25 20:50:32 -050082 DSLExpression w(PositionInfo pos = PositionInfo());
Ethan Nicholas68c77d42021-01-26 14:31:29 -050083
Ethan Nicholas34c7e112021-02-25 20:50:32 -050084 DSLExpression r(PositionInfo pos = PositionInfo());
Ethan Nicholas68c77d42021-01-26 14:31:29 -050085
Ethan Nicholas34c7e112021-02-25 20:50:32 -050086 DSLExpression g(PositionInfo pos = PositionInfo());
Ethan Nicholas68c77d42021-01-26 14:31:29 -050087
Ethan Nicholas34c7e112021-02-25 20:50:32 -050088 DSLExpression b(PositionInfo pos = PositionInfo());
Ethan Nicholas68c77d42021-01-26 14:31:29 -050089
Ethan Nicholas34c7e112021-02-25 20:50:32 -050090 DSLExpression a(PositionInfo pos = PositionInfo());
Ethan Nicholas68c77d42021-01-26 14:31:29 -050091
Ethan Nicholas92969f22021-01-13 10:38:59 -050092 /**
Ethan Nicholasbf79dff2021-02-11 15:18:31 -050093 * Creates an SkSL struct field access expression.
94 */
Ethan Nicholas34c7e112021-02-25 20:50:32 -050095 DSLExpression field(const char* name, PositionInfo pos = PositionInfo());
Ethan Nicholasbf79dff2021-02-11 15:18:31 -050096
97 /**
Ethan Nicholas04be3392021-01-26 10:07:01 -050098 * Creates an SkSL array index expression.
99 */
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500100 DSLPossibleExpression operator[](DSLExpression index);
Ethan Nicholas04be3392021-01-26 10:07:01 -0500101
102 /**
Ethan Nicholas95046142021-01-07 10:57:27 -0500103 * Invalidates this object and returns the SkSL expression it represents.
104 */
105 std::unique_ptr<SkSL::Expression> release();
106
107private:
108 DSLExpression(std::unique_ptr<SkSL::Expression> expression);
109
Ethan Nicholas92969f22021-01-13 10:38:59 -0500110 /**
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 Nicholas95046142021-01-07 10:57:27 -0500116 std::unique_ptr<SkSL::Expression> fExpression;
117
Ethan Nicholas840f5812021-02-16 13:02:57 -0500118 friend DSLExpression SampleChild(int index, DSLExpression coords);
119
Ethan Nicholasd6b6f3e2021-01-22 15:18:25 -0500120 friend class DSLCore;
Ethan Nicholas63f75fc2021-02-23 12:05:49 -0500121 friend class DSLFunction;
Ethan Nicholasb9563042021-02-25 09:45:49 -0500122 friend class DSLPossibleExpression;
Ethan Nicholas92969f22021-01-13 10:38:59 -0500123 friend class DSLVar;
Ethan Nicholas95046142021-01-07 10:57:27 -0500124 friend class DSLWriter;
125};
126
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500127DSLPossibleExpression operator+(DSLExpression left, DSLExpression right);
Ethan Nicholasb14b6362021-03-08 17:07:58 -0500128DSLPossibleExpression operator+(DSLExpression expr);
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500129DSLPossibleExpression operator+=(DSLExpression left, DSLExpression right);
130DSLPossibleExpression operator-(DSLExpression left, DSLExpression right);
Ethan Nicholasb14b6362021-03-08 17:07:58 -0500131DSLPossibleExpression operator-(DSLExpression expr);
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500132DSLPossibleExpression operator-=(DSLExpression left, DSLExpression right);
133DSLPossibleExpression operator*(DSLExpression left, DSLExpression right);
134DSLPossibleExpression operator*=(DSLExpression left, DSLExpression right);
135DSLPossibleExpression operator/(DSLExpression left, DSLExpression right);
136DSLPossibleExpression operator/=(DSLExpression left, DSLExpression right);
137DSLPossibleExpression operator%(DSLExpression left, DSLExpression right);
138DSLPossibleExpression operator%=(DSLExpression left, DSLExpression right);
139DSLPossibleExpression operator<<(DSLExpression left, DSLExpression right);
140DSLPossibleExpression operator<<=(DSLExpression left, DSLExpression right);
141DSLPossibleExpression operator>>(DSLExpression left, DSLExpression right);
142DSLPossibleExpression operator>>=(DSLExpression left, DSLExpression right);
143DSLPossibleExpression operator&&(DSLExpression left, DSLExpression right);
144DSLPossibleExpression operator||(DSLExpression left, DSLExpression right);
145DSLPossibleExpression operator&(DSLExpression left, DSLExpression right);
146DSLPossibleExpression operator&=(DSLExpression left, DSLExpression right);
147DSLPossibleExpression operator|(DSLExpression left, DSLExpression right);
148DSLPossibleExpression operator|=(DSLExpression left, DSLExpression right);
149DSLPossibleExpression operator^(DSLExpression left, DSLExpression right);
150DSLPossibleExpression operator^=(DSLExpression left, DSLExpression right);
151DSLPossibleExpression operator,(DSLExpression left, DSLExpression right);
Ethan Nicholasdb2326b2021-04-19 10:55:18 -0400152DSLPossibleExpression operator,(DSLPossibleExpression left, DSLExpression right);
153DSLPossibleExpression operator,(DSLExpression left, DSLPossibleExpression right);
154DSLPossibleExpression operator,(DSLPossibleExpression left, DSLPossibleExpression right);
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500155DSLPossibleExpression operator==(DSLExpression left, DSLExpression right);
156DSLPossibleExpression operator!=(DSLExpression left, DSLExpression right);
157DSLPossibleExpression operator>(DSLExpression left, DSLExpression right);
158DSLPossibleExpression operator<(DSLExpression left, DSLExpression right);
159DSLPossibleExpression operator>=(DSLExpression left, DSLExpression right);
160DSLPossibleExpression operator<=(DSLExpression left, DSLExpression right);
161DSLPossibleExpression operator!(DSLExpression expr);
162DSLPossibleExpression operator~(DSLExpression expr);
163DSLPossibleExpression operator++(DSLExpression expr);
164DSLPossibleExpression operator++(DSLExpression expr, int);
165DSLPossibleExpression operator--(DSLExpression expr);
166DSLPossibleExpression operator--(DSLExpression expr, int);
Ethan Nicholas92969f22021-01-13 10:38:59 -0500167
Ethan Nicholasb9563042021-02-25 09:45:49 -0500168/**
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 */
177class DSLPossibleExpression {
178public:
179 DSLPossibleExpression(std::unique_ptr<SkSL::Expression> expression);
180
Ethan Nicholasdaed2592021-03-04 14:30:25 -0500181 DSLPossibleExpression(DSLPossibleExpression&& other);
Ethan Nicholasb9563042021-02-25 09:45:49 -0500182
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 Nicholas34c7e112021-02-25 20:50:32 -0500203 DSLPossibleExpression operator=(DSLExpression expr);
Ethan Nicholasb9563042021-02-25 09:45:49 -0500204
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500205 DSLPossibleExpression operator=(int expr);
Ethan Nicholasb9563042021-02-25 09:45:49 -0500206
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500207 DSLPossibleExpression operator=(float expr);
Ethan Nicholasb9563042021-02-25 09:45:49 -0500208
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500209 DSLPossibleExpression operator[](DSLExpression index);
Ethan Nicholasb9563042021-02-25 09:45:49 -0500210
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500211 DSLPossibleExpression operator++();
Ethan Nicholasb9563042021-02-25 09:45:49 -0500212
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500213 DSLPossibleExpression operator++(int);
Ethan Nicholasb9563042021-02-25 09:45:49 -0500214
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500215 DSLPossibleExpression operator--();
Ethan Nicholasb9563042021-02-25 09:45:49 -0500216
Ethan Nicholas34c7e112021-02-25 20:50:32 -0500217 DSLPossibleExpression operator--(int);
Ethan Nicholasb9563042021-02-25 09:45:49 -0500218
219 std::unique_ptr<SkSL::Expression> release();
220
221private:
222 std::unique_ptr<SkSL::Expression> fExpression;
223
224 friend class DSLExpression;
225};
226
Ethan Nicholas95046142021-01-07 10:57:27 -0500227} // namespace dsl
228
229} // namespace SkSL
230
231#endif