blob: 96daa22dd8246eebea871a8cf3d80912293208dd [file] [log] [blame]
/*
* Copyright 2021 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_WRAPPER
#define SKSL_DSL_WRAPPER
#include <memory>
namespace SkSL {
namespace dsl {
/**
* Several of the DSL classes override operator= in a non-standard fashion to allow for expressions
* like "x = 0" to compile into SkSL code. This makes it impossible to directly use these classes in
* C++ containers which expect standard behavior for operator=.
*
* Wrapper<T> contains a T, where T is a DSL class with non-standard operator=, and provides
* standard behavior for operator=, permitting it to be used in standard containers.
*/
template<typename T>
class DSLWrapper {
public:
DSLWrapper(T value) {
fValue.swap(value);
}
DSLWrapper(const DSLWrapper&) = delete;
DSLWrapper(DSLWrapper&& other) {
fValue.swap(other.fValue);
}
T& get() {
return fValue;
}
T& operator*() {
return fValue;
}
T* operator->() {
return &fValue;
}
const T& get() const {
return fValue;
}
const T& operator*() const {
return fValue;
}
const T* operator->() const {
return &fValue;
}
DSLWrapper& operator=(const DSLWrapper&) = delete;
DSLWrapper& operator=(DSLWrapper&& other) {
fValue.swap(other.fValue);
return *this;
}
private:
T fValue;
};
} // namespace dsl
} // namespace SkSL
#endif