• 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_DFASTATE
9 #define SKSL_DFASTATE
10 
11 #include "src/sksl/lex/LexUtil.h"
12 
13 #include <vector>
14 #include <string>
15 
16 struct DFAState {
17     struct Label {
18         std::vector<int> fStates;
19 
LabelDFAState::Label20         Label(std::vector<int> states)
21         : fStates(std::move(states)) {}
22 
23         bool operator==(const Label& other) const {
24             return fStates == other.fStates;
25         }
26 
27         bool operator!=(const Label& other) const {
28             return !(*this == other);
29         }
30 
31 #ifdef SK_DEBUG
descriptionDFAState::Label32         std::string description() const {
33             std::string result = "<";
34             const char* separator = "";
35             for (int s : fStates) {
36                 result += separator;
37                 result += std::to_string(s);
38                 separator = ", ";
39             }
40             result += ">";
41             return result;
42         }
43 #endif
44     };
45 
DFAStateDFAState46     DFAState()
47     : fId(INVALID)
48     , fLabel({}) {}
49 
DFAStateDFAState50     DFAState(int id, Label label)
51     : fId(id)
52     , fLabel(std::move(label)) {}
53 
54     DFAState(const DFAState& other) = delete;
55 
56     int fId;
57 
58     Label fLabel;
59 
60     bool fIsScanned = false;
61 };
62 
63 namespace std {
64     template<> struct hash<DFAState::Label> {
65         size_t operator()(const DFAState::Label& s) const {
66             size_t result = 0;
67             for (int i : s.fStates) {
68                 result = result * 101 + i;
69             }
70             return result;
71         }
72     };
73 } // namespace
74 
75 #endif
76