1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SKSL_MODIFIERS
9 #define SKSL_MODIFIERS
10 
11 #include "include/private/SkSLLayout.h"
12 
13 #include <vector>
14 
15 namespace SkSL {
16 
17 /**
18  * A set of modifier keywords (in, out, uniform, etc.) appearing before a declaration.
19  */
20 struct Modifiers {
21     enum Flag {
22         kNo_Flag             =       0,
23         kConst_Flag          = 1 <<  0,
24         kIn_Flag             = 1 <<  1,
25         kOut_Flag            = 1 <<  2,
26         kUniform_Flag        = 1 <<  3,
27         kFlat_Flag           = 1 <<  4,
28         kNoPerspective_Flag  = 1 <<  5,
29         kHasSideEffects_Flag = 1 <<  6,
30 
31         kInline_Flag         = 1 <<  8,
32         kNoInline_Flag       = 1 <<  9,
33     };
34 
ModifiersModifiers35     Modifiers()
36     : fLayout(Layout())
37     , fFlags(0) {}
38 
ModifiersModifiers39     Modifiers(const Layout& layout, int flags)
40     : fLayout(layout)
41     , fFlags(flags) {}
42 
descriptionModifiers43     String description() const {
44         String result = fLayout.description();
45         if (fFlags & kUniform_Flag) {
46             result += "uniform ";
47         }
48         if (fFlags & kConst_Flag) {
49             result += "const ";
50         }
51         if (fFlags & kFlat_Flag) {
52             result += "flat ";
53         }
54         if (fFlags & kNoPerspective_Flag) {
55             result += "noperspective ";
56         }
57         if (fFlags & kHasSideEffects_Flag) {
58             result += "sk_has_side_effects ";
59         }
60         if (fFlags & kNoInline_Flag) {
61             result += "noinline ";
62         }
63         if ((fFlags & kIn_Flag) && (fFlags & kOut_Flag)) {
64             result += "inout ";
65         } else if (fFlags & kIn_Flag) {
66             result += "in ";
67         } else if (fFlags & kOut_Flag) {
68             result += "out ";
69         }
70 
71         return result;
72     }
73 
74     bool operator==(const Modifiers& other) const {
75         return fLayout == other.fLayout && fFlags == other.fFlags;
76     }
77 
78     bool operator!=(const Modifiers& other) const {
79         return !(*this == other);
80     }
81 
82     Layout fLayout;
83     int fFlags;
84 };
85 
86 } // namespace SkSL
87 
88 namespace std {
89 
90 template <>
91 struct hash<SkSL::Modifiers> {
92     size_t operator()(const SkSL::Modifiers& key) const {
93         return (size_t) key.fFlags ^ ((size_t) key.fLayout.fFlags << 8) ^
94                ((size_t) key.fLayout.fBuiltin << 16);
95     }
96 };
97 
98 } // namespace std
99 
100 #endif
101