aboutsummaryrefslogtreecommitdiff
path: root/src/deps/skia/include/sksl/DSLWrapper.h
blob: 96daa22dd8246eebea871a8cf3d80912293208dd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
 * 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