skia2/include/sksl/DSLWrapper.h
Ethan Nicholas a1a0b92b04 Added DSLWrapper so DSL classes can be used in containers
This will be used by the upcoming DSLParser, which needs to be able to
put DSLExpression and DSLVar into containers such as std::vector and
std::optional.

Change-Id: I8d367cfd0b3a852a368c69a5b3be6c0eaa41d74a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/404156
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-05-04 17:19:35 +00:00

62 lines
1.3 KiB
C++

/*
* 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& operator*() {
return fValue;
}
T* operator->() {
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