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