blob: f0a09a9596582df9f4a12995fa591c824e3fec78 [file] [log] [blame]
/*
* Copyright 2020 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SKSL_DSL_VAR
#define SKSL_DSL_VAR
#include "src/gpu/glsl/GrGLSLUniformHandler.h"
#include "src/sksl/SkSLString.h"
#include "src/sksl/dsl/DSLExpression.h"
namespace SkSL {
class Statement;
class Variable;
namespace dsl {
class DSLExpression;
class DSLModifiers;
class DSLType;
class DSLVar {
public:
DSLVar(const char* name);
DSLVar(DSLType type, const char* name = "var");
DSLVar(DSLModifiers modifiers, DSLType type, const char* name = "var");
DSLVar(DSLVar&&) = delete;
DSLExpression operator=(const DSLVar& var) {
return this->operator=(DSLExpression(var));
}
DSLExpression operator=(DSLExpression&& expr);
DSLExpression operator=(int expr) {
return this->operator=(DSLExpression(expr));
}
DSLExpression operator=(float expr) {
return this->operator=(DSLExpression(expr));
}
DSLExpression operator[](DSLExpression&& index);
DSLExpression operator++() {
return ++DSLExpression(*this);
}
DSLExpression operator++(int) {
return DSLExpression(*this)++;
}
private:
const SkSL::Variable* var() const;
const SkSL::String& name() const {
return fName;
}
GrGLSLUniformHandler::UniformHandle uniformHandle();
// this object owns the var until it is added to a symboltable
std::unique_ptr<SkSL::Variable> fOwnedVar;
const SkSL::Variable* fVar;
SkSL::String fName;
DSLExpression fInitialValue;
GrGLSLUniformHandler::UniformHandle fUniformHandle;
friend class DSLExpression;
friend class DSLFunction;
friend class DSLWriter;
friend DSLStatement Declare(DSLVar& var, DSLExpression initialValue);
friend DSLExpression operator+=(DSLVar& left, DSLExpression right);
friend DSLExpression operator-=(DSLVar& left, DSLExpression right);
friend DSLExpression operator*=(DSLVar& left, DSLExpression right);
friend DSLExpression operator/=(DSLVar& left, DSLExpression right);
friend DSLExpression operator%=(DSLVar& left, DSLExpression right);
friend DSLExpression operator<<=(DSLVar& left, DSLExpression right);
friend DSLExpression operator>>=(DSLVar& left, DSLExpression right);
friend DSLExpression operator&=(DSLVar& left, DSLExpression right);
friend DSLExpression operator|=(DSLVar& left, DSLExpression right);
friend DSLExpression operator^=(DSLVar& left, DSLExpression right);
};
} // namespace dsl
} // namespace SkSL
#endif