• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017 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_ENUM
9 #define SKSL_ENUM
10 
11 #include "src/sksl/ir/SkSLExpression.h"
12 #include "src/sksl/ir/SkSLProgramElement.h"
13 #include "src/sksl/ir/SkSLSymbolTable.h"
14 #include "src/sksl/ir/SkSLVariable.h"
15 
16 #include <algorithm>
17 #include <vector>
18 
19 namespace SkSL {
20 
21 struct Symbol;
22 
23 struct Enum : public ProgramElement {
EnumEnum24     Enum(int offset, StringFragment typeName, std::shared_ptr<SymbolTable> symbols)
25     : INHERITED(offset, kEnum_Kind)
26     , fTypeName(typeName)
27     , fSymbols(std::move(symbols)) {}
28 
cloneEnum29     std::unique_ptr<ProgramElement> clone() const override {
30         return std::unique_ptr<ProgramElement>(new Enum(fOffset, fTypeName, fSymbols));
31     }
32 
codeEnum33     String code() const {
34         String result = "enum class " + fTypeName + " {\n";
35         String separator;
36         std::vector<const Symbol*> sortedSymbols;
37         for (const auto& pair : *fSymbols) {
38             sortedSymbols.push_back(pair.second);
39         }
40         std::sort(sortedSymbols.begin(), sortedSymbols.end(),
41                   [](const Symbol* a, const Symbol* b) { return a->fName < b->fName; });
42         for (const auto& s : sortedSymbols) {
43             const Expression& initialValue = *((Variable*) s)->fInitialValue;
44             SkASSERT(initialValue.fKind == Expression::kIntLiteral_Kind);
45             result += separator + "    " + s->fName + " = " +
46                       to_string(((IntLiteral&) initialValue).fValue);
47             separator = ",\n";
48         }
49         result += "\n};";
50         return result;
51     }
52 
53 #ifdef SK_DEBUG
descriptionEnum54     String description() const override {
55         return this->code();
56     }
57 #endif
58 
59     bool fBuiltin = false;
60     const StringFragment fTypeName;
61     const std::shared_ptr<SymbolTable> fSymbols;
62 
63     typedef ProgramElement INHERITED;
64 };
65 
66 } // namespace
67 
68 #endif
69