Home | History | Annotate | Download | only in lex
      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 
     17         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 
     28         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 
     41     DFAState()
     42     : fId(INVALID)
     43     , fLabel({}) {}
     44 
     45     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