/* * 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 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 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 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