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 "LexUtil.h"
12 
13 struct DFAState {
14     struct Label {
15         std::vector<int> fStates;
16 
LabelDFAState::Label17         Label(std::vector<int> states)
18         : fStates(std::move(states)) {}
19 
20         bool operator==(const Label& other) const {
21             return fStates == other.fStates;
22         }
23 
24         bool operator!=(const Label& other) const {
25             return !(*this == other);
26         }
27 
descriptionDFAState::Label28         std::string description() const {
29             std::string result = "<";
30             const char* separator = "";
31             for (int s : fStates) {
32                 result += separator;
33                 result += std::to_string(s);
34                 separator = ", ";
35             }
36             result += ">";
37             return result;
38         }
39     };
40 
DFAStateDFAState41     DFAState()
42     : fId(INVALID)
43     , fLabel({}) {}
44 
DFAStateDFAState45     DFAState(int id, Label label)
46     : fId(id)
47     , fLabel(std::move(label)) {}
48 
49     DFAState(const DFAState& other) = delete;
50 
51     int fId;
52 
53     Label fLabel;
54 
55     bool fIsScanned = false;
56 };
57 
58 namespace std {
59     template<> struct hash<DFAState::Label> {
60         size_t operator()(const DFAState::Label& s) const {
61             int result = 0;
62             for (int i : s.fStates) {
63                 result = result * 101 + i;
64             }
65             return result;
66         }
67     };
68 } // namespace
69 
70 #endif
71